-
實驗內容
-
通過內核編譯法添加一個不用傳遞參數的系統調用,其功能可自定義。
(1)添加系統調用號,系統會根據這個號找到syscall_table中的相應表項。具體做法是在syscall_64.tbl文件中添加系統調用號和調用函數的對應關系。
(2)實現my_syscall,在kernel/sys.c中添加自已的服務函數,然后為該函數在syscalls. h中添加函數聲明。
(3)完成準備工作之后,就可以編譯內核。
-
實驗步驟
-
1. 進入kernel目錄:
-
圖3.1 進入/usr/src/linux-6.13.1路徑
2.添加系統調用號、聲明、函數
前情提要:因為沒有下載庫dbus-x11會導致添加系統調用號后報錯。下載方法見下文圖3.6。
圖3.2 打開系統調用表
不要使用387到423的號碼,在最后一個“普通”條目之后添加新的系統調號。
?圖3.3 添加系統調用號前
圖3.4 添加系統調用號后
(a)警告
(b)警告
圖3.5 關閉系統調用表
之后再打開系統調用入口表,發現做的改動沒有被清除,關閉系統調用入口表仍然會出現警告。解決辦法:需要退出內核目錄,回到/usr/src路徑下下載dbus-x11。
圖3.6 下載dbus-x11
圖3.7 成功解決報錯
如圖3.7所示,再次打開系統調用入口表并關閉,發現不會報錯。
?圖3.8 添加聲明
圖3.9 加入函數(2976行-2979行)
注意:不要按這個函數加進去,這里加入的函數并不能使后面編譯成果,具體應該如何修改見下文圖3.17。
3. 配置內核:
圖3.10 清除內核編譯過程產生的中間文件
圖3.11 清除以前生成的目標文件和其他文件
配置編譯參數 ,過程:Save--->ok--->Exit--->Exit
圖3.12配置編譯參數
圖3.13 配置編譯參數結束
4. 編譯和安裝內核:
圖3.14 執行sudo make -j8
注意,參數8是虛擬機內核數。我的虛擬機有8個內核,所以是sudo make -j8
圖3.15 出現錯誤
make[1]: *** [/usr/src/linux-6.13.1/Makefile:1989:.] 錯誤 2
make: *** [Makefile:251:__sub-make] 錯誤 2
執行make -n讓 make 程序模擬執行構建過程,把原本要執行的命令打印出來。
圖3.16 模擬執行構建過程?
????????可能的原因:內核配置問題:.config 文件中部分配置選項可能導致某些依賴關系未正確建立。比如與目標文件生成相關的配置缺失或錯誤,使得 make 找不到構建 vmlinux.a 的規則。
????? 在網上查找資料,發現是在高版本的內核中會出現以上報錯。解決報錯的過程如下:
修改sys.c中的函數如下圖所示,然后執行sudo make -j8等待一段時間后即可編譯成功。make加上-jn選項多線程編譯內核來加速內核編譯。
圖3.17 修改sys.c中的函數
圖3.18 編譯成功
安裝模塊:
圖3.19 執行sudo make modules_install
在/lib/moudles目錄下查看是否安裝成功:
圖3.20 安裝成功
是否生成內核壓縮鏡像文件,在/arch/x86/boot下查看生成bzImage:
圖3.21 已生成
安裝內核
圖3.22 執行sudo make install
更改系統啟動參數:
圖3.23 執行sudo update-grub2
- 實驗結果
運行及測試:
圖4.1 執行vim test.c
運行命令、./test:
圖4.2 調用成功
查看日志,執行sudo dmesg:
圖4.3 系統調用成功
-
實驗總結
????????通過內核編譯法添加一個無需傳遞參數的自定義功能系統調用,具體步驟涵蓋添加系統調用號、實現系統調用函數并聲明,以及編譯內核。
????????本實驗成功添加自定義系統調用,過程中遇到依賴安裝、文件編輯報錯、內核編譯錯誤等問題,通過查閱資料、分析錯誤原因并嘗試不同解決方法得以解決,加深了對 Linux 內核系統調用機制的理解 。
????????進入內核源碼目錄/usr/src/linux - 6.13.1,安裝相關依賴,解決安裝過程中軟件包定位失敗問題,如安裝dbus - x11解決gedit編輯文件時的報錯。在syscall_64.tbl文件添加系統調用號與函數對應關系,在syscalls.h中聲明系統調用函數,在sys.c中實現系統調用函數。執行sudo make mrproper清除編譯中間文件,配置編譯參數,編譯內核時遇到make[1]: *** [/usr/src/linux - 6.13.1/Makefile:1989:.]錯誤2等錯誤,經分析后,修改sys.c中的函數后編譯成功。執行sudo make modules_install安裝模塊,在/lib/modules目錄查看安裝情況;執行sudo make install安裝內核,執行sudo update - grub2更新啟動配置。編寫測試程序test.c,使用gcc -o test test.c編譯,運行./test后顯示syscall returned 1,執行sudo dmesg查看日志出現helloworld!,表明系統調用添加成功。
如果對你有幫助的話,請給我點個贊吧?
?