Linux0.11——操作系统怎么把自己从硬盘搬到内存

这里先直接给出答案:中断

在这里插入图片描述
此时,操作系统用短短几行代码,将数据段寄存器ds和代码段寄存器cs设置为了0x9000,方便之后的程序访问代码和数据,并且将栈顶地ss:sp设置在了远离代码的位置0x9000足够遥远的0x9FF00,保证了栈向下发展时不会轻易覆盖掉操作系统的代码。

简单来说,就是设置了如何访问数据段、如何访问代码段以及如何访问栈段,也就是做了一次初步的内存规划。因为从CPU的角度出发,访问内存就是这么三个地方而已。

在这里插入图片描述

做好这些基础工作之后,我们现在仅仅是把硬盘中最开始的512字节加载到内存中了,但操作系统还有很多代码仍然在硬盘中的其他扇区里,不能抛下它们不管啊🤣

把剩下的操作系统的代码从硬盘请到内存中来

所以下一步,自然是把仍然在硬盘中的操作系统代码请到内存中来。

接着往下看代码:

load_setup:mov dx,#0x0000      ; drive 0, head 0mov cx,#0x0002      ; sector 2, track 0mov bx,#0x0200      ; address = 512, in 0x9000mov ax,#0x0200+4    ; service 2, nr of sectorsint 0x13            ; read itjnc ok_load_setup       ; ok - continuemov dx,#0x0000mov ax,#0x0000      ; reset the disketteint 0x13jmp load_setupok_load_setup:...

这里有两个我们值得关注的点int指令。
这个int指令在汇编中指的是表示中断指令,不是C语言里的int类型🤣,int 0x13表示发起0x13中断,这条指令的各种mov指令都是用来给dx,cx,bx,ax赋值,这四个寄存器都是作为这个中断程序的参数,这叫通过寄存器来传参。与之相对应的是另一种传参方式是通过栈传递,在C语言中应用很广。

中断可以简单理解为一种通知机制,用来打断当前CPU正在执行的指令,转而去执行相应的中断处理程序的过程。更详细的原理和分析,可以自行Google。

发起中断后,CPU就会通过这个中断号0x13,去寻找对应的中断处理程序的入口地址,并跳转过去执行,逻辑上就相当于执行了一个函数。

而0x13号中断的处理程序,是BIOS提前给我们写好的,具体可以去Google BIOS的中断,0x13表示的是读取磁盘的中断函数,之后真正进入操作系统内核之后,中断处理程序还要我们自己编写,目前先用的是BIOS的中断函数。

可见即便是操作系统的源码,有时也需要去调用现成的函数方便自己工作,并不是造轮子的人就非得完全从头开始造。

Linux在用这个0x13中断干了什么呢?我们直接看代码:

load_setup:mov dx,#0x0000      ; drive 0, head 0mov cx,#0x0002      ; sector 2, track 0mov bx,#0x0200      ; address = 512, in 0x9000mov ax,#0x0200+4    ; service 2, nr of sectorsint 0x13            ; read it...

这里的代码注释已经很清楚了, 直接说它的作用——从硬盘的第二个扇区开始,把数据加载到内存0x90200处,共加载4个扇区。图示就是这样的:

在这里插入图片描述

load_setup:...jnc ok_load_setup       ; ok - continue...jmp load_setupok_load_setup:...

再往后的jnc和jmp,表示成功和失败分别跳转到哪个标签处,相当于我们高级语言中的if-else。

可以看到,如果复制成功,就跳转到 ok_load_setup 这个标签;如果失败,则会不断重复执行这段代码,也就是重试。因此我们先不需要关心重试逻辑了,直接看成功后跳转的 ok_load_setup 这个标签后的代码:

ok_load_setup:...mov ax,#0x1000mov es,ax       ; segment of 0x10000call read_it...jmpi 0,0x9020

剩下的核心代码就都写在这里了,就这么几行,其作用是把从硬盘第 6 个扇区开始往后的 240 个扇区,加载到内存 0x10000 处,和之前的从硬盘复制到内存是一个道理。

在这里插入图片描述
至此,整个操作系统的全部代码,就已经全部从硬盘加载到内存中了。然后这些代码,又通过一个熟悉的段间跳转指令 jmpi 0,0x9020,跳转到 0x90200 处,就是硬盘第二个扇区开始处的内容。

那这里的内容是什么呢?就是我们要阅读的第二个操作系统源代码文件 setup.s。

聊聊操作系统的编译过程不过先不急,进入第二个源代码文件之前,我们先简单复盘一下整个操作系统的编译过程。整个编译过程,就是通过 Makefile 和 build.c 配合完成的,最终达到这样一个效果:1. 把 bootsect.s 编译成 bootsect 放在硬盘的 1 扇区;
2. 把 setup.s 编译成 setup 放在硬盘的 2~5 扇区;
3. 把剩下的全部代码(head.s 作为开头,与各种 .c 和其他 .s 等文件一起)编译并链接成 system,放在硬盘的随后 240 个扇区。所以整个路径如下图所示:

在这里插入图片描述

总结

  • bootsect.s文件就是把操作系统的代码挪来挪去,最后形成上面的内存结构i,然后做了一次比较重要的内存规划,方便后续代码的执行时,数据段和代码段以及栈段的寻址方式。

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

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

