关于linux 0.11 setup
首先,bootsect引导部分和setup初始化部分仅在系统加载初始期间使用,系统正常运行过程中这两块是不需要的,因此放在0x90000之后,用于加载完毕就舍弃的位置(内核可以随便使用);那么bootsect引导将setup(引导扇区后的4个扇区)加载到了0x90200后(也占据了4个扇区),又将Image中setup后的system内核部分加载到了0x10000-0x40000部分,内核在之后的使用过程中是直接从0x0起始的,这样就使逻辑地址、线性地址以及物理地址在内核程序中这三者是一致的,而之所以bootsect不直接将system放置在0x0起始位置,是因为BIOS初始化过程中将中断表放在了此处,而setup的初始化过程需要用到BIOS中断程序,这也是在setup最后部分见0x10000到0x40000部分程序复制到0x0位置的原因;
那么bootsect将控制流交给了setup后,就开始使用BIOS中断进行参数提取,此处参数在之后用到在提;
提取完毕参数后首先设置了禁止中断,放置初始化异常,接着将0x10000 -- 0x90000部分数据移动到0x0000位置(对于Linux 0.11的话,应该只需要0x10000 -- 0x40000即可);移动完毕后就设置idt表和gdt表,这两个表的设置是为了切换到分段模式进行准备工作;由于历史问题,实模式下默认只能访问1M以内的空间,对于1M以上的空间,采用回环的方式折返到1M空间以下,而如果想要访问1M以上的空间,就需要使能A20线;
然后初始化8259中断控制器芯片,将级联的IRQ0-IRQ15映射中断号设置为0x20 -- 0x2F,接着屏蔽所有中断控制器中的中断请求,关于中断屏蔽,这里有两层的屏蔽层,一个是cpu的EFLAG中的中断屏蔽,一个是中断控制器本身的寄存器对中断的屏蔽,bootsect中设置了前者屏蔽避免受到中断影响,此处是由于还没有设置好中断向量表所以关闭中断,经过以上初始化操作后,然后切换到保护模式,开启内存分段;
由于开启了分段,jmpi 0,8中,此时的8为段选择符,对应的段描述符为GDT的第1个段描述符,对应的段基址为0x0,段限长为8Mb;这里就是直接将控制流移交到system首位置;依据makefile的链接命令,该位置为head.s汇编文件,当然具体的链接过程和编译器有关,这方面的不太懂;

浙公网安备 33010602011771号