Linux 0.11内核之旅(二) :setup.s

本文记录setup.s ,它紧接着bootsect.s,继续执行。

 

启动流程2(setup.s)

1.打印 msg = " Now we are in setup"

 

2.调用BIOS中断,获取光标位置存入 0x9000:0000

                                  获取内存大小存入 0x9000:0002

                                  获取显卡参数存入 0x9000:0004

                                  获取显卡模式存入 0x9000:0006

                                  获取EGA/VGA的一些参数存入 0x9000:0008, 0x9000:0010, 0x9000:0012

 

3.将中断向量表[41]的值(也即hd0参数表)给si,

    将0x0000:si 搬运到 0x9000:0080[长度 10 Byte]

    将中断向量表[46]的值(也即hd1参数表)给si,

    将0x0000:si 搬运到 0x9000:0090[长度 10 Byte]

 

 

4.调用BIOS中断,显示光标,打印9000:0082处的值(长度 4 Byte)

                                                     打印9000:008e处的值(长度 4 Byte)

 

5.判断hd1是否真的存在,如果不存在,0x9000:0090清零(长度 10 Byte)

 

6.禁止中断

 

7.将0x1000:0000(head.s+kernel代码) 搬至 0x0000:0000 (长度 0x8000:0000), 因此BOIS创建的中断向量表(IDT)也被覆盖掉。

 

8.重新设置IDT的位置,设置中断向量表寄存器(IDTR)=(0,0),起始地址为0x0000:0000。长度限制0x0。

 

9.重新设置GDT的位置,设置全局描述符寄存器(GDTR)=(0x800,9000:gdt+512),起始地址为9000:gdt+512。长度限制0x800。

 

10.打开A20 Line, 以确保内存可以访问16MB的大小,测试方法:对缓冲器发送命令,查看缓冲器是否为空,为空说明A20线已经选通。

 

11.对8259中断控制器进行重新编程,原因??

 

12.使CPU进入保护模式,此时段寄存器的含义发生变化,变为段选择器。

 

13.设置cs=0x0008,偏移值=0x0000, 表示特权级=0,选择GDT表中的第二项的内容(0x0000)作为地址,即跳转至0000:0000处(head.s)执行。

 

 

 

setup.s主要工作:

1.通过BIOS中断调用获取内存硬盘显卡相关的参数,放入内存中,供后面执行的程序直接使用。

2.重新设置IDT和GDT表,为CPU进入保护模式,做好准备。

3.打开A20 Line,对中断控制器进行重新编程。

4.将包含head.s的内存块搬运至0x0000:0000,并跳转至此执行。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值