《操作系统真象还原》第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 个字符,共 25 行
29 ; 下标从 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”!这次实验很成功,有点成就感了 :)
参考博客:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库