实模式 BIOS 例程和保护模式

2024-01-11

我正在做一些操作系统实验。到目前为止,我的所有代码都利用实模式 BIOS 中断来操作硬盘和软盘。但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用。如何读写硬盘和软盘?我现在需要做一些硬件驱动程序吗?我该如何开始呢?这是操作系统开发如此困难的原因之一吗?

我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的。例如,我知道硬盘的命令块寄存器范围是从0x1F0到0x1F7。但我想知道这么多不同硬件的寄存器地址在PC平台上是否相同?或者我必须在使用它们之前检测到这一点吗?如何检测它们?

由于我不确定如何在保护模式下读/写软盘或硬盘,因此我现在必须使用 BIOS 中断将所有必需的内核文件从软盘加载到内存中。但如果我的内核文件超出了实模式 1M 空间限制,我该怎么办?

对于任何回复,我表示深深的谢意。

Update

我依稀记得有一个方法可以先切换保护模式,然后再切换回实模式。然后我们就可以在保护模式下使用 BIOS 例程了。也许我记错了。有人记得对吗?


虽然它是possible在保护模式和实模式之间切换,几乎可以肯定not你想做什么。这就是 286 上的工作方式(相当笨拙,因为它根本不支持从保护模式切换回实模式)。然而,从 386 开始,他们添加了 V86 模式,可以在保护模式下作为任务运行。

如果您想在保护模式下使用 BIOS,这几乎肯定是可行的方法。您基本上可以创建一个 V86 任务,切换到它以使用 BIOS,然后切换回另一个任务以执行保护模式代码。

如果你想玩这个,你可能想看看DJGPP http://www.delorie.com/djgpp/zip-picker.html,这是一个 DOS 扩展程序(基本上,就像我刚才描述的那样,用于根据处理磁盘 I/O 等的需要处理 V86 任务的切换)以及相当旧版本的 gcc 的端口,因此您可以可以编写在其上运行的代码。

