纯x86汇编实现的多线程操作系统实践 - 第二章 BSP的启动

news2024/10/1 23:38:44

本章主要讲解BSP的初始化过程,对应的代码为mbr.asm。

系统加电启动后,BIOS进行必要的初始化,并将硬盘的0扇区512字节的数据搬运到内存地址0x7c00处。之后,BSP的IP被置为0x7c00,开始运行。

初始化代码mbr.asm将顺序执行以下功能:

  1. 正确设置sp指针,保障函数调用的成功

  1. 利用BIOS中断,让CPU进入图形化模式

  1. 在全局GDT表中,安装正确的代码段和数据段

  1. 打开A20并设置CR0的PE位,使BSP进入32位保护模式

  1. 将BSP的32位保护模式下的执行代码,从硬盘的逻辑扇区2读取到内存的0x16000处

  1. 初始化BSP的页目录和页表

  1. 进行虚拟地址映射,将BSP的代码段从低地址段映射到2G以上

  1. 设置CR3寄存器指向页目录

  1. 映射GDT段的虚拟地址到2G以上

  1. 设置CR0寄存器,启动分页机制

  1. 重新调整BSP的esp堆栈指针

  1. 跳转到BSP真正的执行代码处(0x80016000),开始执行

下面,我们将对mbr.asm代码进行详细解释。

2.1 设置图形模式

整个代码段的起始地址为0x7c00。数据段段地址置为0,堆栈段段地址设为跟CS相同,同时栈指针指向0x7c00。堆栈指针默认向低地址移动,设置为0x7c00不会覆盖0x7c00之上的执行代码。

临时打开系统中断功能,通过BIOS的0x10号中断将系统设置成模式号为0x14CVBE图形模式。该图形模式使用线性帧缓存区模式,分辨率1152×86432位色。设置完成后先关闭系统中断功能,防止不明中断造成宕机。

2.2 进入32位保护模式

GDT段段地址已经在mbr.asm的下方初始化为gdt_global_addr(0x1000)。在这里,将GDT段段地址先赋予eax(实模式下可以使用32位通用寄存器),跳过GDT的0描述符(该描述符不被使用),设置描述符1为代码段。

GDT描述符格式

对于描述符1,低32位写入0x0000ffff,表示:

  • 段基址(16~0)为0;

  • 段界限(16~0)为0x0ffff。

高32位写入0x00cf9800,表示:

  • 段基址(31~24)为0;

  • 段以4K为单位;

  • 段界限(19~16)为0x0f;(20位段界限为全1,单位4K,表示该段为4G大小)

  • 段存在;

  • 段的权限为0

  • 段类型为只执行的代码段

  • 段基址(23~16)为0。

接着设置描述符2为数据段。对于描述符2,低32位写入0x0000ffff,表示:

  • 段基址(16~0)为0;

  • 段界限(16~0)为0x0ffff。

高32位写入0x00cf9200,表示:

  • 段基址(31~24)为0;

  • 段以4K为单位;

  • 段界限(19~16)为0x0f;(20位段界限为全1,单位4K,表示该段为4G大小)

  • 段存在;

  • 段的权限为0

  • 段类型为可读写数据段

  • 段基址(23~16)为0。

GDT段长度写入23,表明段中已有3个描述符(GDT段长度=描述符个数×8-1)。

最后将GDT段加载到GDT寄存器。

到此,BSP使用的代码段和数据段都已经加载到GDT段。

通过读写0x92号端口的方式打开第20号地址线(A20),之后,将CR0控制器的第0位置1启动保护模式。之后使用远跳转指令,CS加载GDT中第1号描述符(代码段),进入32位保护模式。

2.3 启动页式管理机制

此处通过[bits 32]来标明下面的代码已进入32位保护模式。各段寄存器统一加载GDT中的描述符2:数据段描述符。重置esp指针。

将BSP后续的执行代码从硬盘2号扇区开始,拷贝到地址0x16000处,连续拷贝16个扇区,共8K字节。

下面,初始化BSP的页目录和页表。

页目录页地址为0x00003000。先让页目录页的最后一项指向页目录自己,使之后的守护线程在更新页目录或页表时方便操作。如虚拟地址0x FFC0 0000(二进制 1111111111 0000000000 000000000000),指向页目录第0号页表的地址0。

