Heim  >  Artikel  >  System-Tutorial  >  Huawei Cloud schließt die Kompilierung und Installation des Linux-Kernels ab (optionales Thema)

Huawei Cloud schließt die Kompilierung und Installation des Linux-Kernels ab (optionales Thema)

WBOY
WBOYnach vorne
2024-02-15 12:12:21620Durchsuche

Das Experiment erfordert die Beherrschung der Kompilierung und Installation des Linux-Kernels, die Beherrschung der Grundkonzepte von Linux-Systemaufrufen sowie das Entwerfen und Hinzufügen von Linux-Systemaufrufen

(1) Ändern Sie die Priorität (nice value und prior value) des angegebenen Prozesses oder geben Sie sie zurück (Einzelheiten finden Sie im Lehrbuch P328). Tipp: Mögliche Referenzkernelfunktion: set_user_nice().

(2) Ändern Sie den Hostnamen in eine benutzerdefinierte Zeichenfolge (optionale Frage)

1. Kompilierung und Installation des Linux-Kernels (verwenden Sie Huawei Cloud, um die Kompilierung und Installation des openEuler-Kernels abzuschließen)

(1) Melden Sie sich beim System an und überprüfen Sie die aktuelle Kernel-Version

[root@openEuler~]#uname-r

(2) Installieren Sie Tools und richten Sie eine Entwicklungsumgebung ein

[root@openEuler~]#yumgroupinstall-y"DevelopmentTools"

[root@openEuler~]#yuminstall-ybc

[root@openEuler~]#yuminstall-yopenssl-devel

(3) Sichern Sie das Boot-Verzeichnis für den Fall, dass das Kernel-Update in den folgenden Schritten fehlschlägt

[root@openEuler~]#tarczvfboot.origin.tgz/boot/

Aktuelle Kernel-Versionsinformationen speichern

[root@openEuler~]#uname–r>uname_r.log

(4) Besorgen Sie sich den Kernel-Quellcode und dekomprimieren Sie ihn

[root@openEuler~]#wget

[root@openEuler~]#unzipkernel-4.19.zip

(5) Kernel kompilieren

[root@openEuler~]#cdkernel-kernel-4.19

[root@openEulerkernel]#makeopeneuler_defconfig

[root@openEulerkernel]#make-j4Imagemodulesdtbs

Dieser Schritt besteht darin, das Image, die Module und DTBs des Kernels zu kompilieren. Make-j4 bedeutet 4-Thread-Kompilierung (kann entsprechend der Anzahl der CPU-Kerne angepasst werden)

(6) Kernel installieren

[root@openEulerkernel]#makemodules_install

[root@openEulerkernel]#makeinstall

Hinweis: Die Fehler, die im letzten Schritt von „makeinstall“ auftreten, können hier ignoriert werden.

(7) Melden Sie sich mit VNC bei ECS an

(8) Starten Sie das System neu

[root@openEulerkernel]#reboot

(9) Einloggen und bestätigen

Wählen Sie im VNC-Fenster, ob Sie das System mit dem neu kompilierten Kernel starten möchten

Nach dem Kompilieren gibt es hier bereits einen neuen Kernel der Version 4.19.208. Wählen Sie diesen Kernel aus, um sich anzumelden

2. Beherrschen Sie die Grundkonzepte von Linux-Systemaufrufen

调用linux内核函数_linux内核调试方法总结_内核系统调用

Der Prozess der Linux-Systemverarbeitung von Systemaufrufen und die Möglichkeit, Systemaufrufe zu reduzieren. Das Linux-System stellt Hunderte von Systemaufrufen bereit, um jeden Systemaufruf eindeutig zu identifizieren. Gleichzeitig wird für jeden Systemaufruf eine eindeutige Nummer festgelegt Funktionen.

Ich werde hier nicht zu sehr auf die Beschreibung eingehen.

(Der Schwerpunkt liegt auf dem Hinzufügen von Systemaufrufen!!!)

#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;
}

Nach dem Neustart

#include 
#include 
#include 
int main()
{
ret = syscall(294);
return 0;
}

