華為雲端完成Linux核心的編譯與安裝(自選題目)

WBOY
發布: 2024-02-15 12:12:21
轉載
570 人瀏覽過

實驗要求掌握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系統處理系統呼叫的流程以及降低系統呼叫的方式。 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中文網其他相關文章!

來源:itcool.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!