引导程序、BIOS中断、检测内存容量、实模式切换到保护模式

初始化引导程序

基本概念

 BIOS会将磁盘的第0个扇区(大小为512字节),加载到0x7c00处。

引导程序负责操作系统的加载,主要用于为操作系统运行提供初始化环境,并运行加载操作系统。

BIOS只加载磁盘的第0个扇区(512字节)到内存中,次程序无法做很多事情。

因此,我们可以采取以下两种方式种的任意一种。

 X86在上电后,自动进入实模式,目的是为了兼容早期的应用程序。

 X86与编程相关的主要内核寄存器

 AX BX CX DX 是32位寄存器,在实模式的情况下,只能使用低16位寄存器。高16位寄存器是要留给切换到保护模式的。

CS DS SS ES FS GS 为段寄存器,为访问特定内存地址,需要采用段寄存器:偏移的形式。

8086 CPU 在实模式工作的情况下,内存映射。只能够访问1M的内存空间,如下图所示:

 工程实战

进入start 示例工程

在source/boot/start.S 添加如下代码。

先build,然后F5启动调试,可以看到各个段寄存器都为 0X0。

按下F11进行单步进行调试。

可以看到进行单步调试前,esp寄存器为:0x6f00

单步调试到27行,esp寄存器就变为:0x7c00

使用BIOS中断显示字符

BIOS提供了一组服务,可以方便地帮助我们操作硬件,避免与硬件细节打交道。

当触发软中断的时,会自动从中断向量表中取相应的地址执行,参数通过寄存器传递。

使用BIOS中断读取字符

将引导程序分成2部分:

1.Boot只是做一些简单的工作,它的程序容量比较小,不超过512字节。

2.把更多的工作放在loader里面做。

BIOS提供了磁盘读取的接口,方便我们从磁盘上读取loader。

 BIOS只加载磁盘的第0扇区(512字节)到内存中,此部分程序无法做很多事情。

INT13磁盘读取

然后build,

 打开disk1.img磁盘镜像文件,可以看到 55 AA后面,是 E9 0E 开始。

 -exec x /20bx 0x8000  ==> 20代表20个字节 b代表byte x代表十六进制

可以看到0x8000地址处的数据为 0xe9 0x0e 0x03 ... 和磁盘中的数据是一样的。说明磁盘的读取是成功的。

进入C语言环境并跳到loader

如果生成loader并写入磁盘映像?怎么样从boot跳转到loader执行呢?

主要流程为如下所示:

第一步:从汇编到C

在source/boot/start.S 目录下添加如下代码,加上断点调试可以进入 boot.c文件中的 这个函数boot_entry 。

然后在source/boot/ 目录下,新增loader文件夹,在loader文件夹下面添加start.S汇编文件,汇编文件的内容如下所示:

添加loader.h loader_16.c(16位实模式) loader_32.c(32位模式)

 

第二步:添加工程配置文件

首先在顶层的CMakeLists.txt 进行 add_subdirectory

第三步:添加函数指针进行跳转

利用内嵌汇编显示字符串

BIOS提供了一组服务,可以方便地帮助我们操作硬件,避免与硬件细节打交道。

在loader_16.c文件中,添加 show_msg 字符串显示函数,在17行加上断点,编译运行,可以看到:

 

为了防止汇编器对汇编代码进行优化,通常使用 __asm__ __volatile__

检测内存容量(1)

参考:检测内存容量 · 语雀

首先在source目录下新建comm文件夹,然后分别新建2个文件 types.h和 boot_info.h,这两个文件的内容分别如下所示:

 

 

在loader文件夹下的 loader.h 文件,添加对应的文件。

 

在loader目录下的 loader_16.c文件下,添加一个全局的 boot_info_t 变量。

 

检测内存容量(2)

未完待续....

切换进程保护模式(1)

 

CPU上电复位后默认进入实模式,这种模式下没有保护机制,但提供了BIOS服务。(相当于单片机)

 

与此同时,实模式下可以使用BIOS提供的各种服务接口。

 

保护模式为后面增加的功能,为操作系统以及应用程序的运行添加很多支持。

 

从实模式切换到保护模式,需要遵循一定的流程。

 

CPU流水线

 

切换进程保护模式(2)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记本电脑开不了机?3种解决方法

案例:笔记本电脑开不了机怎么办? 【我的笔记本电脑一直用得好好的,今天突然开不了机,尝试按了开机键很多次也没有解决。有人遇到过同样的问题吗?有没有解决的方法!】 在日常生活中,我们经常会…

【计算机网络——计算机网络的概念,组成,功能和分类以及相关的性能指标,分层结构和协议,TCP/IP参考模型】

文章目录计算机网络体系结构计算机网络的概念、组成、功能和分类标准化工作及相关组织速率相关的性能指标时延、时延带宽积、PTT和利用率分层结构、协议、接口和服务OSI参考模型TCP IP参考模型计算机网络体系结构 计算机网络的概念、组成、功能和分类 计算机网络的概念 计算…

游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

华为 HMS Core 游戏内嵌社区服务提供快速访问华为游戏中心论坛能力,支持玩家直接在游戏内浏览帖子和交流互动,助力开发者扩展内容生产和触达的场景。 一、为什么要游戏内嵌社区? 二、游戏内嵌社区的典型使用场景 1、游戏内打开论坛 您可以在…

