Linux0.11——第三回 做好访问内存的最基础准备工作

news2024/11/20 8:42:53

前面两回是把启动区的代码复制来复制去的,这里我们要讨论的就是操作系统怎么为程序访问内存的方式做初步规划的?

操作系统的代码最开头的 512 字节的数据,先从硬盘的启动区移动到了内存 0x7c00 处,然后又立刻被移动到 0x90000 处,并且跳转到 0x90000 加上 go 这个标签所代表的偏移量。

在这里插入图片描述
接下来就是关注后续的代码:

go:	mov	ax,cs
	mov	ds,ax
	mov	es,ax
; put stack at 0x9ff00.
	mov	ss,ax
	mov	sp,0xFF00		; arbitrary value >>512

一眼望去,全都是 mov 操作,那就很好办了。这段代码的直接意思很容易理解,就是把 cs 寄存器的值分别复制给 ds、es 和 ss 寄存器,然后又把 0xFF00 给了 sp 寄存器。

回顾CPU寄存器的图解:
在这里插入图片描述
所以,其实操作系统的代码目的性都是非常明确的,每一条代码都是为后续做铺垫的,你只需要关注它要完成什么事情,要理解它们要完成的事情。

这些寄存器是干嘛的?
cs 寄存器表示代码段寄存器,CPU 即将要执行的代码在内存中的位置,就是由 cs:ip 这组寄存器配合指向的,其中 cs 是基址,ip 是偏移地址。

由于之前执行过一个段间跳转指令,还记得不?

jmpi go,0x9000

这个指令用另一种伪代码表示就是:

cs = 0x9000
ip = go

所以现在 cs 寄存器里的值就是 0x9000,ip 寄存器里的值是 go 这个标签的偏移地址。那么刚刚说的三个 mov 指令就分别给 ds、es 和 ss 寄存器赋值为了 0x9000,也就是 cs 寄存器里的值。

ds 是数据段寄存器,作为访问内存数据时的基地址。之前我们说过了,当时它被赋值为 0x07c0,是因为之前的代码在 0x7c00 处,现在代码已经被挪到了 0x90000 处,所以现在自然又改赋值为 0x9000 了。

es 是扩展段寄存器,先不用理它。

ss 是栈段寄存器,后面要配合栈指针寄存器 sp 来表示此时的栈顶地址。而此时 sp 寄存器被赋值为 0xFF00 了,所以目前的栈顶地址,就是 ss:sp 所指向的地址 0x9FF00 处。

在这里插入图片描述
CPU访问内存的三种途径
总结上面的内容就是:CPU访问内存有三种途径——访问代码的CS:IP,访问数据的ds:xxx,以及访问栈的ss:sp。其实就是一个程序分成了不同的段,数据段,代码段,堆栈段。

其中, cs 作为访问指令的代码段寄存器,被赋值为了 0x9000。ds 作为访问数据的数据段寄存器,也被赋值为了 0x9000。ss 和 sp 作为栈段寄存器和栈指针寄存器,分别被赋值为了 0x9000 和 0xFF00,由此计算出栈顶地址 ss:sp 为 0x9FF00,之后的压栈和出栈操作就以这个栈顶地址为基准。

概括来说,这一部分其实就是把代码段寄存器 cs、数据段寄存器 ds、栈段寄存器 ss 和栈指针寄存器 sp 分别设置好了值,方便后续使用。

从操作系统的角度来看,就是初步规划了内存,给程序如何访问代码,如何访问数据,还有如何访问栈制定了规则。其中访问代码和数据的规划方式,就是设置了一个基址;访问栈就是设置了栈顶指针,指向了一个远离代码位置的地方。

在这里插入图片描述

总结

到这里最操作系统最最最基础的准备工作就做好了。

  1. 把代码从硬盘移动到内存,又从内存移动到另一个地方0x90000。
  2. 数据段寄存器ds和代码段寄存器cs此时都被设置成了0x9000,也就是为了跳转代码和访问内存数据,设置了一个内存的基地址,以方便代码的编写。
  3. 栈顶地址被设置成了0x9FF00,具体表现为栈段寄存器ss为0x9000,栈指针寄存器sp为0xFF00.

现在仅仅是考虑启动区的512字节代码,不难想到像BIOS一样,操作系统还有很多代码位于硬盘中,不能抛下它们不管啊。所以下面就是把仍然在硬盘的操作系统代码,“请”到内存中来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis-plus中更新null值的问题

文章目录 前言一、情景介绍二、方法分析三、原因分析四、解决方式五、方式扩展总结 前言 本文主要介绍 mybatis-plus 中常使用的 update 相关方法的区别,以及更新 null 的方法有哪些等。 至于为什么要写这篇文章,首先是在开发中确实有被坑过几次&#x…

Json文件序列化读取

Json文件 [{"name":"清华大学","location":"北京","grade":"1"},{"name":"北京大学","location":"北京","grade":"2"} ] 安装包 代码 Program.c…

睿趣科技:抖音开网店真的可以相信吗

随着社交媒体的快速发展,抖音已经成为了一个备受欢迎的平台,尤其是对于那些希望在电商领域有所作为的人们。许多人开始在抖音上开设网店,以获取额外的收入或建立自己的事业。然而,对于抖音开网店是否真的可以相信,存在…

java基础学习之变量与运算符

一,关键字 1,定义:被java语言赋予了特殊含义,用作专门用途的字符串或单词。 2,特点:关键字全都是小写字母。 3,关键字一共50个,其中const和goto是保留字。 4,true&#x…

硕士应聘大专老师

