[Linux内核完全剖析]第四章总结

第四章

本章主要讲述了IA32架构下的段页管理以及中断异常和任务的切换等基础知识。要点多,理解难度大。

要点1: 段描述符和门描述符的格式
要点2: 段选择和切换的时候进行的权限验证
要点3: 页目录和页表的格式以及权限设置
要点5: CR0-CR3 GTDR ITDR LTDR TR EFLAG寄存器在保护模式下的作用
要点6: 操作系统加载和初始化时必须设置好保护模式下使用的数据结构如下:
保护模式的IDT,GDT,TSS,LDT;
若开启分页,则最少设置一个页目录和一个页表;
处理器切换到保护模式下运行的代码段,含有终端和异常处理程序的代码模块;
GDTR,IDTR,CR1,CR2,CR3.

问题1: "因为中断和异常向量没有RPL,所以在调用中断或者异常处理过程时不会检查RPL。"(4.6.9 P117)虽然向量没有RPL,但是向量可以定位一个门描述符,门描述符中的段选择符是有RPL的,难道就不检查这个RPL么?
回答:中断和异常处理是调用门的一种特殊分类,在调用门中,调用门描述符中的段选择符的RPL是不检查的(清零),所以这里也不检查。

问题2:在使用从oldlinux网站上下载的bochs配置文件引导第四章的内核示例时,会产生错误要怎么修改(版本4.7.2)。
当载入文件的时候会提示 directive ‘floppy_command_delay’ not understood ,我查了它的man手册,发现这个版本的bochs不再提供floppy_command_delay选项,于是在配置文件中把这句注释掉。
然后再次载入配置文件,运行,提示 System BIOS must end at 0xfffff 。在网上查找了一下发现这个也是老版本遗留的问题,因为老版本的BIOS大小为64KB的,所以我们要手工指定一个0xf0000的入口点(超过64K了)。但是2.2.5版本以后支持到512K,所以就不需要手工指定。然后在配置文件中把romimage:那句后面的", address=0xf0000"去掉保存即可正常启动。
其实这还是麻烦了,用Vitrualbox把做好的软盘镜像挂在上去就直接可以看到效果。
顺便说一下用truncate -s 1474560 Image就可以即可把编译出来的Image文件做成1.4M的软盘映像了

疏漏与勘误1: "CPU会使用CS寄存器中选择符中的RPL资源来确定是否要求返回到低特权等级"(4.5.3.5 P108)这句话让人莫名其妙,应该改成"CPU会使用调用者的CS寄存器(保存在当前栈)中选择符中的RPL资源来确定是否要求返回到低特权等级"。
疏漏与勘误2: "表4-9 异常和中断的优先级"(4.6.6 P113)中第5级 外部中断:NMI终端、可屏蔽硬件中断 是对于486或者更早CPU生效。486以后的CPU把可屏蔽的硬件中断降低为第6级。
疏漏与勘误3: "表4-10 任务切换对忙标志、NT标志、前一任务链字段和TS标志的影响"(4.7.5 P127)IRET 对老任务忙标志B 影响是设置标志。错误,应该改成清除标志。

——————————————————————————————————————————————————

由于刚开始写总结,内容还不是很全,以后会把格式固定下来。

想到笑话一篇

1、某Windows程序员想转Unix/Linux下的系统开发工作,问某Unix资深黑客:Unix系统开发起来难么,我看没有在Windows下做开发的人多阿。这位黑客回答到:连Windows那么繁琐又复杂的机制你都搞懂了,还怕以简洁著称的Unix么。

 

X86的复杂机制配合windows,果然不愧是Wintel联盟 –!

This entry was posted in 操作系统 and tagged . Bookmark the permalink.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注