【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)

1、主循环 《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。如下图所示,图中的balls和foods代表服务端的状态,在循环中执行“食物生成”“位置更新”和“碰撞检 测”等功能,从而…

商城系统开发方案分析

互联网的不断发展,电商行业已经成为了当前最重要的商业形式之一。商城系统的开发也因此而备受关注。商城系统的开发是针对B2C、B2B2C等多种商业模式,如用户熟知的SHOP、商派等一系列商城系统,将商品和服务进行在线销售的一个综合性平台。那么…

【C语言进阶:动态内存管理】常见的动态内存错误

本节重点内容: 对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)经典的笔试题⚡对NULL指针的解引用操作 ⚡对动态…

Linux基础命令-seq打印数字序列

Linux基础命令-sed流编辑器 前言 seq命令通常是用来打印一串有规律的数字,常与其他命令搭配使用,一起来看下它的用法。 一. 命令介绍 在doc文档中查看seq命令的含义 NAMEseq - print a sequence of numbers DESCRIPTIONPrint numbers from FIRST to…

李宏毅教程系列——增强学习

目录 0. 强化学习wiki 1. 介绍 2. Exploration vs Exploitation 探索与开发 3. 各类最优化方法 3.1 Brute force猛兽蛮力法(暴力搜索) 3.2 Value function estimation(价值函数估计) 3.2.1 Monte Carlo methods 蒙特卡洛方…

3年经验,面试测试岗只会功能测试开口要求18K,令我陷入沉思。

由于朋友临时有事, 所以今天我代替朋友进行一次面试,公司需要招聘一位自动化测试工程师,我以很认真负责的态度完成这个过程, 大概近30分钟。 主要是技术面试, 在近30分钟内, 我与被面试者是以交流学习的方式…

【Linux】通过网络版计算器来认识协议

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉再谈协议&…

腾讯云4核8G12M轻量服务器配置性能评测

腾讯云轻量4核8G12M服务器,之前是4核8G10M配置,现在公网带宽和月流量包整体升级,12M公网带宽下载速度可达1536KB/秒,系统盘为180GB SSD盘,每月2000GB免费流量,腾讯云百科来详细说下4核8G12M轻量应用服务器配…

AJAX | 拦截器、文件上传和下载

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! AJAX Ajax即Asynchronous Javascript And XML(异步JavaScript和XML);Ajax技术网页应用能够快速地将增量更新呈现在用户界面上&…

锁子甲 bulid+sim

链接: youtube 分析:洒一堆点——copy 模型——点和模型符合一定规律 点和点的距离符合上述图中的关系 (横纵) 横向 但是我们要横向10个点够了: 用modulo 除余 纵向 这里用除法向上取整 /10 eg : 0-9 得0 10-19 得1…

redis哨兵模式配置(配置文件等)

Redis-Sentinel机制主要用三个功能: (1)监控:不停监控Redis主从节点是否安装预期运行 (2)提醒:如果Redis运行出现问题可以 按照配置文件中的配置项 通知客户端或者集群管理员 (3)自动故障转移:当主节点下线之后,哨兵…

【版本控制】Github同步Gitee镜像仓库自动化脚本

文章目录Github同步Gitee镜像仓库自动化脚本前言什么是Hub Mirror Action?1.介绍2.用法配置步骤1.生成密钥对2.GitHub私钥配置3.Gitee公钥配置4.Gitee生成私人令牌5.Github绑定Gitee令牌6.编写CI脚本7.多仓库同步推送8.定时运行脚本总结Github同步Gitee镜像仓库自动…

【MyBatis Plus】002 -- 通用CRUD(插入、更新、删除、查询)

目录 3、通用CRUD 3.1 插入操作 3.1.1 方法定义 3.1.2 测试用例 3.1.3 测试 3.1.4 TableField 3.2 更新操作 3.2.1 根据id更新 3.2.2 根据条件更新 3.3 删除操作 3.3.1 根据id删除(deleteById) 3.3.2 根据Map删除数据(deleteByMap&#xff09…

Level_2(2)题目整理

文章目录L2-022 重排链表(模拟❗)L2-023 图着色问题L2-024 部落(并查集)L2-025 分而治之(与 L2-023差不多,邻接表遍历)L2-026 小字辈(求树的深度)L2-027 名人堂与代金券(💡处理&…

得物 API一站式协作平台的一些思考

1.背景 Mooncake是得物API一站式协作平台。从2022年3月份开始负责Mooncake,到现在已经一年了,回顾这一年,Mooncake大的阶段上,总共经历过两个版本: 1、Mooncake 1.0: 面向前端和客户端的mock平台,主要解决接口调用者…

C++实现前缀树

文章目录1. 什么是前缀树2. 前缀树的实现2.1 前缀树的基本结构2.2 插入2.3 word出现了几次2.3 word作为前缀出现几次2.4 删除1. 什么是前缀树 假设这里有一个字符串数组,和一个树的根结点: 这个结点的pass意思是:有几个字符通过了这个结点。…

ubuntu下Thrift安装

thrift是一种常用rpc框架,工作中经常会用到,本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装(注意步骤) 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…