Implémentation des appels système Linux
-
- Préface
- 01 Contenu de l'expérience
- 02 Environnement expérimental
- 03 Remplacer les sources domestiques
- 04 Installer les dépendances nécessaires à la compilation
- 05 Récupérer le code source du noyau
- 06 Ajouter des appels système personnalisés
- 07 Ajouter une déclaration et une définition de fonction
- 08 Compiler le noyau
- 09 Vérification
- 10 PS—Suppression du noyau
- Épilogue
Préface
Je n'ai pas appris le système d'exploitation pendant un semestre. Quand j'ai vraiment pensé à rattraper les expériences que je devais, j'ai réalisé que c'était vraiment une torture. J'ai fait des erreurs six ou sept fois, alors j'ai soudain eu l'idée d'enregistrer le système d'exploitation. tout le processus expérimental. Que cette expérience au moins ne soit pas complètement infructueuse.
01 Contenu de l'expérience
- Compilation complète du noyau
- Effectuer un appel système
02 Environnement expérimental
- VMware Workstation Pro 16
- Ubuntu 20.04 LTS
- Noyau Linux 5.10.2
Pour installer Ubuntu sur VMware, veuillez vous référer à : Lien du didacticiel
Essayez de tout télécharger depuis le site officiel. L'échec de plusieurs de mes expériences était dû à des problèmes avec les images que j'avais téléchargées depuis d'autres chaînes. C'était vraiment une torture.
Et essayez d'allouer 55 Go de mémoire lors de la sélection de l'espace de stockage au début
1) Pour éviter un échec de compilation dû à un espace insuffisant lors de la compilation ultérieure
2) Si vous n'allouez pas suffisamment de mémoire au début, il sera très difficile de la réaffecter après le l'installation est terminée (ne demandez pas Comment puis-je le savoir ? Au final j'ai choisi de désinstaller et de réinstaller :)
N'oubliez pas de modifier les paramètres après l'installation
03 Remplacer les sources domestiques
La source par défaut est une source externe et l'accès domestique est très lent, voire indisponible du tout, nous l'avons donc remplacé par une source domestique avant l'expérience.
Sauvegarder la source originale
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
Fichier open source
sudo gedit /etc/apt/sources.list
Modifier vers la source miroir de version correspondante
Généralement, nous choisirons la source Alibaba ou la source Tsinghua pour les sources d'images nationales (l'auteur a utilisé la source Alibaba pendant l'expérience, ce qui sera plus rapide.
Aliyuan 20.04 LTS
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
Tsinghuayuan 20.04LTS
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
renouveler
sudo apt-get update
sudo apt-get upgrade
04 Installer les dépendances nécessaires à la compilation
Je n'ai eu aucun problème lors de cette étape d'installation. Après avoir lu quelques informations sur Internet, si une erreur est signalée à cette étape, il se peut que la version de la source de l'image précédente ne corresponde pas à la version du système.
sudo apt-get install libc6-dev
sudo apt-get install libelf-dev
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install libidn11-dev libidn11
sudo apt-get install zlibc minizip
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install pkg-config
05 Récupérer le code source du noyau
Afficher le noyau actuellement utilisé
uname -r (查看当前内核版本
dpkg --get-selections | grep linux(查看所有相关配置文件
Généralement, choisissez un noyau supérieur à la version par défaut actuelle. Le code source du noyau peut être téléchargé sur le site officiel . La version que j'ai choisie est : Linux Kernel 5.10.2 (on dit que cette version a moins de problèmes.
Enregistrez le package d'installation dans un certain répertoire, puis faites un clic droit dans ce répertoire pour ouvrir un terminal et entrez la commande pour obtenir les autorisations (si vous avez déjà obtenu les autorisations, entrez-la plus tard sous root, sans ajouter sudo
sudo su
décompresser
tar -xavf linux-5.10.2.tar.xz
06 Ajouter des appels système personnalisés
Tout d’abord, entrez dans le répertoire où se trouve le code source décompressé du noyau.
cd linux-5.10.2
Ouvrez le fichier syscall_64.tbl avec le numéro d'appel système personnalisé et ajoutez l'appel système personnalisé après le dernier appel système commun.
sudo gedit arch/x86/entry/syscalls/syscall_64.tbl
07 Ajouter une déclaration et une définition de fonction
Ouvrez le fichier syscalls.h
sudo gedit include/linux/syscalls.h
Ajouter une déclaration de fonction à la fin
/*mq's syscall */
asmlinkage long sys_mysyscall(int number);
Ouvrez le fichier sys.c
sudo gedit kernel/sys.c
Ajouter une définition de fonction à la fin
/*mq's syscall */
SYSCALL_DEFINE1(mysyscall,int,number)
{
printk("mysyscall\n");
printk("The Number You Enter Is %d\n",number);
return number;
}
08 Compiler le noyau
Nettoyer les fichiers du noyau
sudo make mrproper
Supprimer divers fichiers de compilation, fichiers de configuration et divers fichiers de sauvegarde
sudo make clean
Sélectionnez automatiquement la portée de la compilation en fonction des modules chargés dans le noyau (gain de temps par rapport à make meunconfig), appuyez jusqu'au bout sur Entrée et OK
make localmodconfig
Modifier le fichier de configuration (gros gouffre !!
Entrez d'abord le fichier de configuration, puis appuyez sur Ctrl+F pour rechercher CONFIG_SYSTEM_TRUSTED_KEYS et définissez-le sur vide
. Si toutes les sélections de processus sont cohérentes avec l'auteur, alors ce paramètre dans le fichier .config est initialement défini sur vide.
sudo gedit .config
Compilation (le nombre derrière correspond au nombre de cœurs utilisés et au nombre de cœurs utilisés)
sudo make -j8
Le dernier dossier compilé est sound, qui peut être utilisé pour déterminer si le processus de compilation est terminé à mi-chemin.
Réinitialisez le noyau (j'ai échoué plusieurs fois à cette étape. Si cette étape échoue, vérifiez ce que vous avez fait de mal lors du processus précédent !
sudo make modules_install
sudo make install
09 Vérification
Redémarrage
reboot
Vérifiez la version actuelle du noyau . S'il s'agit de la version du noyau qui vient d'être compilée, l'expérience est réussie.
uname -r
Vérifier les appels système ajoutés
- Ouvrez l'éditeur et écrivez un programme C
sudo gedit test.c
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc,char **argv)
{
//441:long sys_mysyscall(int)
long temp;
temp = syscall(441,1314);
printf("mysyscall return %ld\n",temp);
return 0;
}
- Enregistrez, quittez et exécutez
sudo gcc -o test test.c
sudo ./test
- La sortie 1314 est un succès
10 PS—Suppression du noyau
Il y a eu quelques expériences où je voulais changer la version du noyau à mi-chemin, j'ai donc désinstallé la machine virtuelle et l'ai réinstallée. Plus tard, j'ai découvert que je pouvais simplement supprimer le noyau... Je viens de Chubby.
Afficher tous les fichiers du noyau
dpkg --get-selections | grep linux
Désinstaller (le fichier installé est suivi du mot installer, et après l'avoir désinstallé, il est désinstallé
sudo apt-get remove + 文件名
Supprimer les fichiers de configuration (nettoyage plus complet
sudo apt-get purge
renouveler
sudo update-grub
Épilogue
Quoi qu'il en soit, l'expérience a finalement réussi = =. Les étapes des expériences suivantes étaient évidemment exactement les mêmes mais il y avait toujours des problèmes (tellement bizarre !!), et puis j'ai juste changé pour une version miroir (encore plus bizarre orz), donc l'ordinateur c'est vraiment de la métaphysique (j'en suis sûr).