HDU操作系统课程设计实验一
HDU操作系統課程設計實驗一
- 實驗一:Linux內核編譯及添加系統調用
- 一、設計目的
- 二、內容要求
- 三、實驗內容
- 修改Linux內核標簽
- 添加系統調用
- 編譯內核
- 顯示當前系統名稱和版本的系統調用
- 修改nice和prio值的系統調用
- 改變主機名稱為自定義字符串的系統調用
- 四、實驗核心代碼
實驗一:Linux內核編譯及添加系統調用
這是一個很簡單、基礎的實驗,只需要看懂源碼,然后在源碼中稍作修改就行。注意:編譯內核花費時間比較長,長則一天,短則2-3小時,如果用虛擬機記得多開機器核心數目(機器核心數目越多越快,但不要超過物理機的核心數目)和內存(內存不足會導致中途編譯失敗),最好一次成功。
一、設計目的
Linux是開源操作系統,用戶可以根據自身系統需要裁剪、修改內核,定制出功能更加合適、運行效率更高的系統,因此,編譯Linux內核是進行內核開發的必要基本功。
在系統中根據需要添加新的系統調用是修改內核的一種常用手段,通過本次實驗,讀者應理解Linux系統處理系統調用的流程以及增加系統調用的方法。
二、內容要求
1、內核修改時有自己標簽,用 dmesg驗證
2、Linux內核標簽(系統啟動顯示一次)
3、顯示當前系統名稱和版本的系統調用
4、修改nice和prio值的系統調用功能
5、改變主機名稱為自定義字符串的系統調用
三、實驗內容
修改Linux內核標簽
找到init/main.c中的start_kernel函數,加入一句pr_notice(“學號 姓名”);//pr_notice()用來打印內核日志,可以用dmesg命令查看代碼。
添加系統調用
1.分配系統調用號,修改系統調用表
查看系統調用表(arch/x86/entry/syscalls/syscall_64.tbl),每個系統調用在表中占一個表項,其格式為<系統調用號><commom/64/x32><系統調用名><服務例程入口地址>,在表中為系統調用添加一個系統調用號。
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.編寫用戶態程序測試系統調用
編譯內核
顯示當前系統名稱和版本的系統調用
顯示當前系統名稱和版本的系統調用函數可以參考linux-5.9.1/kernel/sys.c中的newuname函數。
linux-5.9.1的newuname函數(不一定適用于其他版本)
SYSCALL_DEFINEX類型函數的格式:SYSCALL_DEFINEX(函數名,參數變量類型1,參數變量名1,…,…參數變量類型X,參數變量名X),系統調用函數的定義格式。
修改nice和prio值的系統調用
修改nice和prio值的系統調用可以通過set_user_nice()函數改變進程的nice值,從而改變prio值,實現系統調用的功能。
SYSCALL_DEFINE5(mysetnice,pid_t,pid,int,flag,int,nicevalue,void __user*,prio,void __user*,nice){struct pid * kpid;struct task_struct * task;kpid = find_get_pid(pid);/* 返回pid */task = pid_task(kpid, PIDTYPE_PID);/* 返回task_struct */int n;n = task_nice(task);/* 返回進程當前nice值 */int p;p = task_prio(task);/*返回進程當前prio值*/if(flag == 1){printk("Change nice: %d ,prio: %d ",n,p);set_user_nice(task, nicevalue);/* 修改進程nice值 */n = task_nice(task);/*重新取得進程nice值*/p = task_prio(task);/*重新獲取進程prio值 這里和參考資料不一樣!!! */printk("to nice: %d ,prio: %d\n",n,p);copy_to_user(nice,&n,sizeof(n));/*將nice值拷貝到用戶空間*/copy_to_user(prio,&p,sizeof(p));/*將prio值拷貝到用戶空間*/return 0;}else if(flag == 0){printk("nice : %d ,prio: %d\n",n,p);copy_to_user(nice,&n,sizeof(n));/*將nice值拷貝到用戶空間*/copy_to_user(prio,&p,sizeof(p));/*將prio值拷貝到用戶空間*/return 0;}return EFAULT; }改變主機名稱為自定義字符串的系統調用
改變主機名稱為自定義字符串的系統調用函數可以參考linux-5.9.1/kernel/sys.c中的sethostname函數。
可以用uname -n命令來查看,修改hostname但不修改hostname的映射可能會導致shell命令使用警告(不影響使用),重啟(hostname會改為默認值)或添加映射,即可解決。
linux-5.9.1的sethostname函數(不一定適用于其他版本)
四、實驗核心代碼
sys.c:系統調用函數代碼。
mychangename.c:測試mychangename的系統調用,功能是改變主機名稱為自定義字符串的系統調用。
mysetnice.c:測試mysetnice系統調用的程序,功能是修改nice和prio值的系統調用功能。
myshowname.c:測試myshowname系統調用的程序,功能是顯示當前系統名稱和版本的系統調用。
完整代碼詳見:HDU-operation-system-course-design-code/實驗一/
總結
以上是生活随笔為你收集整理的HDU操作系统课程设计实验一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(1908)vue之电商管理系统
- 下一篇: 泛微oa java .net_第三方系统