页目录地址在写入页目录之前或上0x3,表示该页可读写,同时已存在。

初始化页表0。页表0的地址为0x00004000。这里是将从0x0地址开始的前1024页内存写入页表0,表示从0x0开始的前4M内存被映射到虚拟地址0x0~0x3FFFFF,且这些地址都可读写。

第0x380号页表对应地址为0x00005000。这一段的操作是将0xE0000000~0xE00FFFFF(4M)这一片区域的内存映射到虚拟地址0xE0000000~0xE00FFFFF,这4M内存是VBE图形缓存帧内存,在界面上画图就是对这块地址区域进行操作。该内存区域的起始地址0xE0000000对应二进制前10位为11100000 00,也就是为页目录的第0x380项。

第0x3BF号页表的地址为0x00006000。这一段操作是将0xFEC00000~0xFEEFFFFF(3M)这一片区域的内存映射到虚拟地址0xFEC00000~0xFEEFFFFF,这3M内存对应APIC的各类寄存器。APIC为高级可编程中断控制器,我们的对系统中断的配置都将通过APIC来实现。APIC的内存区域的起始地址0xFEC00000对应二进制前10位为001111111011,为页目录的第0x3FB项。

将页目录的第0项和第0x800项都指向页表0,这表示0x0~0x3FFFFF这4M的内存既可以通过虚拟地址0x0~0x3FFFFF,也可以通过虚拟地址0x80000000~0x803FFFFF来访问。

将第0x380号页表写入页目录。(0x380×4=0xE00)

将第0x3BF号页表写入页目录。(0x3BF×4=0xFEC)

到此,BSP的页目录、页表都已就绪。

将页目录地址写入CR3控制器。

调整GDT段的基地址,虚拟地址更改为0x80001000。在守护线程的操作中,所有地址都将在2G以上。

CR0控制器的最高位置1,正式启动页式管理。

2.4 跳转到BSP后续代码继续执行

将BSP使用的esp修改到0x80018000页的顶部。

跳转到0x80016000执行BSP后面的代码。

mbr.asm后面的read_hard_disk_0函数主要用于读取硬盘扇区,这里就不详细介绍了。可参考该文章如下:https://blog.csdn.net/scyatcs/article/details/82770853

mrb.asm源代码下载地址:https://download.csdn.net/download/hanspruce_bird/87502143

头文件源代码下载地址:https://download.csdn.net/download/hanspruce_bird/87502152

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

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

相关文章

服务网格领域的百花齐放

服务网格是一种技术架构,它用于管理微服务系统中各个服务之间的通信,旨在处理微服务间的流量(也称为东西向流量)。 ​ 在云原生应用中,一个应用的背后可能存在着成百上千个服务,各个服务可能又有着若干个实…

机器学习——集成学习

引言 集成学习:让机器学习效果更好,单个不行,群殴走起。 分类 1. Bagging:训练多个分类器取平均(m代表树的个数)。 2.Boosting(提升算法):从弱学习器开始加,通过加权来进行训练。…

这样在管理后台里实现 403 页面实在是太优雅了

前言403 页面通常表示无权限访问,与 404 页面代表着不同含义。而大部分管理后台框架仅提供了 404 页面的支持,但却忽略了对 403 页面的处理,有的框架虽然也有对 403 页面的处理,但处理效果却不尽人意。那怎么样的 403 页面才是即好…

异步交互的关键——Ajax

文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2,axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML):异步的 Jav…

【Fastdfs实战】在本地如何将文件上传到Linux虚拟机

作者:狮子也疯狂 专栏:《Fastdfs连续剧》 坚持做好每一步,幸运之神自然会驾凌在你的身上 目录一. 🦁 前言二. 🦁 上传原理Ⅰ. 🐇 原理图解Ⅱ. 🐇 传输原理三. 🦁 实战演示Ⅰ. &…

TryHackMe-CVE-2021-41773/42013(Apache2.4.49/50)

CVE-2021-41773/42013 对 Apache 路径遍历错误的简短解释和不完整的修复 介绍 tryhackme: 在 Apache HTTP Server 2.4.49 中对路径规范化所做的更改中发现一个缺陷。攻击者可以使用路径遍历攻击将 URL 映射到预期文档根目录之外的文件。如果文档根目录之外的文件不受“要求全…

