当前位置: 首页 > ops >正文

《操作系统真相还原》——大战MBR

在开机的一瞬间,也就是接电的一瞬间,CPU 的 cs:ip 寄存器被强制初始化为 0xF000:0xFFF0。由于开机的时候处于实模式,再重复一遍加深印象,在实模式下的段基址要乘以16,也就是左移4位,于是0xF000:0xFFF0 的等效地址将是 0xFFFF0。上面说过了,此地址便是 BIOS 的入口地址。

认识到在实模式下20位总线,最大能访问1MB的空间,而此BIOS入口地址到最大只有16B,所以真正的代码在另外的地方

分段

重定位

程序中的地址若都是绝对物理地址,那该程序必须放在内存中固定的地方,于是,两个编译出来地址相同的用户程序还真没法同时运行,只能运行一个,什么是重定位呢,简单来说就是将程序中指令的地址改写成另外一个地址,但该地址处的内容还是原地址处的内容。

访问大内存

偏移地址也要存入寄存器,而那时的寄存器是 16 位的,也就
是一个段最多可以访问到 64KB。而那时的内存再小也有 1MB,
改变段基址,由一个段变为另一个段,就像一个段在内存中飘移,
采用这种在内存中来回挪位置的方式可以访问到任意内存位置。
所以说,程序分段又是为了将大内存分成可以访问的小段,
通过这样变通的方法便能够访问到所有内存了

MBR

nasm -o mbr.bin mbr.S

如果你使用了apt-get下载的话并且使用Ubuntu 22.04很有可能会遇到错误。

bx_dbg_read_linear: physical memory read error (phy=0x0000322f3130, lin=0x00000000322f3130)

这时需要把BIOS-bochs-latest ROM 替换为 BIOS-bochs-legacy
接下来,相关配置:

# 基本配置
megs: 32# 分配 64MB 内存
romimage: file=/usr/share/bochs/BIOS-bochs-legacy
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest# 启动设备(从硬盘镜像启动)
boot: disk# 硬盘镜像配置
ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
ata0-master: type=disk, path="c.img", mode=flat,cylinders=121,heads=16,spt=63# 启用鼠标(可选)
mouse: enabled=1# 日志输出(可选)
log: bochsout.txt

在这里插入图片描述
非常酷

结束

http://www.xdnf.cn/news/9978.html

相关文章:

  • 数据结构——图
  • 大语言模型 24 - MCP 自动操作 提高模型上下文能力 Cursor + Sequential Thinking Server Memory
  • 云游戏混合架构
  • 【机械视觉】Halcon—【六、交集并集差集和仿射变换】
  • AI Agent开发入门笔记(1)
  • C++ 实现 std::move_only_function
  • DeepSeek R1 模型小版本升级,DeepSeek-R1-0528都更新了哪些新特性?
  • UniDream AI绘画——让想象力,无界绽放
  • 可定制化货代管理系统,适应不同业务模式需求!
  • 智能改变一切:当技术革命遇见人类文明
  • OpenCV---pointPolygonTest
  • 【实例】事业单位学习平台自动化操作
  • 【Web应用】若依框架:基础篇12 项目结构
  • DeepSeek 赋能文化遗产数字化修复:AI 重构千年文明密码
  • 如何从ISO镜像直接制作Docker容器基础镜像
  • 明场检测与暗场检测的原理
  • Excel 中的SUMIFS用法(基础版),重复项求和
  • 基于SpringBoot的商家销售管理网站的设计与实现
  • 第二章 2.1 数据存储安全风险之数据存储风险点
  • Java类和对象详解
  • RS232转Profinet网关在检漏仪与西门子PLC里的应用
  • 前端流式接收数据讲解
  • 万兴PDF手机版
  • audit日志轮训保留180天的日志,按天保存
  • C++17原生测试编程实践:现代特性与分支覆盖指南
  • 大疆上云API+流媒体服务器部署实现直播功能
  • 基于粒子滤波的PSK信号解调实现
  • new和delete的理解
  • ESP8266远程控制:实现网络通信与设备控制
  • 编程之巅:语言的较量