《操作系统真象还原》第2章

本章实验较为简单,主要是概念性的理解,我在学习xv6时基本都有所涉猎。

下面将我认为重要的知识点总结如下:

1.实模式下的1MB内存布局

下面这张图在后续的学习中应该会经常用到,务必熟悉。

“内存地址0~0x9FFFF的空间范围是640KB,这片地址对应到了DRAM,也就是插在主板上的内存条。”

“顶部的0xFFFF~0xFFFFF,这64KB的内存是ROM。这里面存的就是BIOS的代码。BIOS的主要工作包括:检测、初始化硬件;建立中断向量表IVT;校验启动盘中位于0盘0道1扇区的内容。”

(这张图中的内容此前没了解过,记录一下)

“即使内存条大小没有超过地址总线的范围,也不会全都能被访问到,毕竟要预留一些地址用来访问其他外设,所以最终还得看地址总线把地址指向哪块内存了。这就是安装了4GB内存,电脑中只显示3.8GB的原因。”

2.BIOS时如何苏醒的

“在开机的一瞬间,也就是接电的一瞬间,CPU的cs:ip寄存器被强制初始化为0xF000:0xFFF0,等效为0xFFFF0。此处便是BIOS的入口地址。”

“BIOS中有条指令jmp far f000:e05b。跳转到0xfe05b处,这是BIOS代码真正开始的地方。”

3.为什么是0x7c00

“如果1扇区末尾的两个字节分别是魔数0x55和0xaa,BIOS便认为此扇区中确实存在可执行的程序,便加载到物理地址0x7c00,随后跳转到此地址,继续执行。”

“如果此扇区的最后2个不是0x55和0xaa,即使里面有可执行代码也无济于事了,BIOS不认,它也许还认为此扇区是没格干净呢。”


步骤:

1.安装nasm编译器(方便后续使用)

2.编写MBR引导程序——mbr.S

3.编译并写入磁盘


1.安装nasm编译器 


 在终端中输入:

sudo apt-get install nasm


2.编写MBR引导程序——mbr.S

cd到bochs文件夹中,输入:

vim mbr.S

再输入程序内容:

复制代码
 1 ; mbr.S
 2 
 3 ; 主引导程序
 4 ; --------------------------------------------------
 5 SECTION MBR vstart=0x7c00 ; 把起始地址编译为 0x7c00
 6     mov ax, cs     ; cs 代码段寄存器
 7     mov ds, ax     ; dx 数据段寄存器
 8     mov es, ax     ; es 附加段寄存器
 9     mov ss, ax     ; ss 堆栈段寄存器
10     mov fs, ax     ; fs 80386 后添加的寄存器,无全称
11     mov sp, 0x7c00 ; sp 堆栈指针寄存器
12 
13 ; 清屏
14 ; --------------------------------------------------
15 ; INT 0x10    功能号: 0x06    功能描述:上卷窗口
16 ; --------------------------------------------------
17 ; 输入:
18 ; AH 功能号 = 0x06
19 ; AL = 上卷的行数(如果为0,表示全部)
20 ; BH = 上卷行属性
21 ; (CL, CH) = 窗口左上角的 (X, Y) 位置
22 ; (DL, DH) = 窗口右下角的 (X, Y) 位置
23 ; 无返回值:
24     mov ax, 0x600
25     mov bx, 0x700
26     mov cx, 0
27     mov dx, 0x184f ; 右下角: (80, 25)
28                    ; VGA 文本模式种,一行只能容纳 80 个字符,共 2529                    ; 下标从 0 开始,所以 0x18=24, 0x4f=79
30         
31     int 0x10       ; int 0x10
32 
33 ; .get_cursor 获取当前光标位置,在光标处打印字符
34     mov ah, 3      ; 3 号子功能
35     mov bh, 0      ; 待获取光标的页号
36 
37     int 0x10       ; 输出:
38                    ; ch = 光标开始行,cl = 光标结束行
39                    ; dh = 光标所在行号,dl = 光标所在列号
40 
41 ; 打印字符串
42     mov ax, message
43     mov bp, ax     ; es:bp 为串首地址
44     
45     mov cx, 5      ; cx 为串长度,不包括结束符 '\0'
46     mov ax, 0x1301 ; 13 号子功能
47                    ; ah = 13
48                    ; al = 01: 写字符方式,显式字符串,光标跟随移动
49     mov bx, 0x2    ; bh = 0,要显示的页号
50                    ; bl = 02,字符属性,黑底绿字
51     
52     int 0x10
53 
54     jmp $          ; 程序悬停在此
55 
56     message db "1 MBR"    ; db 字节型
57                           ; dw 字类型
58                           ; dd 双字型
59                           ; dq 四字型
60                           ; dt 十字节型 
61     times 510-($-$$) db 0 ; 填充文件末尾的魔数 0xaa55 和当前位置之间的空间
62                           ; 保证编译后生成的文件大小为 512 字节(硬盘一个扇区的大小)
63     db 0x55, 0xaa
复制代码

保存。


3.编译并写入磁盘

还是在当前目录下,输入:

nasm -o mbr.bin mbr.S


 将.bin文件写入磁盘,输入:

dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc

成功后会显示:

 不要吐槽我一会儿在WSL的终端中执行命令,一会儿又跑到图形界面中的终端。因为我真的很喜欢WSL的命令行,但要用bochs模拟只能打开图形界面。。。

(再写完这篇博客两天后:我发现好像可以直接在WSL下运行bochs!在第4章实验中试试。)


 最后运行bochs试试,如第1章所示:

bin/bochs -f bochsrc.disk

成功打印“1 MBR”!这次实验很成功,有点成就感了 :)


参考博客:

posted @   Hell0er  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示