第三阶段-03MyBatis 中使用XML映射文件详解

MyBatis 中使用XML映射文件 什么是XML映射 使用注解的映射SQL的问题: 长SQL需要折行,不方便维护动态SQL查询拼接复杂源代码中的SQL,不方便与DBA协作 MyBatis建议使用XML文件映射SQL才能最大化发挥MySQL的功能 统一管理SQL, 方…

【工程实践】python 去除\xa0、\u3000、\n、\u2800、\t等字符

1.问题描述 在处理数据时,会遇到\xa0、\u3000、\u2800、\t等Unicode字符串。需要对其进行处理。 2.空格类型说明 空格可以分为两类,一类为普通文本空格,另一类为html实体空格。普通文本空格介绍普通半角空格和普通全角空格。html实体空格介绍…

【反序列化漏洞-01】为什么要序列化

为什么要序列化百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过…

浅谈信安文章搜索引擎

一个搜索引擎的实现流程大概为:首先获取海量的数据,整理成统一的格式,然后交给索引程序建立索引,当索引建立好后,就可以进行搜索。简而言之就是:数据获取->数据检索->数据搜索 0x1数据获取 数据获取…

RK3399+FPGA+MIPI 方案细节之subLVDS to MIPI处理

#CROSSLINK系列 #CROSSLINK vs XO3L 总的来说XO3L的灵活性更强,更近似于一片通用的CPLD;CROSSLINK专用性更强。 针对subLVDS转换到MIPI的需求,CROSSLINK比较有优势,因为集成度更高,所以稳定性也更高。 #要点 #crossl…

死锁的总结

哲学家死锁造成的原因:我有你需要的,但你已经有了 饥饿与死锁的区别 死锁一旦发生一定又饥饿现象,但是饥饿现象产生不一定是死锁 历史上对于死锁的声音 死锁的方案 前面两个都是不允许死锁出现 前面都是概念性的东西 后面我们研究如何破坏…

【vue】vuex数据丢失怎么办?盘一盘vue传值的方法

【问题描述】 vuex的 store 中的数据是保存在运行内存中的,当页面刷新时,页面会重新加载 vue 实例,vuex 里面的数据就会被重新赋值,这样就会出现页面刷新vuex中的数据丢失的问题。 如何解决浏览器刷新数据丢失问题呢? …

Java-Springboot整合支付宝接口

文章目录一、创建支付宝沙箱二、使用内网穿透 nat app三、编写java程序四、访问一、创建支付宝沙箱 跳转 : 支付宝沙箱平台 1、进入控制台 2、创建小程序,编写名称和绑定商家即可 3、返回第一个页面,往下滑进入沙箱 4、进行相关的配置&a…

git push -u参数是什么意思?

背景 git push的时候,有时候会用-u参数,有时候不适用。这是为什么呢? 官方解释 -u--set-upstreamFor every branch that is up to date or successfully pushed, add upstream (tracking) reference, used by argument-less git-pull(1) a…

【 Java 组 】蓝桥杯省赛真题 [世纪末的星期] [幸运数] (持续更新中...)

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 蓝桥杯真题--持续更新中...一、世纪末的星期二…

【设计模式】策略模式在Java工程中应用

在之前的文章中,曾经给大家介绍过策略模式:【设计模式】策略模式,在该篇文章中,我们曾很清楚的说到,策略模式主要解决的问题是:在有多种算法相似的情况下,解决使用 if...else 所带来的复杂和难以…

【Spring从成神到升仙系列 一】2023年再不会动态代理,就要被淘汰了

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

BingGPT 国内中转

BingGPT 国内中转 本项目的github地址 本项目最上层是提供一个使用BingGPT的web接口,仅供学习,如有侵权请联系作者。 预先准备: 一个可以访问bingGPT的外网服务器(可在tencent cloud 选购)一个在已经注册new_bing_list的账号 …

泰克示波器MD03012-一款高性能、高可靠性的仪器

泰克示波器MD03012是一款常见的仪器,以其出色的性能和高可靠性被广泛应用于电子工程、教学演示等领域。它采用先进的电子技术,具有高精度、高灵敏度和高可靠性等特点,能够满足工程师们在实际工作中的要求。泰克示波器MD03012拥有一套强大的功…