操作系统原理(哈工大-李治军老师)操作系统引导

这篇博客详细介绍了操作系统引导的步骤,从完成bootsect.s的屏幕输出功能,到bootsect.s读入setup.s,再到setup.s获取基本硬件参数。在过程中,博主解释了如何处理引导程序的大小限制,如何读取setup.s,以及如何获取硬件参数,涉及到汇编语言和Minix可执行文件格式的知识。

操作系统引导

开始试验之前先了解汇编语言为前提

第一步 完成 bootsect.s 的屏幕输出功能


  • 进入目录

cd /home/shiyanlou/oslab

  • 解压

tar -zxvf hit-oskab

  • 进入oslab/linux-0.11/boot目录

cd oslab/linux-0.11/boot

  • 进入bootsect.s粘贴以下内容
entry _start
_start:
    mov ah,#0x03
    xor bh,bh
    int 0x10
    mov cx,#36
    mov bx,#0x0007
    mov bp,#msg1
    mov ax,#0x07c0
    mov es,ax
    mov ax,#0x1301
    int 0x10
inf_loop:
    jmp inf_loop
msg1:
    .byte   13,10
    .ascii  "Hello OS world, my name is LZJ"
    .byte   13,10,13,10
.org 510
boot_flag:
    .word   0xAA55
  • 在目录执行下面两个命令编译和链接
$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o
  • 其中 bootsect.o 是中间文件。bootsect 是编译、链接后的目标文件。

需要留意的文件是 bootsect 的文件大小是 544 字节,而引导程序必须要正好占用一个磁盘扇区,即 512 个字节。造成多了 32 个字节的原因是 ld86 产生的是 Minix 可执行文件格式,这样的可执行文件处理文本段、数据段等部分以外,还包括一个 Minix 可执行文件头部,它的结构如下:

struct exec {
    unsigned char a_magic[2];  //执行文件魔数
    unsigned char a_flags;
    unsigned char a_cpu;       //CPU标识号
    unsigned char a_hdrlen;    //头部长度,32字节或48字节
    unsigned char a_unused;
    unsigned short a_version;
    long a_text; long a_data; long a_bss; //代码段长度、数据段长度、堆长度
    long a_entry;    //执行入口地址
    long a_total;    //分配的内存总量
    long a_syms;     //符号表大小
};

6 char(6 字节)+ 1 short(2 字节) + 6 long(24 字节)= 32,正好是 32 个字节,去掉这 32 个字节后就可以放入引导扇区了。

  • 剔除生成的bootsect的字节数由 544修改到512
shiyanlou@3a7e1252e814:~/oslab/oslab/linux-0.11/boot$ ls -la 
\u603b\u7528\u91cf 36
drwxr-xr-x  2 shiyanlou shiyanlou 4096  3\u6708 27 12:08 .
drwxr-xr-x 10 shiyanlou shiyanlou 4096  8\u6708 23  2011 ..
-rwxrwxr-x  1 shiyanlou shiyanlou  544  3\u6708 27 12:08 bootsect
-rw-rw-r--  1 shiyanlou shiyanlou  164  3\u6708 27 12:08 bootsect.o
-rw-r--r--  1 shiyanlou shiyanlou  340  3\u67
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值