首頁 >系統教程 >Linux >華為雲端完成Linux核心的編譯與安裝(自選題目)

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

WBOY
WBOY轉載
2024-02-15 12:12:21660瀏覽

實驗要求掌握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刪除