linux0.11--bootsect.s

bootsect启动过程解析
本文详细介绍了0.11版本中由as86编写的bootsect的启动过程及功能实现,包括将自身搬移至内存地址0x90000、加载setup至0x90200、system模块至0x10000等关键步骤,并解释了如何确定根文件系统所在的设备号。

0.11的bootsect是用as86编写的,其实直到2.4版本才同意用as编写的

bootsect的功能:开机后,ROM BIOS自检后,将引导扇区代码bootsect加载到0x7c00处。

bootsect执行期间:

 

1.将bootsect自己搬到0x90000处

2.将setup(第2-5,共4个扇区)搬到bootsect之后,即0x90200处

3.将system模块加载到0x10000处

4.确定根文件系统所在的设备号,若没有指定,根据每磁道扇区数量判断盘的类型和种类,存放在bootsect的508,509处,此处的数值根据

   自己使用的设备真是情况修改

5.510,511处存放0xaa55表明是引导扇区

 

 

所遇到问题:

1.SYSSIZE = 0x3000表明system模块的长度,真实长度为(0x3000<<16) = 192K

2.ROOT_DEV = 0x306,Linus当年的根文件系统所在第2个硬盘的第1个分区

   Linux系统老式的设备号命名,dev_no = ((major << 8) + minor)

   major的意义,1--内存,2--磁盘,3--硬盘,4--ttyx,5--tty,6--并行口,7--非命名管道

3.子程序read_it的作用为将system加载到0x10000处

4.程序最后使用段间跳jmpi 0, 0x9020调到setup处,至此bootsect结束

### 改写 bootsect.s 在 Ubuntu 系统中,为了让 bootsect.s 打印自定义操作系统名的引导提示信息并载入 setup.s 后跳转执行,可按以下步骤操作。首先,使用 BIOS 的 INT 0x10 中断来实现屏幕打印。以下是示例代码: ```asm ! bootsect.s entry _start _start: ! 打印自定义操作系统名的提示信息 mov ah, 0x0e ; 功能号:在Teletype模式下显示字符 mov bx, 0x0007 ; 页号为0,文本属性为正常 mov si, msg print_loop: lodsb or al, al jz load_setup int 0x10 jmp print_loop load_setup: ! 载入 setup.s mov ax, 0x0201 ; 读扇区功能号 mov bx, 0x9000 ; 目标地址 mov cx, 0x0002 ; 扇区号 mov dx, 0x0000 ; 驱动器号 int 0x13 ; 调用磁盘中断 ! 跳转到 setup.s 开始地址执行 jmp 0x9000:0x0000 msg: .ascii "MyOS is booting..." .byte 0 ``` ### 改写 setup.s setup.s 需要输出特定信息、获取至少一个硬件参数存于内存特定地址并输出到屏幕且不加载内核。以下是示例代码: ```asm ! setup.s _start: ! 输出特定信息 mov ah, 0x0e mov bx, 0x0007 mov si, setup_msg print_setup_msg: lodsb or al, al jz get_hardware_info int 0x10 jmp print_setup_msg get_hardware_info: ! 获取硬件参数(以获取内存参数为例,INT 0x12) int 0x12 mov [0x9000], ax ; 将内存参数存于 0x9000 地址 ! 输出硬件参数到屏幕 mov ax, [0x9000] mov bx, 0x000F ; 除数为16 mov cx, 0 ; 计数器 convert_loop: xor dx, dx div bx add dl, '0' cmp dl, '9' jle print_digit add dl, 7 ; 转换为字母A - F print_digit: push dx inc cx cmp ax, 0 jne convert_loop print_hardware_info: pop dx mov ah, 0x0e int 0x10 loop print_hardware_info hang: jmp hang setup_msg: .ascii "Now we are in SETUP" .byte 0 ``` ### 在 bochs 中测试改写程序 1. 安装 bochs: ```bash sudo apt-get install bochs bochs-x bximage ``` 2. 创建虚拟磁盘镜像: ```bash bximage -fd -size=1.44 -q floppy.img ``` 3. 将改写后的 bootsect.s 和 setup.s 编译并写入磁盘镜像: ```bash as --32 bootsect.s -o bootsect.o ld -m elf_i386 -N -e _start -Ttext 0x7c00 bootsect.o -o bootsect objcopy -O binary bootsect bootsect.bin dd if=bootsect.bin of=floppy.img bs=512 count=1 conv=notrunc as --32 setup.s -o setup.o ld -m elf_i386 -N -e _start -Ttext 0x9000 setup.o -o setup objcopy -O binary setup setup.bin dd if=setup.bin of=floppy.img bs=512 seek=1 count=1 conv=notrunc ``` 4. 配置 bochs 并启动: ```bash bochs -f bochsrc.txt ``` 在 `bochsrc.txt` 中配置使用创建的 `floppy.img` 作为启动盘。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值