head.s是紧接着setup.s执行的,为什么叫head.s呢,因为它之前被setup.s从0x1000:0000搬运至0x0000:0000,正好放在在内存的起始位置。
启动流程3(head.s)
1.填充IDT表,所有表项都指向函数,此函数只打印"Unknown interrupt\n\r",不做任何其他操作
2.重新配置全局描述符寄存器(GDTR),即更换GDT表。
3.重新设置堆栈sp=&user_stack[],ss=0x10
4.判断A20 line是否真的ready
5.判断协处理器是否存在,如果不存在,CR0相应位置1
6.将c程序入口的main函数需要的参数入栈,以及main函数的地址入栈。
7.填充1个页表目录(放在0x0000:0000),4个页表(一个4KByte大小,地址分别为0x1000:0000,0x2000:0000,0x3000:0000,0x4000:0000),从最高地址开始页表内容为0xfff007,每项递减0x1000,直到填满所有页表项,为后面启动CPU的内存分页管理功能做好准备。总共可以访问 =1页目录×4页表×1024页表项×4K(页内偏移)=16M的内存。
8.设置CR3指向页目录表,设置CR0 |= 0x80000000h,启动分页处理
9.RET跳转至main()函数,开始c语言的征程。
head.s主要工作:
1.填充idt表,指向无用函数igonre_int,后续程序会对其做真的初始化。
2.重新配置gdt表。
3.设置页表,页目录,打开CPU的内存分页功能,为后面内存管理做准备。
4.跳转至main(),开始c语言之旅。