从0创建一个OS (四) 电脑存储的组织形式
本节将学习boot sector以及其所在内存的相关知识
学习完本节后,要明确一个概念: 代码的存储区域和运行区域有可能不同
关键字:memory offsets; pointers
目标:学习电脑存储的组织形式
在进行学习之前,先看一下这幅图
这幅图为16bit实模式下电脑启动后的内存存储结构,读者请尤其注意粉色椭圆勾选的区域.
实验一
我们想要通过boot_sector的代码将大写字母"X"打印在屏幕上,为此设计了一组实验,实验设计见源码.
源码
编译并Boot
具体编译并Boot方法参见从0创建一个OS (二) boot_sector的"裸骨架"的编译、Boot部分
试验结果
可以看到尝试三和尝试四取得了成功,因为通过不同的方式,都取得了"X"的绝对地址.
新知识
如果每次对变量进行寻址都需要加上0x7C00,那岂不是太麻烦了,因此人们设计了汇编语法
使用该语法,使后续的寻址基地址都变为段地址.
实验二
接下来我们将"org 段地址"写入我们的源码第一行中,看看会有什么样的结果.
编译并Boot
具体编译并Boot方法参见从0创建一个OS (二) boot_sector的"裸骨架"的编译、Boot部分
实验结果
尝试二从失败变为成功,尝试三从成功变为失败,尝试四仍旧成功,具体原因参见源码中的注释.
总结
本节进行了诸多尝试,解释了boot sector中的变量存储方式,以后对boot sector的程序编写,首行一定要加上 org 0x7C00.
boot sector虽然存储在磁盘的第一个512个字节范围,但是运行时被load到了0x7C00进行运行.
番外. 查看二进制文件内容
一定有读者想要问上面源码中的0x2d 是怎么数出来的,在这里给大家演示以下,以证明我在尝试四中写的所谓的"愚蠢"是有道理的.
我们由上面的两个汇编源文件boot_sect_memory.asm和boot_sect_memory_org.asm编译链接生成了boot_sect_memory.bin和boot_sect_memory_org.bin两个二进制文件,使用二进制文件查看工具可以看到其中的内容,本文这里使用的二进制文件查看工具为: vscode的插件"hexdump for vscode".
两个源码之间的区别只有首行的"org 0x7C00", 让我们来看一下这两个二进制文件的异同.
每个文件中标黄部分,相同的是16进制58,本质为"X"的ASCII码,不同的是,加上org 0x7C00后,第二行第一列的00变为了7C.
那么地址怎么看呢,请看下图
在**vscode的插件"hexdump for vscode"**中将鼠标放置需要查看的字节上,将自动显示该字节在该文件中的地址,由上图可以看出,"X"的地址为0x2d
__EOF__

本文链接:https://www.cnblogs.com/haiyonghao/p/14623204.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律