DOS 扩展器的商业市场现在基本上已经死亡,因此至少有一种以前的商业 DOS 扩展器(HX http://www.japheth.de/HX.html)现已作为开源提供。如果你打算使用它,你可能会想将它与开放沃特康 http://www.openwatcom.org/index.php/Main_Page编译器。

编辑:至于如何读取超过 1 MB 的文件(例如),它很简单但很笨拙:以块的形式读取数据,当您完成读取时,您要么重新映射内存,要么复制内容,将您所读的内容带到您真正想要的地方,然后再读另一块。

就与硬件交谈而言:很大程度上取决于您是否只想要在某种程度上起作用的东西,或者您是否想充分利用现有的硬件。只需使用基本的 IDE 端口即可与几乎所有非 IDE 端口进行通信really古老的——但是要充分利用硬件需要做很多工作。 IDE/ATAPI 驱动器使用了大约六种不同的 DMA 模式,每种模式的设置都略有不同。其中相当一部分已经足够老了,您可能不关心它们,因此您可能只想直接支持几个最新的,而对于其他任何内容,则退回到基本(非 DMA)传输。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实模式 BIOS 例程和保护模式 的相关文章

  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 汇编中如何计算负数

    我是汇编新手 我有一个关于如何表示负数的问题 我有三个 DWORDS 变量 比方说 result DWORD 0 i DWORD 3 j DWORD 5 我想计算这个公式 结果 i j 8 但是 当我执行 i j 时 由于符号 结果将是一个
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • AVX512 掩码寄存器(k1...k7)的 GNU C 内联 asm 输入约束?

    AVX512 为其算术命令引入了 opmask 功能 一个简单的例子 上帝螺栓 org https godbolt org z P7xWD8 include
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4

随机推荐

  • Rails 中什么时候需要重启服务器?

    我注意到当我更改 Rails 项目文件时 例如html erb or css 我不必使用以下命令重新启动服务器rails s命令 但我认为当我想安装新的 gem 时我必须这样做 问题是我正在尝试让 jQuery 工作 所以我厌倦了这样做ra
  • api_platform 产生错误“找不到 uri [/index/_doc/_search] 和方法 [POST] 的处理程序”

    当尝试通过 fos elastica bundle v6 0 0 将 elasticsearch v7 9 3 实现到我的 Symfony v5 3 10 App with api platform v2 6 6 中时 我不断收到此错误 e
  • asp.net mvc参数从页面到局部视图

    我遇到了一个问题 我有一个传递参数的 ajax 链接 但是它打开的页面不需要该参数 该页面仅加载 2 个部分视图 其中一个需要将该参数传递给页面才能正确加载数据 另一个只需要加载表单 因此不需要该参数 我怎样才能做到这一点 为了执行您想要的
  • 使用 Spring MVC 处理 MaxUploadSizeExceededException

    当文件大小超出时 如何拦截并发送文件上传的自定义错误消息 我在控制器类中有一个带注释的异常处理程序 但请求未到达控制器 我在此链接中找到的答案如何处理MaxUploadSizeExceededException https stackove
  • 为什么需要softmax函数?为什么不进行简单的标准化呢?

    我对深度学习不熟悉 所以这可能是一个初学者问题 根据我的理解 多层感知器中的softmax函数负责标准化和分配每个类别的概率 如果是这样 我们为什么不使用简单的标准化呢 假设我们得到一个向量x 10 3 2 1 应用softmax 输出将是
  • Request.IsAjaxRequest 在 POST 上返回 false

    我的问题类似于this one https stackoverflow com questions 1702837 request isajaxrequest returns false我遇到了类似的问题 但一个很大的区别是我使用的是 Aj
  • 如何在Python中控制string.format(bool_value)结果的长度?

    等效的方法是什么str format将布尔值转换为字符串的函数 gt gt gt 5s True True gt gt gt 5s False False 请注意其中的空格 True 这始终使 True 和 False 的长度相同 我已经检
  • 我应该在哪里存储登录数据?

    我正在创建一个小应用程序 让用户输入他的 Google 帐户名称和密码 并向他显示他的 Google 云端硬盘帐户上的可用电子表格 我想让用户能够保存以下数据 正确或错误 是否自动连接到他的帐户 Google 帐户名 电子邮件 Passwo
  • DictReader,无引号,选项卡式文件

    我有一个 csv 文件 如下所示 请注意 没有引号 制表符 t 是分隔符 标题和实际内容之间有一个空行 Facility No Testing No Name Age 252 2351 Jackrabbit Jazz 15 345 257
  • 与 Google 日历 API v3 进行未经授权的交互

    我的情况与this guy https stackoverflow com questions 10112939 login required 401 unauthorized message when calling the v3 goo
  • 获取 Firestore 子集合

    我在从以下位置获取数据时遇到问题火库具有以下结构 这是我获取类别集合的方法 var defaultStore Firestore var location DocumentSnapshot override func viewDidLoad
  • 空手道 - 有没有一种方法可以在字符串正则表达式中使用变量

    空手道 有没有一种方法可以在字符串正则表达式中使用变量 类似于下面的东西 match each productCodes regex i codes 任何替代方案或最佳实践将不胜感激 我试图从响应中获取一个字符串数组 以便每次进行匹配 一次
  • 在“VI”编辑器中对行进行排序

    如果我必须根据 左侧的值对以下行进行排序 但排序应同时将选择范围扩展到 之后的列 这就是我们不必在 之后对列进行排序 50599 1000000 50454 00000054 50080 00005464 50098 00000875 50
  • Ruby on Rails:根据数据库排序规则比较两个字符串

    我有一个单词列表 想查找数据库中已经存在的单词 我决定使用 SELECTword FROM table WHERE wordIN array of words 然后循环结果 问题是数据库排序规则 http www collat ion ch
  • f32 未实现减法?

    编译以下代码时 use std io fn main let reader stdin let nums reader lock lines next unwrap unwrap split whitespace map s s parse
  • CouchDB 全文搜索

    我需要一些有关 couchdb 中全文搜索的指导 它是否已经在 2 0 中默认启用 或者我们是否必须重建 couchdb 才能启用它 设想 它是一个文档管理系统 文档以网格形式显示 我需要能够对结果进行排序 经过从地图减少到弹性索引的几次更
  • Django 中没有 TEMPLATE_CONTEXT_PROCESSORS

    我没有TEMPLATE CONTEXT PROCESSORS在我的默认设置中 TEMPLATE CONTEXT PROCESSORS django contrib auth context processors auth django co
  • “不知道该怎么办”nvcc 致命错误

    我在 Ubuntu 终端中使用命令行 我正在尝试编译 CUDA Compiler Driver NVCC pdf 中提供的三个文件 当我使用这 3 个文件的文档给出的命令行时 我确实收到以下错误 nvcc fatal 不知道如何处理 dc
  • 如何知道站点查询字符串的所有可能参数是什么?

    我想检查任何现有网站网址的所有可能参数是什么 假设该站点正在使用参数类型查询字符串 architecture 例如不是 MVC 如下所示 http www foobar com p1 itemsPerPage 50 size 500 假设还
  • 实模式 BIOS 例程和保护模式

    我正在做一些操作系统实验 到目前为止 我的所有代码都利用实模式 BIOS 中断来操作硬盘和软盘 但是一旦我的代码启用了CPU的保护模式 所有实模式BIOS中断服务程序将不可用 如何读写硬盘和软盘 我现在需要做一些硬件驱动程序吗 我该如何开始