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

Linux0.11——第二回 从0x7c00到0x90000

上一讲,讲了CPU执行操作系统的最开始的两行代码:

mov ax, 0x07c0
mov ds, ax

这两行代码将数据段寄存器 ds 的值变成了 0x07c0,方便之后访问内存时,利用这个段基址进行寻址。

接下来的代码:

mov ax,0x9000
mov es,ax
mov cx,#256
sub si,si
sub di,di
rep movw

此时,ds 寄存器的值已经是 0x07c0 了,然后又通过同样的方式将 es 寄存器的值变成 0x9000,接着又把 cx 寄存器的值变成 256(代码里确实是用十进制表示的,与其他地方有些不一致,不过不影响)。现在 ds、es 和 cx 寄存器的值就都被赋上了确定的值了,

其中sub指令,就是sub a,b意思就是a = a - b
因此sub si,si sub di,di就是表示这两个寄存器的值为0

这样一来上面的代码的结果就是

ds = 0x07c0
es = 0x9000
cx = 256
si = 0
di = 0
在这里插入图片描述

这上面的六条指令都是为了服务后面的rep movw这条指令,movw表示复制一个字也就是2个字节,
根据这行指令,自然就会引出以下三个问题:

  1. 重复执行多少次呢?答案是 cx 寄存器中的值,也就是 256 次。
  2. 从哪复制到哪呢?答案是从 ds:si 处复制到 es:di 处,也就是从 0x7c00 复制到 0x90000。
  3. 一次复制多少呢?刚刚说过了,复制一个字 16 位,也就是两个字节。那么。一共复制 256 次的两个字节,其实就是复制 512 个字节。

总结一下就是,将启动区的512字节,又把它移动到0x90000处开始的512字节处,也就是下面的样子:
在这里插入图片描述

我理解的就是:0x7c00这个地址位置比较靠前,为了操作系统的代码不被覆盖,把它先移动到比较靠后的位置。现在操作系统最开始的代码位于0x90000处了,再往后看代码会发现这是一条跳转指令了:

	jmpi go, 0x9000
go:	mov	ax,csmov	ds,axmov	es,ax

jmpi 是一个段间跳转指令,表示跳转到 0x9000:go 处执行。
这里寻址方式依然是段基址先左移4位,再加上偏移地址。段基址左移4位就是0x90000, 因此最后的效果就是跳转到0x90000 + go这个内存地址处执行。

go在这里就是一个标签,学过汇编都知道,这里最终编译成机器码的时候会被翻译成一个值,这个值就是go这个标签在文件内的偏移地址。当然比较准确的说法就是,bootsect.s编译成二进制文件bootsect后,go这个标签在被编译成二进制文件里的内存地址偏移量。

这个偏移地址加上0x90000,就刚好是go标签处的那行代码,mov ax, cs此时所在的内存地址了。
其实,就是接着bootsect.s这个文件的代码继续执行而已,因为前面的移动代码已经执行过了。

在这里插入图片描述
假如 mov ax,cs 这行代码位于最终编译好的二进制文件的 0x08 处,那 go 就等于 0x08,而最终 CPU 跳转到的地址就是 0x90008 处。

总结

  • 第一讲就是由BIOS把启动区的代码复制到内存地址0x7c00处,由于x86寻址方式的历史兼容原因,所以需要段基址左移4位,然后就是把0x7c00的512启动区的数据复制到0x90000地址处。然后接着运行。
http://www.lryc.cn/news/173927.html

相关文章:

  • 封装了一个中间放大效果的iOS轮播视图
  • 趣解设计模式之《小王的糖果售卖机》
  • Redis 哨兵模式模式搭建教程
  • 41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传
  • 【新版】系统架构设计师 - 案例分析 - 架构设计<架构风格和质量属性>
  • C++ - 红黑树 介绍 和 实现
  • 【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析
  • Spring面试题15:Spring支持几种bean的作用域?singleton、prototype、request的区别是什么?
  • Spring Boot中Tomcat服务器参数解析及高并发控制
  • Python 运行代码
  • 【ROS入门】使用 ROS 话题(Topic)机制实现消息发布与订阅及launch文件的封装
  • 【企业级SpringBoot单体项目模板 】——Mybatis-plus自动代码生成
  • 怒刷LeetCode的第14天(Java版)
  • c语言 static
  • java基础3
  • LeetCode 1194.锦标赛优胜者
  • 多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)
  • 如何用ArkUI实现一个加入购物车效果?
  • ChatGLM GPT原理介绍
  • 2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)
  • Elasticsearch(四)深分页Scroll
  • JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合
  • Sparta工具用法描述之信息收集(漏洞分析)
  • Vue复选框批量删除示例
  • Docker自定义镜像
  • ardupilot的编译过程
  • Unity中Shader实现模板测试Stencil
  • 多线程与并发
  • 手写call方法
  • 基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证