Maison  >  Article  >  Tutoriel système  >  Huawei Cloud termine la compilation et l'installation du noyau Linux (sujet facultatif)

Huawei Cloud termine la compilation et l'installation du noyau Linux (sujet facultatif)

WBOY
WBOYavant
2024-02-15 12:12:21620parcourir

L'expérience nécessite de maîtriser la compilation et l'installation du noyau Linux, de maîtriser les concepts de base des appels système Linux, de concevoir et d'ajouter des appels système Linux

(1) Modifiez ou renvoyez la priorité (valeur nice et valeur prio) du processus spécifié (voir le manuel P328 pour plus de détails) Astuce : fonction de noyau de référence possible : set_user_nice().

(2) Remplacez le nom d'hôte par une chaîne personnalisée (question facultative)

1. Compilation et installation du noyau Linux (utilisez Huawei Cloud pour terminer la compilation et l'installation du noyau openEuler)

(1) Connectez-vous au système et vérifiez la version actuelle du noyau

[root@openEuler~]#uname-r

(2) Installer des outils et établir un environnement de développement

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

[root@openEuler~]#yuminstall-ybc

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

(3) Sauvegardez le répertoire de démarrage au cas où la mise à jour du noyau échouerait dans les étapes suivantes

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

Enregistrer les informations sur la version actuelle du noyau

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

(4) Obtenez le code source du noyau et décompressez-le

[root@openEuler~]#wget

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

(5) Compiler le noyau

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

[root@openEulerkernel]#makeopeneuler_defconfig

[root@openEulerkernel]#make-j4Imagemodulesdtbs

Cette étape consiste à compiler l'image, les modules et les dtbs du noyau. make-j4 signifie compilation à 4 threads (peut être ajusté en fonction du nombre de cœurs CPU)

(6) Installer le noyau

[root@openEulerkernel]#makemodules_install

[root@openEulerkernel]#makeinstall

Remarque : Les erreurs qui surviennent lors de la dernière étape de "makeinstall" peuvent être ignorées ici.

(7) Connectez-vous à ECS à l'aide de VNC

(8) Redémarrez le système

[root@openEulerkernel]#reboot

(9) Connectez-vous et vérifiez

Choisissez de démarrer le système avec le noyau nouvellement compilé dans la fenêtre VNC

Après la compilation ici, il existe déjà un nouveau noyau de version 4.19.208. Sélectionnez ce noyau pour vous connecter

.

2. Maîtrisez les concepts de base des appels système 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 copie la chaîne pointée par nom de l'espace utilisateur vers l'espace noyau. S'il échoue, il renvoie le nombre d'octets qui n'ont pas été copiés. S'il réussit, il renvoie 0.

5.down_write()

La fonction down_write() est appelée lorsque l'écrivain obtient le sémaphore lu sem Si le sémaphore est détenu par le lecteur ou l'écrivainappelle la fonction du noyau Linux, alors l'appel à cette fonction entraînera la mise en veille de l'appelant, ce qui peut être utilisé uniquement dans le contexte du processus, est utilisé pour obtenir le verrou en écriture dans le sémaphore de lecture du noyau Linux.

6.memcpy(str1,str2,n)

Copiez n octets de la zone de stockage str2 vers la zone de stockage str1.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer