TIL: private data struct in Linux kernel

在 Linux kernel 當中有許多的 common struct,例如說 ieee80211_txq 這樣的結構,透過這樣的方式,可以讓不同的 driver 重用相同的 struct。但是,針對每個不同的 driver,還是會有不同的 private data,這時候就會用 private data struct 的方式來處理。

例如說,struct ieee80211_txq 是 mac80211 中的 intermediate tx queue,目前有使用的 wireless driver 為 ath9k, ath10k 以及 mt76。struct ieee80211_txq 的整個結構為:

可以看到,除了前四個 member 外,最後還定義了一個 drv_priv,這是用來指向各個 driver 的 private data 的 member。以 ath9k 為例,這邊是指向一個 struct ath_atx_tid,ath10k 則是 struct ath10k_txq

以 ath9k 為例,這邊是在 sta_info_alloc 的地方 allocated:

先看 struct txq_info 的部份:

重點在於 int size = 這行,除了 allocate struct txq_info 的 size 之外,還加上了 private data 的 size (hw->txq_data_size),透過這樣的方式,讓每個 driver 可以使用自身會使用的 data。

範例程式碼:

可以嘗試使用 gdb 觀察不加上 struct foobar size 的狀況下,會有什麼問題。




如果你覺得這篇文章不錯,歡迎打賞 IOTA:RFHEIVXVIZWJFXTZORZZRCMHZF9PSGFUFWAAKXTFNZE9JQUY9HFQREJYYSPSXDRLECKXCAQQDOMSMYJYDKPCKWXBKD

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料