head.s分析
//head.s采用的是AT&T的汇编格式
//使用GNU的gas和gld编译连接
//位置:物理地址0
//功能:1、加载各个数据段寄存器,设置256项中断描述符表idt,并使各个表项都指向错误的哑中断。
2、设置全局中断向量表gdt
3、比较物理地址0和1MB的内容比较判断是否开启了A20的地址线,没开启就进入死循环。
4、检查是否有协处理器,设置控制寄存器CR0。
5、开始设置内存的页处理机制,页目录表(4K)放在物理地址0开始的地方,4个页表放在后面的16k地址,共可以寻址16m空间。
6、利用返回指令将预先设置的init/main.c的入口地址弹出。
下面是详细的分析过程
/*
* linux/boot/head.s
*
* (C) 1991 Linus Torvalds
*/
/*
* head.s contains the 32-bit startup code.
*
* NOTE!!! Startup happens at absolute address 0x00000000, which is also where
* the page directory will exist. The startup code will be overwritten by
* the page directory.
*/
.text
.globl _idt,_gdt,_pg_dir,_tmp_floppy_area
_pg_dir: //页目录表的地址0x0000
startup_32:
movl $0x10,