【问题标题】:How to access x64 hardware directly without Hardware Abstraction Layers?如何在没有硬件抽象层的情况下直接访问 x64 硬件?
【发布时间】:2016-07-04 00:10:07
【问题描述】:

我有一个奇怪的问题,但我对这个话题很感兴趣。

是否有可能直接访问当前基于 x64 的计算机的硬件而无需使用某种 HAL(硬件抽象层)或其他操作系统的挂件(udev、upower、...)?而且我不是在谈论开发某个设备驱动程序,而是在谈论使用 C 或汇编程序或类似的东西进行简单的“Hello World”编程。

我知道诸如多个 cpu 内核和多线程之类的事情使这种编程对于最常见的情况变得毫无意义。但是,我很想知道这是否可能,如果可能,你怎么做?

我的重点在于基于 Linux 的操作系统。据我所知,自 98 / ME 以来,在基于 Microsoft 的操作系统上是不可能的

非常感谢您提前付出的努力和最诚挚的问候, B.

【问题讨论】:

  • int 0x80 是 HAL 吗?保护模式操作系统以保护模式运行;仅允许操作系统直接访问硬件。首先,您的"Hello World" 将显示在哪里?
  • 您想直接访问哪个硬件?您可以轻松访问诸如 cpu-register 之类的东西(毕竟它们是硬件),但访问诸如 MMU 之类的东西是特权。
  • 简短回答:不。如果你能做到这一点,它就会破坏让操作系统保护你的资源的意义。也就是说,您可以让进程以必要的权限运行访问物理内存(在您要求操作系统将其映射到您的地址空间之后),因此如果您使用控制台,理论上您可以将某些内容打印到 VGA 文本内存中。跨度>
  • ad where) 它将使用控制台显示。广告哪个硬件)它想在汇编中做类似 mov-commands 的事情,所以我想直接访问 CPU 和内存。我不确定是否需要访问某些 I/O 端口才能在控制台上显示某些内容。 ad HAL)据我所知,甚至操作系统也不再直接访问硬件。他们使用 HAL 之类的东西访问硬件,以实现最大的可移植性。如果我编写一个默认的汇编程序并且我正在使用 mov-commands 我正在使用 HAL 而不是直接访问 CPU。但是我想直接访问CPU。
  • 如果您想直接访问硬件,您可能会考虑编写设备驱动器。它们只是普通程序,但显然运行在完全不同的环境中。它们没有什么神奇之处,但显然你需要了解制作它们的要求。

标签: c++ c linux assembly hardware-programming


【解决方案1】:

不,您无法使用任何语言执行此操作。原因很简单——在任何现代架构中,用户程序都在所谓的保护模式下运行。这意味着(除其他外)您无法访问实际内存 - 相反,CPU 与操作系统一起将您的程序正在使用的内存地址转换为其他内容。

为了与硬件通信,您确实需要访问该硬件使用的内存区域 - 而这在保护模式下是完全不可能的。

【讨论】:

  • 所以不可能在 Linux 或 Windows 或类似的东西下以实模式运行以任何语言编写的程序?此外:它在 Linux 下也称为实模式还是 Windows 特定的术语?
  • @user4587483,是的,实模式 是特定于 CPU 的术语,而不是特定于操作系统的术语。是的,你不能从保护模式切换到从环 3 开始的实模式,你的应用程序正在正常执行。
  • 您当然可以从保护模式切换到实模式,但不能从环 3 切换到实模式 :) 而且这样启动到实模式会更容易。
  • @Jester,对于戒指 3 来说已经足够了。我会更新的。至于启动,我想,这意味着您不再是应用程序,而是操作系统:)
  • 好的,非常感谢您的快速回答。但实模式是 32 位的东西,不是吗?据我所知,64 位挂件是长模式。我猜 x64 上的长模式和 x86 上的实模式一样,对吧?
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
相关资源
最近更新 更多