linux0.11源码学习--setup.s

本文详细解读setup.s文件的作用,包括读取系统参数、加载中断描述符寄存器和全局描述符寄存器等关键步骤,并深入探讨小端法在存储方式中的应用。同时,分析了lds指令的功能,解释了stosb指令在清空第二硬盘参数的作用,以及do_move代码段的巧妙设计。此外,文章还介绍了IDTR和GDTR的加载过程和进入保护模式的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    关于setup.s,我认为是引导程序中3个程序中最简单的一个,在setup.s中我认为最终要的是搞清楚保护模式和实模式的区别

setup.s主要做了如下的事情

  1. 利用BIOS读取机器系统的参数,然后把这些参数存放到ox9000:0000的位置(覆盖了原来的bootsect.s的程序);
  2. system模块整体下移了到ox0000处;
  3. 加载中断描述符寄存器和全局描述符寄存器;
  4. 开启A20地址线;
  5. 重新设置8259A,硬件中断号为0x20~0x2f;
  6. 设置CR0,从而以32位以保护模式运行,跳转到head.s运行;

setup.s部分代码分析

  • 小端法

    !Get video-card data:
    int 0x10
    mov [4],bx       !bh=display page
    mov [6],ax       !al=video mode,ah=widow width
    最主要的是关于ax存储方式,通过查表我们知道ox90006的位置是存放显示模式一个字节,ox90007存放字符列数一个字节。在这段代码最后一行mov [6],ax。在它后面注释中,我们知道了al在ox90006,ah在ox90007的位置,这就是采用了小端法。这里主要是一个小的细节。
  • lds指令

    !Get hd0 data
    mov ax,#0x0000
    mov ds,ax
    lds si,[4*0x41]
    mov ax,#INITSEG
    mov es,ax
    mov di,#0x0080
    mov cx,#0x10
    rep
    movsb
    这里最重要的代码是 lds si,[4*0x41],其主要实现的是把ds:[4*0x41]开始的4个字节存放到si,ds中。[4*0x41]开始的4个字节是41号中断的中断向量,存放的是中断处理函数的地址。在这里指的是hd0参数表的地址。还有一点值得提醒大家,为什么是4*0x41,因为中断向量中的大小是4个字节,分别是段基址和段内偏移这两个16位的值。
  • stosb指令

    no_disk1:
    mov ax,#INITSEG
    mov es,ax
    mov di,#0x9000
    mov cx,#0x10
    mov ax,#0x00
    rep
    stosb
    这段的主要是判断没有第2个硬盘,则将第二个硬盘参数清零。这里的stosb/sw 是将al/ax的数据装入es:di制定的存储单元,然后更具DF标志增减di。
  • do_move的分析

    do_move:
    mov es,ax
    add ax,#0x1000
    cmp ax,#0x9000
    jz end_move
    mov ds,ax
    sub di,di
    sub si,si
    mov cx,#0x8000
    rep 
    movsw
    jmp do_move
    这段代码其实设计的还是很漂亮的。刚开始我觉得这段代码设计的太麻烦了,直接设置号ds,si和es,di,然后设置cx不就行了,后来我发现我错了。因为如果按照我的想法,那么cx=0x8000ffff,很明显这已经超过了cx的16位上限了。由于system模块范围是0x1000:0~0x8fff:ffff总共 8*16^4=512kb。这段代码总共移动了0x8000×2*8=512kb所以正如linus所说“we move the system to it's rightful  place”。
  • 加载IDTR和GDTR

    lidt idt_48
    lgdt gdt_48
    在lidt idt_48中,通过idt_48来设置IDTR的值即IDT的入口地址,同理lgdt gdt_48设置了GDTR的值即GDT的入口地址。中断向量表的地址从0x0000开始的这在head.s中有详细的解释。全局描述符表可以在任何位置,只要在GDTR中设置它的地址即可。
  • 进入保护模式

    mov ax,#ox0001
    lmsw ax
    jmpi 0,8

        进入保护模式首先关闭所有中断,然后设置CR0来使CPU处于保护模式运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值