招聘信息 当地人社局、学校(官方) 公众号(推荐): 辅导员招聘 厦门人才就业信息平台 高校人才网V 公告出完没多久就要考试面试,提前联系当地院校,问是否招人。 校招南方某些学校会直接去招老师。…

Web自动化测试测试常见BUG

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 1.翻页 翻页时,没有加载数据为空,第二页数据没有请求 翻页时,重复请…

“淘宝” 开放平台接口设计思路(内附API接口免费接入地址)

最近对接的开放平台有点多,像淘宝、天猫、京东、拼多多、快手、抖音等电商平台的开放平台基本对接了个遍,什么是CRUD BODY也许就是这样的吧!!! 经过这几天的整理,脑子里大概有了个开放平台接口的设计套路&…

mysql优化之索引

索引官方定义:索引是帮助mysql高效获取数据的数据结构。 索引的目的在于提高查询效率,可以类比字典。 可以简单理解为:排好序的快速查找数据结构 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这种数据…

面试题:ElasticSearch是什么?应用场景是什么?

文章目录 1、什么是搜索2、如果用数据库做搜索会怎么样3、什么是全文检索、倒排索引和Lucene4、ElasticSearch是什么ElasticSearch的功能ElasticSearch的应用场景ElasticSearch的特点 ElasticSearch是一个分布式,高性能、高可用、可伸缩的搜索和分析系统 看了上面这…

泛型编程<T extends Comparable<? super T>>是什么意思

今天看到了两个这样的写法,非常好奇。 <T extends Comparable<? super T>>public class BplusTree<K extends Comparable </K/>,V>下面是不同人对这种写法的解释 大概理解的意思是实现不同类之间属性的对比 转载链接 这段代码是什么意思呢 public…

小米系列机型--MIUI14关闭广告 推送广告 开屏广告 通用其他miui版本

在现代社会中&#xff0c;手机广告已经成为我们日常生活中的一种困扰。每当我们使用手机时&#xff0c;不断弹出的广告不仅打扰了我们的正常操作&#xff0c;还消耗了我们的流量和电池电量&#xff0c;以小米机型为例.根据下方的设置完以后基本手机就相对来说很干净。 以前博文…

2000-2019年高新技术企业统计情况

2000-2019年高新技术企业统计情况 1、时间&#xff1a;2000-2019年 2、指标&#xff1a;统计年度、所属省份、所属省份代码、所属城市、所属城市代码、认定对象身份、认定总次数、涉及公司总数量 3、来源&#xff1a;csmar 4、指标说明&#xff1a; SgnYear [统计年度] - …

高效查询大量快递信息,轻松掌握技巧

在如今快节奏的生活中&#xff0c;快递已经成为我们日常不可或缺的一部分。然而&#xff0c;对于一些忙碌的人来说&#xff0c;单个查询每一个快递单号可能会浪费太多时间。因此&#xff0c;我们需要一款可以帮助我们批量查询快递的软件。 在市场上&#xff0c;有很多款专门用于…

vue+express、gitee pm2部署轻量服务器(20230923)

一、代码配置 前后端接口都保持 127.0.0.1:3000 vue 项目 创建文件 pm2.config.cjs module.exports {apps: [{name: xin-web, // 应用程序的名称script: npm, // 启动脚本args: run dev, // 启动脚本的参数cwd: /home/vue/xin_web, // Vite 项目的根目录interpreter: none,…

Matlab图像处理-模式识别

模式识别 模式识别就是用计算的方法根据样本的特征将样本划分到一定的类别中去。模式识别就是通过计算机用数学技术方法来研究模式的自动处理和判读&#xff0c;把环境与客体统称为“模式”。模式识别以图像处理与计算机视觉、语音语言信息处理、脑网络组、类脑智能等为主要研…

奇舞周刊第507期:通过 View Transition API 在状态之间添加丰富的过渡动画

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 通过 View Transition API 在状态之间添加丰富的过渡动画 W3C 2023 年度全球技术大会 (TPAC2023) 于今年9月 11 - 15 日召开。W3C CSS 工作组成员 Bramus Van Damme(Google) 为本届…

学习ssh配置

三台设备ar1、ar2、ar3 ar1 通过ssh密码方式登陆ar3 ar2 通过免密码方式登陆ar3 ar3的配置如下&#xff1a;进入路由器 rsa local-key-pair creat 选择y&#xff08;yes&#xff09; Input the bits in the modulus[default 512]:2048 //需要创建密钥的长度user-interface v…

RocketMQ生产环境常见问题分析与总结

一、 RocketMQ 如何保证消息不丢失 这个是在面试时&#xff0c;关于 MQ &#xff0c;面试官最喜欢问的问题。这个问题是所有 MQ 都需要面对的一个共性问题。大致的解决思路都是一致的&#xff0c;但是针对不同的MQ 产品又有不同的解决方案。分析这个问题要从以下几个角度入手&…

【C++】bitset位图的简单模拟实现及常见面试题

文章目录 前言一、 bitset模拟实现二、 常见面试题1.给你一百亿个整数&#xff0c;找到只出现一次的数字2. 给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 前言 快速查找某个数据是否在一个集合中排序 去重…

Java Fluent编程

背景 Fluent Api最早是由Martin Fowler1提出的一种简洁的编程风格, 其每一步的执行都返回一个对象并可用于进一步的方法调用. 这样的编程风格可以很好的简化某些领域的开发, 并显著地提高代码的可读性和可维护性. 无论是在Java的流式api中, 还是众多DLS中都有它的身影. 原因主…