3. Entwerfen und fügen Sie Linux-Systemaufrufe hinzu

(1) Ändern Sie die Priorität (nice value und prior value) des angegebenen Prozesses oder geben Sie sie zurück (Einzelheiten finden Sie im Lehrbuch P328). Tipp: Mögliche Referenzkernelfunktion: 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) Ändern Sie den Hostnamen in eine benutzerdefinierte Zeichenfolge (optionale Frage)

#define __NR_mysethostname 296
__SYSCALL(__NR_mysethostname,sys_mysethostname)

Ebenso sollte #define__NR_syscalls296 unten in #define__NR_syscalls297 geändert werden

4. Zusammenfassung des Experiments

(1) Bevor Sie das Experiment durchführen, müssen Sie nach dem Ansehen des Tutorials klar erkennen, ob es sich um eine x86- oder eine ARM-Architektur handelt! ! ! Hier bin ich drei- oder viermal gestolpert und habe die Huawei Cloud neu aufgebaut

(2) Wenn beim Anmelden mit VNC der folgende Fehler auftritt, herzlichen Glückwunsch, liegt das wahrscheinlich daran, dass Ihr Kernel abgestürzt ist ~ Mein Lehrer sagte, dass Sie sich sofort nach dem Neustart mit VNC erneut anmelden können, solange Sie schnell genug sind Die virtuelle Maschine kann eingegeben werden, aber es ist mir nicht gelungen, den Cloud-Host nur n-mal neu zu erstellen.

(3) Obwohl der vom Lehrer gegebene Laborbericht eine VNC-Anmeldung erfordert,um Linux-Kernelfunktionen aufzurufen, empfehle ich persönlich die Verwendung von Cloudshell, um Befehle auszuführen.

(4) Während des ersten Tests fragte mich der Lehrer plötzlich nach der Bedeutung und Verwendung der Funktionen im Systemaufruf und ich war sofort ins Straucheln geraten. Ich werde die Bedeutung und Verwendung einiger interner Funktionen unten veröffentlichen.

1.find_get_pid(pid)

find_get_pid hat unterschiedliche Namespaces im Kernel. Der PID-Wert desselben Prozesses in den jeweiligen Namespaces kann unterschiedlich sein. Find_get_pid wird verwendet, um die tatsächliche PID des Prozesses im Kernel-Status zu ermitteln

2.set_user_nice(task,nicevalue)

Wird verwendet, um den netten Wert des Prozesses festzulegen

3.copy_to_user()

Vervollständigen Sie die Kopie vom Kernelraum in den Benutzerraum. Zur Zieladresse des Linux-Betriebssystems ist diese Adresse die Adresse des Benutzerraums. Von der Quelladresse ist diese Adresse die Adresse des Kernelraums. N ist die Anzahl der Bytes zu kopierende Daten.

Wenn die Datenkopie erfolgreich ist, geben Sie Null zurück; andernfalls geben Sie die Anzahl der Datenbytes zurück, die nicht erfolgreich kopiert wurden.

4.copy_from_user()

copy_from_user kopiert die Zeichenfolge, auf die der Name verweist, aus dem Benutzerbereich in den Kernelbereich. Wenn dies fehlschlägt, wird die Anzahl der Bytes zurückgegeben, die nicht kopiert wurden. Wenn dies gelingt, wird 0 zurückgegeben.

5.down_write()

Die Funktion down_write() wird aufgerufen, wenn der Writer das gelesene Semaphor sem erhält. Wenn der Reader oder Writer die Linux-Kernel-Funktion aufruft, führt der Aufruf dieser Funktion dazu, dass der Aufrufer in den Ruhezustand versetzt wird, was nur möglich ist Wird im Prozesskontext verwendet und dient dazu, die Schreibsperre im Lesesemaphor des Linux-Kernels zu erhalten. 6.memcpy(str1,str2,n)

Kopieren Sie n Bytes vom Speicherbereich str2 in den Speicherbereich str1.

Das obige ist der detaillierte Inhalt vonHuawei Cloud schließt die Kompilierung und Installation des Linux-Kernels ab (optionales Thema). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:itcool.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen