實驗要求掌握Linux核心的編譯與安裝把握Linux系統呼叫基本概念設計與加入linux系統呼叫
#(1)更改或傳回指定進程的優先權(nice值和prio值)(詳見教材P328)提示:可能參考的內核函數:set_user_nice().
(2)改變主機名稱為自訂字串(自選題目)
1、Linux核心的編譯與安裝(使用華為雲,完成openEuler核心的編譯與安裝)
(1)登錄系統並查看目前核心版本
[root@openEuler~]#uname-r
(2)安裝工具,建立開發環境
[root@openEuler~]#yumgroupinstall-y"DevelopmentTools"
[root@openEuler~]#yuminstall-ybc
##[root@openEuler~]#yuminstall-yopenssl-devel
(3)備份boot目錄以防後續步驟更新核心失敗
[root@openEuler~]#tarczvfboot.origin.tgz/boot/
儲存目前核心版本資訊
[root@openEuler~]#uname–r>uname_r.log
(4)取得核心原始碼並解壓縮
#[root@openEuler~]#wget
[root@openEuler~]#unzipkernel-4.19.zip
(5)編譯核心
[root@openEuler~]#cdkernel-kernel-4.19
[root@openEulerkernel]#makeopeneuler_defconfig
#[root@openEulerkernel]#make-j4Imagemodulesdtbs
這一步是編譯核心的Image、modules和dtbs,make-j4表示4個執行緒編譯(可以依照CPU核數調整)
(6)安裝核心
[root@openEulerkernel]#makemodules_install
#[root@openEulerkernel]#makeinstall
注意:在最後一步「makeinstall」時出現的錯誤在這裡可以忽略。
(7)以VNC登陸ECS
(8)重啟系統
[root@openEulerkernel]#reboot
(9)登陸並驗證
在VNC視窗中選擇以新編譯下來的核心啟動系統
這兒編譯完之後早已有了4.19.208版本的新內核,選擇該內核登陸
2、掌握Linux系統呼叫基本概念
#Linux系統處理系統呼叫的流程以及降低系統呼叫的方式。 Linux系統提供了多達數百種的系統調用,為了惟一地標識每一個系統調用,Linux為每位系統調用都設置了一個惟一的編號,稱為系統調用號,同時每位系統調用須要一個服務解釋器完成其具體功能。
這兒不做過多描述。
(重點是如何新增系統呼叫!!!)
#define __NR_hello_euler 294 __SYSCALL(__NR_hello_euler, sys_hello_euler) #undef __NR_syscalls #define __NR_syscalls 295
asmlinkage long sys_hello_euler(void);
SYSCALL_DEFINE0(hello_euler) { printk(KERN_INFO "xuehao:20273108"); return 0; }
重啟後
#include #include #include int main() { ret = syscall(294); return 0; }
3、設計與新增linux系統呼叫
#(1)更改或傳回指定進程的優先權(nice值和prio值)(詳見教材P328)提示:可能參考的內核函數:set_user_nice().
#define _GNU_SOURCE #include #include #include #include int main() { pid_t pid; int nicevalue; int flag; int n=0; int p=0; int *prio; int *nice; prio = &p; nice = &n; printf("请输入pid: n"); scanf("%d",&pid); printf("pid输入成功n请输入nice值:n"); scanf("%d",&nicevalue); printf("nice输入成功n请输入flag(flag为1时修改,为0时查看):n"); scanf("%d",&flag); syscall(295,pid,flag,nicevalue,prio,nice); printf("现在的nice为%d,prio为%dn",n,p); return 0; }
(2)改變主機名稱為自訂字串(自選題目)
#define __NR_mysethostname 296 __SYSCALL(__NR_mysethostname,sys_mysethostname)
同理,下邊的#define__NR_syscalls296要弄成#define__NR_syscalls297
4、實驗總結
(1)你們做實驗之前看教學一定要認清楚是x86還是arm架構的呀! ! !我就是在這前面栽跟頭了重建了三四次華為雲
(2)假如用VNC登入時出現以下報錯,這麼恭喜你,多半是你的核心崩了~我的老師說,只要你手速夠快,在重啟虛擬機的時侯立刻用VNC重新登入是可以進去的,而且我沒成功過,只能重建了n次雲端主機。
(3)儘管老師給的實驗報告裡要求VNC登陸呼叫linux核心函數,但我個人建議使用cloudshell來執行指令。
(4)在先驗的時侯,被老師冷不丁問了系統調用裡的函數的意義和用法,直接栽跟頭了。我會在下邊po出一部份內部函數的意義及用法。
1.find_get_pid(pid)
find_get_pid在核心中有不同的命名空間,在各自的命名空間同一個行程pid值可能是不一樣的,find_get_pid為了找到在內核態中的我們找尋行程真正的pid
2.set_user_nice(task,nicevalue)
用於設定進程的nice值
3.copy_to_user()
完成核心空間到使用者空間的複製,To目標位址linux作業系統版本linux系統,這個位址是使用者空間的位址;From來源位址,這個位址是核心空間的位址;N即將拷貝的資料的位元組數。
假如資料拷貝成功,則傳回零;否則,傳回沒有拷貝成功的資料位元組數。
4.copy_from_user()
copy_from_user將name指向的字串從使用者空間拷貝到核心空間,失敗傳回沒有被拷貝的位元組數,成功回傳0。
5.down_write()
函數down_write()是寫者拿來得到讀寄信號量sem時調用的,假如該信號數量被讀者或寫者所持有調用linux內核函數,則對該函數的呼叫會造成呼叫者的睡眠,只能在進程上下文使用,用於取得Linux內核讀寄信號量中的寫鎖。
6.memcpy(str1,str2,n)
從儲存區str2複製n個位元組到儲存區str1。
以上是華為雲端完成Linux核心的編譯與安裝(自選題目)的詳細內容。更多資訊請關注PHP中文網其他相關文章!