[分享] BIOS超新手-PCI,SMBIOS,SuperIO,ACPI

看板C_and_CPP (C/C++)作者 (Myra)時間15年前 (2011/07/12 21:26), 編輯推噓6(6041)
留言47則, 6人參與, 最新討論串1/1
因為換了工作!! 要開始認識BIOS 第一隻程式是 PCI - scan (watcom C) 真的真的很簡陋... 請指教!!! http://codepad.org/6KaVe137 第二隻程式就是 SMBIOS (watcom C) 學生時期真的要好好學 >"< pointer 有夠給他難的啦 又再加上array...我都快哭了!!! 寫這支程式完全卡在 pointer & type 轉換 註解...有時候自己也看不懂 >"< http://codepad.org/ZdivD6UU 第三隻程式是 SuperIO (watcom C) 雙層I/O存取 show出來之後讓使用者選擇要修改哪個Value 已經不知道註解在寫什麼了!!!!! http://codepad.org/ewXwUQwa 第四隻程式是 ACPI (watcom C) show各Table 的Signature & Address QQa 寫的很醜我知道 = =a 除了卡在我很不會的pointer之外... 又卡在我不會的 struct 而且又有兩個Table 在第二層... 有人可以教我簡單的寫法嗎??? http://codepad.org/RD0JNIPO -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.230.219

07/12 21:30, , 1F
這是組語嘛?好累喔...
07/12 21:30, 1F
QQ 是WATCOM C (大哭....)

07/12 21:47, , 2F
黑底藍字傷眼睛 建議換個顏色
07/12 21:47, 2F

07/12 23:15, , 3F
Dev_No<<11 ...
07/12 23:15, 3F
QQ 我承認我是湊答案的!!!!

07/12 23:19, , 4F
應該是Dev_No<<12 如果這是你的意思的話...
07/12 23:19, 4F

07/12 23:20, , 5F
這address是5byte大小...
07/12 23:20, 5F
Bus_No has 8 bits , Dev_No has 5 bits Fun_No has 3 bits , Offset has 8 hits Dev_No & Fun_No <-- 共用 1 byte (8bits)

07/12 23:21, , 6F
看錯了...
07/12 23:21, 6F

07/12 23:24, , 7F
Address = 0x80000000|(Bus_No<<16)|...
07/12 23:24, 7F
| <--等同於'+' ?? @@a

07/12 23:26, , 8F
用|取代+比較容易知道是位元運算...
07/12 23:26, 8F

07/12 23:30, , 9F
| 是位元運算的or
07/12 23:30, 9F

07/12 23:31, , 10F
0001 1111|1101 0101 = 1101 1111
07/12 23:31, 10F
^^" 了解了....謝謝!!

07/12 23:38, , 11F
標題已改為 [分享]
07/12 23:38, 11F
謝謝!!!

07/12 23:43, , 12F
我還在想 版大怎麼還沒出現呢XD
07/12 23:43, 12F

07/12 23:44, , 13F
原PO先重整一下code吧 我們應該給了一些建議了...
07/12 23:44, 13F
好.......(攤軟)

07/13 03:05, , 14F
有空還是早點把 C 的 pointer,struct,function pointer,
07/13 03:05, 14F

07/13 03:05, , 15F
bitwise operation 先熟悉,之後再回來寫這些會輕鬆不少
07/13 03:05, 15F

07/13 03:05, , 16F
加油..
07/13 03:05, 16F
謝謝建議 ^^"~

07/13 03:22, , 17F
有一本書可以參考看看 [以C語言解析電腦]
07/13 03:22, 17F

07/13 03:27, , 18F
如果想在Windows驗證你文中想做的事,可查詢WinIo的用法
07/13 03:27, 18F

07/13 03:29, , 19F
^^^^撰寫
07/13 03:29, 19F
我有查過winIO... 可是同事說用inp() inpd() outp() outpd()就好了!!!

07/13 03:35, , 20F
至於為何沒事要去Windows上寫?因為可以搭配一個方便的工
07/13 03:35, 20F

07/13 03:36, , 21F
具來邊驗證自己程式的輸出結果,"RW - Read&Write" (RW-
07/13 03:36, 21F

07/13 03:36, , 22F
07/13 03:36, 22F
有用RW驗證 ^^

07/13 11:05, , 23F
第四隻程式-->http://codepad.org/WIn4GEir
07/13 11:05, 23F

07/13 11:34, , 24F
RSDP,Rsdt,Xsdt 在定義時有給初值,可以免去再全設0一次
07/13 11:34, 24F

07/13 11:50, , 25F
有時要取出資料可以不用分段組合,用內建型別一次取出
07/13 11:50, 25F

07/13 11:50, , 26F
例如 RSDPLen = *(unsigned long)(RSDPAddr+20);
07/13 11:50, 26F

07/13 11:51, , 27F
但是更好的作法是你先照 spec 把那個表自己 typedef 出
07/13 11:51, 27F

07/13 11:52, , 28F
各種 struct,然後就可以把你取到的位址直接對到那個
07/13 11:52, 28F

07/13 11:53, , 29F
struct 上,用欄位取值比直接寫 offset 清楚也不容易出錯
07/13 11:53, 29F

07/13 12:17, , 30F
07/13 12:17, 30F

07/13 12:28, , 31F
樓上..你的 init() 這樣寫的話,相關變數也要改放到global
07/13 12:28, 31F

07/13 12:30, , 32F
對吼...
07/13 12:30, 32F

07/13 12:34, , 33F
07/13 12:34, 33F

07/13 13:02, , 34F
firejox一出,誰與爭鋒.
07/13 13:02, 34F

07/13 13:03, , 35F
寶刀tropical72,號令天下
07/13 13:03, 35F

07/13 13:41, , 36F
中著也躺槍..
07/13 13:41, 36F

07/13 13:42, , 37F
.. 更誤,是躺著也中槍 XD
07/13 13:42, 37F

07/13 13:46, , 38F
=..=好啦,以後就認真回答問題就好.不玩了
07/13 13:46, 38F

07/13 14:01, , 39F
第一隻for: for(Offset=0;Offset<256 && (!Offset) &&
07/13 14:01, 39F

07/13 14:02, , 40F
Val!=0xffffffff; Offset+=4) {....}
07/13 14:02, 40F

07/13 14:06, , 41F
@angleevil:沒惡意啦, reply for funny.
07/13 14:06, 41F

07/13 14:11, , 42F
Don't worry.That's ok!
07/13 14:11, 42F

07/13 15:37, , 43F
tropical72, 若是 Offset==4 的時候將不會進迴圈, 而且
07/13 15:37, 43F

07/13 15:39, , 44F
Val 應該先從 port CFCh 讀入值才進行判斷
07/13 15:39, 44F

07/13 16:21, , 45F
感謝 U 大指正。
07/13 16:21, 45F

07/13 19:07, , 46F
@_@
07/13 19:07, 46F
感謝F大.... uintmax_t get_value(char*,size_t); 這個我看超久 >"<a ※ 編輯: myrahugh 來自: 123.195.173.60 (07/13 19:26)

07/13 19:28, , 47F
uintmax_t 看一下stdint.h吧
07/13 19:28, 47F
文章代碼(AID): #1E74kMEO (C_and_CPP)
文章代碼(AID): #1E74kMEO (C_and_CPP)