Operating system 操作系统如何找到外围设备';s分配的地址?

Operating system 操作系统如何找到外围设备';s分配的地址?,operating-system,bios,uefi,memory-mapping,bootable,Operating System,Bios,Uefi,Memory Mapping,Bootable,好的,我的意思是: 假设您想编写自己的可引导代码 此外,您的代码将非常简单 事实上,它非常简单,只包含一条指令 您的可引导代码将向外围设备上的寄存器或RAM位置写入字节、字、双字或任何内容,而不是主RAM或CPU寄存器 如何找出BIOS/UEFI为该外设内存位置分配的地址 这里有一个更具体的例子: 我的可引导代码的第一条也是唯一一条指令将数字11H写入声卡上的寄存器 如果BIOS/UEFI初始化代码正常工作,则该声卡寄存器应映射到CPU的内存空间和/或IO空间 我需要找到那个地址来完成那篇文章

好的,我的意思是:

假设您想编写自己的可引导代码

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

事实上,它非常简单,只包含一条指令

您的可引导代码将向外围设备上的寄存器或RAM位置写入字节、字、双字或任何内容,而不是主RAM或CPU寄存器

如何找出BIOS/UEFI为该外设内存位置分配的地址

这里有一个更具体的例子:

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

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

我需要找到那个地址来完成那篇文章

我怎么找到它

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

在Windows中打开“控制面板/设备管理器”时,将看到此处列出的所有外围设备的内存范围

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

再说一遍,这是如何做到的

编辑:

以下是我编写此可引导汇编程序的尝试:

    BITS    16
    ORG     100h
start:
    ;I want to write a byte into a register on the sound card or NIC or 
    ;whatever. So, I'm using a move instruction to accomplish that where X 
    ;is the register's memory mapped or IO mapped address.
    mov X,11h
times 510 - ($ - $$)  db 0
dw 0xaa55

X的号码是多少?如何查找此外设寄存器的地址?

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

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

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


本文描述了如何访问PCI配置空间,并用C语言编写了示例代码,展示了如何扫描PCI总线

欢迎来到stackoverflow。请提供您的具体问题代码。这证明了你做了多大的努力,它将帮助其他成员更好地理解你的问题,同时,你将为他们提供你的问题的背景。请查看这些链接:谢谢你,先生(或女士)!