2011年8月29日 星期一

自製BenOS支援lspci 命令

image
在實現網路支援之前,必須先能使用PCI Bus來找到網路卡相關資訊,
參考OSDev.org的"Where I can find Programming Info on PCI?”一文後,
筆者已在Bos實現了lspci 命令,參考"Configuration Mechanism #1”完成,下列程式,
其實一開始,最先遇到問題部分是如何讀取PCI?
原文使用sysOutLong() 和sysInLong(), 對照MIT OSE Lab相關資料,實作如下:
static __inline uint32_t inl(int port)
{
        uint32_t data;
        __asm __volatile("inl %w1,%0" : "=a" (data) : "d" (port));
        return data;
}
static __inline void outl(int port, uint32_t data)
{
        __asm __volatile("outl %0,%w1" : : "a" (data), "d" (port));
}
筆者也試了一下NASM的寫法如下:
        global _inl, _outl
;uint32_t _intl(int port)
_inl:
        mov  edx, [esp+4]
        mov  eax, 0
        in eax, dx
        ret
;void _outl(int port, uint32_t data)
_outl:
        mov  edx, [esp+4]  ; io port
        mov  eax, [esp+8]  ; data
        out  dx, eax
        ret
之後,實作pci_conf_readl與pci_conf_readw,先試作讀取的部分:
完整程式碼請參照kernel/pci.ckernel/osfunc.s,從GitHub 上bos下載。

結論

在程式實作過程中,只要依照PCI所定義的資料表,將所需要的資料取出,存到一個PCI資訊的陣列中。
當有需要時,再從PCI 資訊陣列中取出相對應的記錄一一列出便可得到文章開頭的螢幕畫面。
其中一筆如下:
vendor:0x8086, devid:0x100E, class:0200(Network Controller), rev=3
0x100E指得便是e100的Intel網路卡。而它便是筆者正在研究議題的網路卡資訊來源之一, 提供網路實作使用。

(註一:軟語錄:"提高程式設計功力的方法無它,便是不斷地實作與追踪偵錯。")
(註二:此次9/6活動,筆者將分享最近在研究網路實作的心得,歡迎來切磋指教。)

沒有留言: