對乙個問題的解答

2021-05-21 19:35:57 字數 1302 閱讀 4071

今天週日,陪老婆燙完頭髮回到家裡,仍然不忘開啟郵箱,一位朋友問了乙個問題,說想用sysfs實現cdev,我覺得倒是沒有什麼不可,因為sysfs畢竟是乙個核心和使用者空間通訊的介面,是個介面就可以被使用,我之所以敢打這個保票就是因為linux核心只提供機制而不提供任何策略,也就是說,只要你知道乙個機制是核心和使用者空間通訊用的,那麼你可以進行任何通訊,核心機制絲毫不管你通訊的內容,其實sysfs是向使用者空間匯出系統的裝置資訊的,但是這也僅僅是乙個約定罷了,如果你非要用它來實際操作裝置,那麼linux核心絕對不會攔著你的,前提是只要你在上在下的**符合它的介面約定即可,在上就是標準的檔案介面,而在下就是sysfs的核心介面,也很簡單,只管用。還是那句話:在linux中沒有可不可以的問題,只有符合不符合約定的問題,沒有對和錯,只有好和不好。

問題:

寫了乙個簡單的讀寫記憶體和外設暫存器的小模組... 用的是proc,很簡單註冊乙個proc裝置,提供讀寫函式就可以..應用層操作/proc/sysmem 裝置檔案..

這樣的能用sysfs替換實現嗎?  我看說proc是過時的了.但具體不知道怎麼用sysfs來實現.用cdev?

我的回答:

procfs只是乙個核心和使用者空間通訊的介面,原則上可以實現cdev的資訊交換,但是如果你僅僅想實現在使用者空間操作物理暫存器的話,那大可不必非要用cdev,正如你說的,在proc留下乙個介面,實現read和write函式即可,如果你不想用procfs的話,你就要用標準的做法了,有兩種方 式,第一種就是實現乙個字元裝置,實現它的file_operations,然後在/dev/下面按照主次裝置號用mknod建立乙個裝置,最終你只需要 操作這個裝置檔案就可以了;第二種方式就是利用你說的sysfs介面,利用sysfs的目的是為了自動的將你的物理裝置資訊導向使用者空間而不是為了讀寫寄 存器,這個方法下你就不用mknod手工建立裝置了,而可以用使用者空間的udevd守護程序自動依據sysfs的資訊來建立裝置了,最終你還是要操作你創 建的裝置。

當然,直接用sysfs匯出物理暫存器的資訊或者直接用sysfs匯出暫存器的讀寫介面,那倒也可以,但是不是標準的做法,實際上,不光sysfs,只要是使用者空間和核心通訊的機制你都可以利用,比如用netlink也可以,這個時候,你讀寫物理暫存器就變成讀寫乙個netlink套接字了。

實際上sysfs只是乙個系統資訊匯出檔案系統,它的資訊一般都是使用者空間的守護程序用的,比如udev,這樣的話可以讓使用者空間第一時間了解核心空間發 生的事件,不太贊成用sysfs直接匯出個別的物理裝置的完整資訊,比如,你只要能通過sysfs得知物理裝置已經就緒並且知道了它的裝置號就可以了,真 正讀寫裝置和操作裝置還是要用標準的file_operations的vfs的方式,我想這也就是unix/linux中「一切皆檔案」的意義。

乙個有關typeglob問題的解答

這裡不是perl的百科全書,這裡http www.perl.org 才是。個人理解,難免有錯。預備知識 在perl中,由our宣告的變數均會被視為全域性變數 由my宣告的變數均會被視為區域性變數 由local宣告的變數是同名全域性變數的本地拷貝。或者說 由local宣告的變數均會被視為全域性變數。所...

針對事務的乙個問題的解答

今天有乙個朋友問了乙個問題如下 或者連續執行8個小時,能夠返回多少使用者處理的結果。這樣該怎麼去進行測試呢。感覺很多效能測試方面的資料都在講併發使用者訪問時,系統地響應時間之類。找不到這種型別的測試應該怎麼進行 回答如下 這個問題可以用事務來去考慮。我們拿簡單的例子指令碼來說 比如以下指令碼是做帳務...

對Boost any的乙個補充

boost any可以訪問任意型別,是用模板實現的,不過它設計得非常巧妙,其本身不是個模板,而是用乙個模板類的成員來進行資料儲存的,這使得我們可以寫出這樣的 boost any x std string hello cruel world x 123 x 3.1416f 但是如何把資料轉變回來呢?b...