2017-08-27 285 views
0

好的,這裏是我的意思:操作系統如何找到外設的分配地址?

假設你想編寫自己的可啓動代碼。

此外,您的代碼將非常簡單。

這麼簡單,實際上它只包含一條指令。

您的可啓動代碼將寫入一個字節或字或雙字或任何內容到外圍設備上的寄存器或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?我如何找到這個外設寄存器的地址?

+0

歡迎使用stackoverflow。請,你能提供一些你的具體問題的代碼嗎?這可以證明你嘗試了多遠,它會幫助其他成員更好地理解你的問題,當時,你會給他們一個你的問題的背景。請檢查以下鏈接:https://stackoverflow.com/help/mcve和https://stackoverflow.com/help/how-to-ask –

回答

2

如果你想用一條指令來做到這一點,你可以從Windows設備管理器獲取設備的地址。但是,如果您想以「正確」方式執行此操作,則需要掃描PCI總線以找到要編程的器件,然後讀取器件的基地址寄存器(BAR)以查找其MMIO範圍。這是Windows所做的;它不查詢BIOS。

要查找要訪問的設備,請掃描PCI總線尋找設備。設備通過其「BDF」(總線/設備/功能的簡稱)在PCI總線上尋址。設備由供應商分配的供應商ID和設備ID標識。

讀取每個BDF的偏移量0和2以獲得供應商ID和設備ID。當您找到想要編程的設備時,請在10小時和24小時之間的偏移量處讀取正確的32位BAR值。您需要知道哪個BAR包含您要編程的寄存器,這是特定於您正在使用的設備的。

本文介紹如何訪問PCI配置空間,並在C中顯示示例代碼,顯示如何掃描PCI總線。 http://wiki.osdev.org/PCI

+0

謝謝,先生(或女士)! – tensor

相關問題