Chinaunix首页 | 论坛 | 博客

  • 博客访问: 134640
  • 博文数量: 46
  • 博客积分: 2310
  • 博客等级: 大尉
  • 技术积分: 505
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-18 19:13
文章存档

2011年(14)

2010年(32)

我的朋友

分类: LINUX

2010-03-16 17:44:15

setup.s是操作系统加载程序,它的主要作用是利用ROM BIOS中断读取机器系统数据,并将这些数据保存到0x90000开始的位置(覆盖掉了bootsect程序所在的地方),所取得的参数和保留的内存位置见表6-2所示。这些参数将被内核中相关程序使用,例如字符设备程序集中地console.c和tty_io.c程序等。
然后setup程序将system模块从0x10000-0x8ffff(当时认为内核系统模块system的长度不会超过此值:512KB)整块向下移动到内存绝对地址0x0000处。接下来加载中断描述符表寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20-0x2f。最后设置CPU的控制寄存器CR0(也称为机器状态字),从而进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s程序继续运行。
为了能让head.s在32位保护模式下运行,在本程序中临时设置了中断描述符表IDT和全局描述符表GDT,并在GDT中设置了当前内核代码段的描述符和数据段的描述符。
 
在读取并保存了参数之后,进入保护模式,此过程禁止中断。将system代码移动到0x00000处,之后加载中断描述符表。lidt指令用于加载中断描述表IDT寄存器,它的操作数(idt_48)有6个字节前2个字节(字节0-1)是描述符表的字节长度值;后4个字节是描述符表的32为线性基地址。
idt初始化为0
gdt第一项为空第二项内核代码段第三项内核数据段
程序最后将变成模式置为保护模式并跳转到内核代码段偏移地址为0处,即0x00000处
开始执行system模块。
head.s程序处于system模块的最开始。
 
阅读(892) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~