用户空间使用内核头文件
?
在用戶空間使用內(nèi)核頭文件(或模塊)有兩種方法:
1. 將內(nèi)核頭文件和相應(yīng)模塊移植到移植到用戶層,在用戶空間重新編譯使用。
2. 在編譯時(shí)使用-I/lib/modules/$(uname -r)/build/include選項(xiàng)
?
方法1比較麻煩,需要做些移植工作,但是肯定能成功。比如可以將內(nèi)核的list.h鏈表移植到用戶空間。
方法2可能會(huì)遇到一些錯(cuò)誤,比如重復(fù)定義等,而且很難解決。
比如如果需要使用內(nèi)核的list,如下編譯:
gcc list_test.c -I/lib/modules/$(uname -r)/build/include -D__KERNEL__
出現(xiàn)如下錯(cuò)誤:
fd_set同時(shí)在內(nèi)核空間的types.h和用戶空間的select.h中定義,造成重復(fù)定義。這個(gè)錯(cuò)誤基本沒(méi)有辦法可以消除。
因此,推薦方法1。
?
關(guān)于方法2的官方解釋:
見(jiàn)https://kernelnewbies.org/KernelHeaders
摘錄如下:
1. 如果你正在發(fā)布一個(gè)依賴(lài)某個(gè)特定版本內(nèi)核頭文件的用戶空間程序,比如因?yàn)槟愕某绦蛑贿\(yùn)行在打過(guò)補(bǔ)丁或者最新的內(nèi)核上,你不能依賴(lài)/usr/include中的頭文件。你也不能使用來(lái)自/usr/src/linux/include 或/lib/modules/*/build/include/的頭文件,因?yàn)樗麄冞€沒(méi)有為用戶空間的包含做好準(zhǔn)備。若你嘗試這么做了,內(nèi)核會(huì)警告你并指引你到這個(gè)Wiki頁(yè)。解決這個(gè)問(wèn)題的正確方法是獨(dú)立出你需要的特定接口,比如一個(gè)打過(guò)補(bǔ)丁的新內(nèi)核并為你的應(yīng)用程序提供字符設(shè)備ioctl號(hào)的獨(dú)立頭文件。在你自己的程序中添加一份這個(gè)源文件的拷貝,并說(shuō)明這個(gè)應(yīng)該和新內(nèi)核版本保持一致。如果你的程序不遵循GPLv2證書(shū),請(qǐng)保證你得到了這個(gè)文件作者的許可:可在你自己程序的證書(shū)下發(fā)布它。因?yàn)槟愕某绦颥F(xiàn)在依賴(lài)的內(nèi)核接口并不在常規(guī)內(nèi)核中。
2. 為一個(gè)發(fā)行版打包頭文件正確的方法是在內(nèi)核源碼目錄下運(yùn)行 'make headers_install'來(lái)安裝頭文件到/usr/include,并依賴(lài)這個(gè)剛剛安裝的特定版本的內(nèi)核頭文件重新編譯C庫(kù)包。
1)在內(nèi)核源碼根目錄下運(yùn)行: 'make headers_install',這樣內(nèi)核Makefile會(huì)把提供給應(yīng)用程序的頭文件提取并放在內(nèi)核源碼的“usr/include”目錄下。
2)在編譯應(yīng)用程序的時(shí)候,在GCC的CFLAG參數(shù)中添加“-I(內(nèi)核源碼路徑)/usr/include”,這樣編譯器就知道在編譯時(shí)找到相關(guān)的頭文件。
?
注:很可惜,list.h并沒(méi)有出現(xiàn)在usr/include/linux/下。
總結(jié)
以上是生活随笔為你收集整理的用户空间使用内核头文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转发pptp和l2tp
- 下一篇: libusb开发:bulk/interr