在實現網路支援之前,必須先能使用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)); } |
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 |
完整程式碼請參照kernel/pci.c和kernel/osfunc.s,從GitHub 上bos下載。
結論
在程式實作過程中,只要依照PCI所定義的資料表,將所需要的資料取出,存到一個PCI資訊的陣列中。
當有需要時,再從PCI 資訊陣列中取出相對應的記錄一一列出便可得到文章開頭的螢幕畫面。
其中一筆如下:
vendor:0x8086, devid:0x100E, class:0200(Network Controller), rev=3 |
(註一:軟語錄:"提高程式設計功力的方法無它,便是不斷地實作與追踪偵錯。")
(註二:此次9/6活動,筆者將分享最近在研究網路實作的心得,歡迎來切磋指教。)
沒有留言:
張貼留言