相关文章

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统

. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。 二、企业通过数字化转型,不仅有利于优化业务流程、提升经营管…

LLM各层参数详细分析(以LLaMA为例)

网上大多分析LLM参数的文章都比较粗粒度,对于LLM的精确部署不太友好,在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说,当h(heads) 1时,在默认情况下, W i Q W_i^…

电商项目高级篇-02 elasticsearch-下

电商项目高级篇-02 elasticsearch-下 4.2、QueryDSL返回指定字段 4.2、QueryDSL 返回指定字段 返回单个字段 GET bank/_search {"query": {"match_all": {}}, "sort": [{"balance": {"order": "desc"}}], &quo…

详解yolov1理论 代码

目标检测要解决的3大问题: 1、有没有? 图片中是否有要检测的物体?(检测物体,判定前景背景) 2、是什么? 这些物体分别是什么?(检测到的物体是什么) 3、在…

【RV1103】RTL8723bs (SD卡形状模块)驱动开发

文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一:修改二: SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…

Learn Prompt- Midjourney案例:Logo设计

Logo设计是一个充满挑战的任务,因为Logo是品牌重要价值的浓缩。 快速开始​ 直接使用logo design for...来获取灵感。 备注 图像中生成文字在Midjourney中的效果还不是很好,但你可以用Canva编辑图片并替换自己的文字。 在提示中使用那些擅长你所寻找的…

Spring整合RabbitMQ——生产者(利用配置类)

1.生产者配置步骤 2.引入依赖 3.编写配置 配置RabbitMQ的基本信息,用来创建连接工厂的 编写启动类 编写配置类 4. 编写测试类

idea没有maven工具栏解决方法

背景:接手的一些旧项目,有pom文件,但是用idea打开的时候,没有认为是maven文件,所以没有maven工具栏,不能进行重新加载pom文件中的依赖。 解决方法:选中pom.xml文件,右键 选择添加为…

Stm32_标准库_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电,PB5放置按键,按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…

24. 图论 - 图的表示种类

Hi,你好。我是茶桁。 之前的一节课中,我们了解了图的来由和构成,简单的理解了一下图的一些相关概念。那么这节课,我们要了解一下图的表示,种类。相应的,我们中间需要穿插一些新的知识点用于更好的去理解图,比如说邻接矩阵。 图的表示 我们一般用什么样的形式来表示图…

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…

使用 Python 函数callable和isinstance的意义

一、说明 在这篇博客中,我们将探讨两个python函数:1 callable 中的函数及其有趣的应用程序。该callable函数用于检查对象是否可调用,这意味着它可以作为函数调用。2 isinstance这个内置函数允许我们比较两种不同的数据类型并确定它们是否相…

Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)

星光下的赶路人star的个人主页 世间真正温煦的春色,都熨帖着大地,潜伏在深谷 文章目录 1、输出算子(Sink)1.1 连接到外部系统1.2 输出到文件1.3 输出到Kafka1.4 输出到MySQL(JDBC)1.4 自定义Sink输出 1、输…

[密码学入门]仿射密码(Affine)

加密算法y(axb)mod N 解密算法x*(y-b)mod N(此处的为a关于N的乘法逆元,不是幂的概念) 如何求,涉及的知识挺多,还没想好怎么写,丢番图方程,贝祖定理(又译裴蜀定理),扩展欧…

IO流————

一、字符流 前面我们学习了字节流,使用字节流可以读取文件中的字节数据。但是如果文件中有中文,使用字节流来读取,就有可能读到半个汉字的情况,这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码,但是如果文件过大又不太合适。 所以Java专门为我们提供了另外一种…

opencv: 解决保存视频失败的问题

摘要:opencv能读取视频,但保存视频时报错。 一、首先要确保已经下载了openh264.dll文件,否则保存的视频无法打开,详细可以浏览这个:opencv:保存视频。 二、保存视频时出现一下问题: OpenCV:…

vue_Delete `␍`eslint(prettier/prettier)

Delete ␍eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码,在执行pre-commit时,出现如下错误: Delete ␍eslint(prettier/prettier)问题根源 罪魁祸首是git的一个配置属性:core.autocrlf 由于…

【空间-光谱联合注意网络:多时相遥感图像】

A Spatial–Spectral Joint Attention Network for Change Detection in Multispectral Imagery (一种用于多光谱图像变化检测的空间-光谱联合注意网络) 变化检测是通过比较双时相图像来确定和评估变化,这是遥感领域的一项具有挑战性的任务…

Oracle VM VirtualBox安装并下载安装CentOS7

Oracle VM VirtualBox安装并下载安装CentOS7 Oracle VM VirtualBox下载CentOS创建虚拟机 Oracle VM VirtualBox VM下载链接 https://www.oracle.com/cn/virtualization/virtualbox/ 点击链接直接下载就行,下载完默认安装或者更改一下安装目录。 下载CentOS http://…

快速排序与冒泡排序以及代码

快速排序 快速排序(Quicksort)是一种常用的排序算法,它基于分治的思想。 时间复杂度:O(nlogn) 空间复杂度:O(logn) 快速排序的基本思想如下: 选择一个元素…