最近在調試一次SMBIOS的動態更新以及I2c設備的配置讀取時,遇到了不少問題,特此總結:ios
1. 第一個是調試一個I2c設備的時候,遇到了一個很奇怪的問題,也由此問題總結了下SMBUS模塊的知識,以下:數組
待完成函數
2. 在動態更新到SMBIOS某些type字串時,遇到不少細節問題,總結以下:debug
1)問題:一樣的代碼,放置位置不一樣會致使代碼跑飛:指針
以下圖,在得到了SmBiosType1Record的Protocol時,若是StringNumber的兩個變量賦值分開,將紅框代碼移至下面,就會致使值改變,目前還不太清楚緣由,這個問題之後要注意。調試
2) 有關某個SMBIOS的Handle值blog
本來經過筆者認爲,這個handle能夠經過SmbiosType1Record->Hdr->Handle的方式直接獲取到,可是實際也會有問題,第一個 Smbios->UpdateString()函數能夠正常執行,可是執行完以後,在執行第二個時,Handle的值就不正確了,這個問題與上面的問題相似,都是在執行完第一個函數後,SmbiosType1Record這個結構體指針的值會有所變化,所以我懷疑第一個函數執行時,會改變SmbiosType1Record的指向或者內容。要搞清楚這個問題,又要牽扯到什麼是Handle什麼是Protocol了,他們在代碼中的呈現形式什麼呢?請參照以下文章:字符串
3)在使用gEfiSmbiosProtocol下的函數UpdateString時,必定要注意更新的是字符串,須要注意傳入String參數的格式,是要字符串格式的,仍是普通的字符數組就能夠,這是不同的。string
必定要重視這一點,這直接決定了debug的效率。並且之後又碰到任何更新string的數據的時候,均要去查看,形參中傳入的指針是不是一個字符串指針,若是是的話,那麼在獲取該數據時,必定要注意最後一個Byte要爲'\0',不然就會發生越界的問題。本次調試就遇到了這樣的問題。io
我將形參指針的指向的空間放置了要更新的字符串數據,可是沒有按照字符‘\0’結尾,
如上代碼,僅申請了空間,copy了字符串數據,沒有以'\0'結尾,但實際上結果錯誤,一直在我發現到UpdateString函數中,對於字符串長度的獲取是經過'\0'來判斷結尾的,我才意識到問題所在。
然後我在CopyMem數據,將最後一個數據設置成了'\0',UpdateString成功。這是個經驗也是個教訓,之後在碰到有關字符串的數據處理時,必定要提早看是否將其做爲字符串來處理的。