hit-oslab2

今天完成了hit-oslab2的实验

实验的内容是

  1. 阅读《Linux内核完全注释》的第6章,对计算机和Linux 0.11的引导过程进行初步的了解;

  2. 按照下面的要求改写0.11的引导程序bootsect.s

  3. 有兴趣同学可以做做进入保护模式前的设置程序setup.s。

改写bootsect.s主要完成如下功能:

  1. bootsect.s能在屏幕上打印一段提示信息“XXX is booting...”,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等(可以上论坛上秀秀谁的OS名字最帅,也可以显示一个特色logo,以表示自己操作系统的与众不同。)

改写setup.s主要完成如下功能:

  1. bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s向屏幕输出一行"Now we are in SETUP"。

  2. setup.s能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。

  3. setup.s不再加载Linux内核,保持上述信息显示在屏幕上即可。

实验过程:

  1. bootsect.s中的实验修改msg1中的字符和循环的次数就可

  2. 第二个实验可以将bootsect中的代码copy过来,但是要注意es寄存器的值

  3. setup将硬件参数保存在地址0x90000中,所以要从中取出值,还要注意2进制和16进制的转换。

实验代码

                            !code in setup.s
                            ! Print Now we are in SETUP
mov ax,cs
mov es,ax           
mov ds,ax
mov    ah,#0x03        
xor    bh,bh
int    0x10
mov    cx,#25            ! 要显示的字符串长度
mov    bx,#0x0007        ! page 0, attribute 7 (normal)
mov    bp,#msg1
mov    ax,#0x1301        ! write string, move cursor
int    0x10

                                ! Print Memory Size
mov cx,#INITSEG
mov ds,cx
    mov dx,[2]
    add    dx,#0x0400
    mov    cx,#4
    jmp print_hex

print_hex:  
    mov    ax,#0x0E0F
    rol    dx,#4
    and    al,dl
    cmp    al,#0x0A
    jb    ltA
    jnb    nltA

ltA:
    add    al,#0x30
    jmp    ctnp

nltA:
    add    al,#0x37
    jmp ctnp

ctnp:
    int    0x10
    loop    print_hex

反思

要对代码多做修改,敢去下手。把用不到的代码删除掉。

最后一个实验只实现了获取启动的一个参数,汇编了解的太少,只知道从0x90000中取值,对后续操作就不知道了。还是在网上找到的别人的实验报告才知道要去做转换,


via:int 10 详解 http://blog.csdn.net/yes_life/article/details/6778834   

                         http://blog.csdn.net/zdy0_2004/article/details/48190467

                         https://github.com/hoverwinter/HIT-OSLab


  

你可能感兴趣的:(操作系统)