Linux 0.11内核之旅(三) :head.s

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语言之旅。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值