四、實驗核心**
這是乙個很簡單、基礎的實驗,只需要看懂原始碼,然後在原始碼中稍作修改就行。注意:編譯核心花費時間比較長,長則一天,短則2-3小時,如果用虛擬機器記得多開機器核心數目(機器核心數目越多越快,但不要超過物理機的核心數目)和記憶體(記憶體不足會導致中途編譯失敗),最好一次成功。
linux是開源作業系統,使用者可以根據自身系統需要裁剪、修改核心,定製出功能更加合適、執行效率更高的系統,因此,編譯linux核心是進行核心開發的必要基本功。
在系統中根據需要新增新的系統呼叫是修改核心的一種常用手段,通過本次實驗,讀者應理解linux系統處理系統呼叫的流程以及增加系統呼叫的方法。
1、核心修改時有自己標籤,用 dmesg驗證
2、linux核心標籤(系統啟動顯示一次)
3、顯示當前系統名稱和版本的系統呼叫
4、修改nice和prio值的系統呼叫功能
5、改變主機名稱為自定義字串的系統呼叫
找到init/main.c中的start_kernel函式,加入一句pr_notice(「學號 姓名」);//pr_notice()用來列印核心日誌,可以用dmesg命令檢視
**。
1.分配系統呼叫號,修改系統呼叫表
檢視系統呼叫表(arch/x86/entry/syscalls/syscall_64.tbl),每個系統呼叫在表中佔乙個表項,其格式為《系統呼叫號》《系統呼叫名》《服務例程入口位址》
,在表中為系統呼叫新增乙個系統呼叫號。
2.申明系統呼叫服務例程原型
linux系統呼叫服務例程的原型宣告在檔案linux-4.12/include/linux/syscalls.h中,可在檔案末尾新增類似asmlinkage long sys_zwhsyscall(void);
的系統呼叫**。
3.實現系統呼叫服務例程
下面為新呼叫編寫服務例程,通常新增在sys.c檔案中,其完整路徑為linux-5.9.1/kernel/sys.c。具體程式設計思路可以看下面。
4.重新編譯核心
5.編寫使用者態程式測試系統呼叫
在開始完全重新編譯之前,需要用makemrproper
命令清除殘留的.config和.o檔案。
執行make menuconfig
命令配置核心。
核心配置完成後,執行make
命令,開始編譯核心。
執行make modules
命令,開始編譯模組。
執行make modules_install
命令,開始安裝模組。執行make install命令,開始安裝核心。
執行update-grub2
命令,自動修改grub引導程式。
執行reboot
命令,重啟系統。
顯示當前系統名稱和版本的系統呼叫函式可以參考linux-5.9.1/kernel/sys.c中的newuname函式。
linux-5.9.1的newuname函式(不一定適用於其他版本)
syscall_definex型別函式的格式:syscall_definex(函式名,引數變數型別1,引數變數名1,…,…引數變數型別x,引數變數名x),系統呼叫函式的定義格式。
syscall_define1
(newuname,
struct new_utsname __user *
, name)
修改nice和prio值的系統呼叫可以通過set_user_nice()函式改變程序的nice值,從而改變prio值,實現系統呼叫的功能。
syscall_define5
(mysetnice,pid_t,pid,
int,flag,
int,nicevalue,
void __user*
,prio,
void __user*
,nice)
else
if(flag ==0)
return efault;
}
改變主機名稱為自定義字串的系統呼叫函式可以參考linux-5.9.1/kernel/sys.c中的sethostname函式。
可以用uname -n
命令來檢視,修改hostname但不修改hostname的對映可能會導致shell命令使用警告(不影響使用),重啟(hostname會改為預設值)或新增對映,即可解決。
linux-5.9.1的sethostname函式(不一定適用於其他版本)
syscall_define2
(sethostname,
char __user *
, name,
int, len)
return errno;
}
sys.c:系統呼叫函式**。
mychangename.c:測試mychangename的系統呼叫,功能是改變主機名稱為自定義字串的系統呼叫。
mysetnice.c:測試mysetnice系統呼叫的程式,功能是修改nice和prio值的系統呼叫功能。
myshowname.c:測試myshowname系統呼叫的程式,功能是顯示當前系統名稱和版本的系統呼叫。
完整**詳見:hdu-operation-system-course-design-code/實驗一/
作業系統課程設計
實驗 一 程序管理與程序同步 實驗目的 了解程序管理的實現方法,理解和掌握處理程序同步問題的方法並完成程式設計。實驗內容 實現銀行家演算法 程序排程的過程模擬。實驗步驟 理解銀行家演算法的核心機制 設計相應資料結構 程式設計實現 測試。理解程序的三狀態排程過程 設計排程演算法 程式設計實現 測試。實...
作業系統課程設計
1 實驗內容 學習程序管理的設計與實現,學習和運用作業系統原理,設計乙個作業系統子系統的模擬系統。通過該系統的設計除錯可增加對作業系統實現的感知性。設計乙個允許n個程序併發執行的程序管理的模擬系統。該系統包括簡單的程序控制 同步及通訊機構,其程序排程演算法可任意選擇。分析系統所需的資料結構 演算法的...
作業系統課程設計 模擬作業系統
程序管理主要包括程序排程,程序的建立和撤銷 程序的阻塞和喚醒,中斷作用的實現。用全域性變數模擬重要暫存器,如cpu重要暫存器,程式狀態暫存器psw 指令暫存器ir,程式計數器pc,資料緩衝暫存器dr等。中斷的發現應該是硬體的工作,這裡在函式cpu中加檢測psw的方式來模擬。在cpu 函式中,每執行一...