操作系统引导
开始试验之前先了解汇编语言为前提
第一步 完成 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

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

被折叠的 条评论
为什么被折叠?



