初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

这篇具有很好参考价值的文章主要介绍了初始化引导程序 & 使用BIOS中断显示字符、读取磁盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初始化引导程序

基本概念

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

 工程实战

进入start 示例工程

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

使用BIOS中断显示字符

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

使用BIOS中断读取字符

将引导程序分成2部分:

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

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

INT13磁盘读取

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

然后build,

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

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

进入C语言环境并跳到loader

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

主要流程为如下所示:

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

第一步:从汇编到C

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

 初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

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

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

利用内嵌汇编显示字符串

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

 初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

检测内存容量(1)

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

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

检测内存容量(2)

未完待续....

切换进程保护模式(1)

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

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

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

CPU流水线

初始化引导程序 & 使用BIOS中断显示字符、读取磁盘

切换进程保护模式(2)

//未完待续.....文章来源地址https://www.toymoban.com/news/detail-413665.html

到了这里,关于初始化引导程序 & 使用BIOS中断显示字符、读取磁盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • video中视频初始化显示第1帧

    1个视频url放入video组件中,页面初始化的时候是黑的 解决办法: html js

    2024年02月12日
    浏览(25)
  • lcd1602 初始化失败 显示一排黑块

    刚刚开始自学单片机,之前一段时间为这种情况烦了很长时间,始终没有得到很好的解答。今天重新学了一下,终于找到了原因。 因为你使用P0引脚没有上拉电阻。 单片机的不同IO口是有区别的,P0最特殊,它没有自带上拉电阻。之前我把RS RW E全接在P0引脚上了,结果初始化

    2024年02月11日
    浏览(25)
  • element-ui el-scrollbar滚动条初始化不显示

    当使用el-scrollbar的时候,比如你的数据列表是后端获取的,这时候,初始化的时候,因为数据还没有获取到,导致里面的内容没有撑开,所以滚动条是不显示的,但是可以正常滚动。 解决方法: 获取左侧菜单的数据时, div style=\\\" height: calc(100vh - 120px);over-flow:hidden\\\"     el-sc

    2024年02月09日
    浏览(37)
  • 微信小程序项目初始化配置

    注:该文章用于记录或学习交流 微信小程序项目初始化配置准备,包括项目创建,基础路径配置,组件库安装,接口请求封装,部分实用组件封装等 创建初始项目后,对项目文件结构重新梳理 注:目录结构根据个人需求创建,assets和static文件夹的区别详见 assets与static的区别

    2023年04月08日
    浏览(70)
  • 微信小程序 ---- 慕尚花坊 项目初始化

    目录 项目介绍 01. 项目概述 02. 项目演示 03. 项目技术栈 04. 接口文档 申请开发权限 项目初始化 01. 创建项目与项目初始化 02. 自定义构建 npm + 集成Sass 03. 集成项目页面文件 04. VsCode 开发小程序项目 01. 项目概述 [慕尚花坊] 是一款 同城鲜花订购 的小程序,专业提供各地鲜花速

    2024年02月22日
    浏览(30)
  • 安装hive中初始化元数据库失败,显示Failed to get schema version

    我在搭建数据仓库的时候,安装hive包初始化元数据库失败。在网上找了几种方法都没解决成功,然后我又重新看了一下问题,问题当中还显示了:无法使用MySQL以‘root‘@‘localhost‘。 原因分析: 1、权限问题:mysql版本的驱动包不对应,一般 linux系统下的jar为后缀 2、密码问

    2024年02月05日
    浏览(32)
  • 初始化列表的使用

    问题 类中是否可以定义 const 成员? 可以的 下面的类定义是否合法? 如果合法,ci 的值是什么,存储在哪里? 上面的 Test 类定义是合法的,但是要定义 Test 类对象的时候,编译器会报错,提示 const 成员变量 ci 没初始化 类中的 const 成员 我们对上面的代码进行编译,编译直

    2024年02月09日
    浏览(42)
  • Pytorch基本使用—参数初始化

    深度学习模型参数初始化是指在训练深度神经网络时,对网络的权重和偏置进行初始化的过程。合适的参数初始化可以加速模型的收敛,并提高模型的性能。 在深度学习中, 常用的参数初始化方法有以下几种: 零初始化(Zero Initialization):将所有权重和偏置初始化为0。然

    2024年02月16日
    浏览(37)
  • 【微信小程序】初始化 wxCharts,调用updateData动态更新数据

    要初始化 wxCharts,你需要按照以下步骤进行操作: 首先,确保已将 wx-charts.js 文件正确引入到小程序的相应页面或组件中。可以通过以下方式引入: 请根据你的项目结构和实际路径进行相应的调整。 在页面或组件的 onLoad 生命周期函数中,创建一个图表实例并传递必要的配置

    2024年02月14日
    浏览(32)
  • AliLinux的使用Docker初始化服务(详细)

    AliLinux是基于CentOS的。 1、java 环境 2、mysql环境 3、kafka环境 4、flink环境 5、dinky环境 这些环境,本想直接dnf安装在宿主机上,思来想去,还是用docker方便学习,也方便统一管理和使用 sudo dnf update sudo dnf upgrade 2.1、熟悉docker的命令 2.2、添加Docker存储库 需要注意不同的linux的版本

    2024年02月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包