操作系统如何找到外围设备分配的地址?

时间:2017-08-27 22:18:35

标签: operating-system bios uefi memory-mapping bootable

好的,这就是我的意思:

我们假设您要编写自己的可引导代码。

此外,您的代码将变得非常简单。

事实上,这很简单,它只包含一条指令。

您的可启动代码将写入字节或字或双字或其他任何内容到外围设备上的寄存器或RAM位置,而不是主RAM或CPU寄存器。

如何确定BIOS / UEFI已为该外设内存位置分配了哪些地址?

这是一个更具体的例子:

我的可引导代码的第一条也是唯一一条指令会将数字11H写入声卡上的寄存器。

如果BIOS / UEFI初始化代码正常工作,那么声卡寄存器应该映射到CPU的内存空间和/或IO空间。

我需要找到那个地址才能完成写作。

我如何找到它?

这是真正的操作系统必须在某些时候做的事情。

在Windows中打开控制面板/设备管理器时,您会看到其中列出的外围设备的所有内存范围。

在某些时候,Windows必须查询BIOS / UEFI才能找到这些数据。

再次,这是怎么做到的?

编辑:

这是我尝试编写这个可启动程序集程序:

=

我为X准备了多少个号码?如何找到该外设寄存器的地址?

1 个答案:

答案 0 :(得分:2)

如果要使用一条指令执行此操作,只需从Windows设备管理器获取设备的地址即可。但是如果你想以“正确”的方式进行,你需要扫描PCI总线以找到你想要编程的设备,然后读取设备的基地址寄存器(BAR)以找到它的MMIO范围。这就是Windows的功能;它不会查询BIOS。

要查找要访问的设备,请扫描PCI总线以查找该设备。通过“BDF”(总线/设备/功能的简称)在PCI总线上寻址设备。设备由供应商ID和供应商分配的设备ID标识。

读取每个BDF的偏移量0和2以获取供应商ID和设备ID。找到要编程的设备后,请在10h到24h之间的偏移处读取正确的32位BAR值。您需要知道哪个BAR包含您要编程的寄存器,该寄存器特定于您正在使用的设备。

本文介绍如何访问PCI配置空间,并在C中提供示例代码,说明如何扫描PCI总线。 http://wiki.osdev.org/PCI