续上篇博客Linux内核完全注释:第三章 内核引导启动程序-setup.s讲解
功能描述
head.s编译后,被连接成system模块的最前面开始部分。这部分采用AT&T格式编写,赋值方向与之前相反首先加载各个段寄存器,重新设置中断描述符表,共256项,并使各个表项均指向一个只报错误的哑中断程序。重新设置全局描述符表,对比物理地址0与1M开始处的内容是否相同,如果相同那么没有开启A20地址线,进入死循环。测试PC机是否含有数据协处理器芯片,并在控制寄存器CR0中设置相应的标志位设置管理内存的分页处理机制,将页目录表放在绝对物理地址0开始处。紧随其后放置共可寻址16MB内存的4个页表,并分别设置它们的表项。最后利用返回指令将预先放置在堆栈中的/init/main.c程序的入口地址弹出,运行main()程序。
源码解析
程序开始的数据、符号声明部分:
/*
* 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:
.globl startup_32
这里需要注意的是:pg_dir,这是页表目录地址,后面会用到。
程序开始部分,设置寄存器值。
startup_32:
movl $0x10,