【问题标题】:Bios Interrupts in assembly language汇编语言中的 Bios 中断
【发布时间】:2019-09-25 17:58:39
【问题描述】:

如何在 32 位架构上使用 NASM 以汇编语言调用中断。我尝试了很多次,但结果并不理想。

在 Linux 上“核心转储错误”和在 Windows 上,CMD 上没有任何反应。我深入了解了 32 位用户应用程序在 ring 3 级别下运行,内核和驱动程序在 ring 1 中运行。我该如何在用户级别执行此操作?

我在 YouTube 上关注某人,他使用 C++ 或 C(使用内联和外部汇编文件)在 Visual Studio 上工作得很好,但是当我在外部文件或内联中调用任何中断时,Visual Studio 会显示内存位置违规错误。

Intel 32 位架构(环级)。

【问题讨论】:

标签: linux windows assembly x86 bios


【解决方案1】:

您不能在 Linux 或 Windows 等操作系统下使用 BIOS(或 DOS)中断。使用系统调用 (Linux) 或 WinAPI 库调用 (Windows)。

在 Linux 和 Windows 下都没有可移植的 ABI 用于在您自己的进程之外的程序集中与系统交互; MacOS 也不兼容。


使用 BIOS 中断:

  • 确保 BIOS 存在并且它所依赖的所有状态都没有被修改。如果计算机使用 UEFI 启动,则 BIOS 不存在。如果操作系统已经启动,它会破坏 BIOS 所依赖的状态(例如 PIC 芯片配置、PIT 配置、PCI 配置空间、BIOS 数据区域、IVT 等)。

  • 确保您处于实模式或类似模式。如果您的代码是 32 位,那么您需要切换回实模式,或设置 virtual8086 任务(及其监视器),或使用某种模拟器(例如解释 BIOS 的代码而不是直接执行它)。

请注意,在某些特殊情况下(例如,被 ACPI 取代的旧的“高级电源管理”API、VESA BIOS 扩展)提供了保护模式接口作为(有时是可选的)替代方案。这些大多是痛苦的(例如,涉及为“16 位保护模式”设置特殊描述符并将二进制 blob 复制到其中)并且几乎不值得麻烦。

【讨论】:

  • 如何在没有 UEFI 的情况下启动
  • 目前大多数 80x86 计算机在固件设置中支持“BIOS 兼容性” - 您需要更改设置,然后安装操作系统以使用 BIOS 启动。然而;英特尔表示,明年英特尔 CPU/芯片组/主板将不再支持 BIOS 兼容性(我希望其他制造商也会这样做);所以用不了多久你就根本无法从 BIOS 启动(没有虚拟机)。
  • 注意:理想情况下,您会使用“引导加载程序”来抽象固件的详细信息(例如,获取内存映射、设置视频模式/帧缓冲区、从您正在引导的任何设备加载内容,然后将系统进入“为操作系统定义”状态),因此整个操作系统中没有其他任何东西有理由关心固件是什么;这样就很容易支持不支持 UEFI 的旧计算机和不支持 BIOS 和其他任何东西的新计算机(例如“kexec()”),只需安装不同的引导加载程序并且没有理由触摸任何东西否则。
  • 当然这(“作为抽象层的引导加载程序”)意味着您需要在引导后避免“固件依赖” - 例如使用 ACPI 进行电源管理(而不是古老的 BIOS APM 接口),有一个“通用帧缓冲区”视频驱动程序,除非/除非您编写本机视频驱动程序,否则无法更改视频模式,不要将 BIOS 服务用于磁盘 IO (并为此提供本机驱动程序)等等。幸运的是,这些都是一个好的操作系统无论如何都想做的事情(为了性能,为了提供更好的功能等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2012-07-07
  • 1970-01-01
  • 2017-04-27
  • 2010-12-24
  • 2011-10-22
相关资源
最近更新 更多