Système d'exploitation basé sur x86 construit à partir de zéro à des fins d'apprentissage
int 64 qui a exigé des descripteurs de porte pour l'escalade des privilègesPour construire un système d'exploitation (en supposant GCC, NASM installé),
makeCourir sous qemu
make qemuPour fonctionner (en supposant des bochs, Bochs-SDL installé),
make runExécuter sous Qemu avec le support de débogage (GDB)
make qemu_gdb(Attacher GDB, commandes requises déjà fournies dans le fichier .gdbinit dans le dir de niveau supérieur)
Le BIOS démarre le processeur en mode réel 16 bits, Grub initie le mode protégé 32 bits. L'image elfe du noyau est fournie avec un en-tête multiboot selon la spécification GRUB, si Grub trouve cet en-tête dans les 512 octets d'image en premier, alors il charge ELF à l'emplacement 0x100000, la mémoire inférieure appartient au BIOS et d'autres mappages matériels / IO comme VGA. Code de démarrage, exécute à partir du point d'entrée _start du noyau, et (note BSS est déjà zéro initialisé par grub),
Allocateur de mémoire de stratégie first-fit simple, alloue la mémoire de l'espace du noyau, pendant free il gère également le compactage de blocs libres adjacents.
Pour les espaces utilisateur malloc / free, sont fournis, ce qui a utilisé en interne l'appel système sbrk pour augmenter la rupture du système (si nécessaire). Le noyau fait des configurations de table de page requises et des rendements augmentent la limite de rupture du système.
Ceci est divisé en mappage de mémoire d'espace du noyau et mappages de mémoire d'espace utilisateur. Les mappages d'espace du noyau restent constants et font partie de chaque espace d'adresse de processus, seuls liés non clonés, car les changements d'un processus dans l'espace du noyau doivent également être visibles d'autres processus.
Les mappages d'espace utilisateur dépendent de l'appel exec , et chaque processus a son propre noyau ainsi que la pile d'utilisateurs.
Pendant le commutateur de contexte, le registre CR3 est chargé avec l'adresse de base du répertoire de la page de processus actuelle et qui invalide également en interne TLB (tampon LookSide de traduction).
Les applications d'espace utilisateur sont stockées dans initramfs , un format CPIO Archieve au format ELF standard. Pendant l'image ELF exec KERNEL FINDS ET PARSES ELF, configure ses tables de page en conséquence. Le processus Init commence seulement shell puis s'y accroche pour toujours.
Scheduler s'exécute au nom du processus en cours d'exécution, principalement dans deux cas,
Les segments de code / de données de mode de noyau sont séparés que les segments de code / données de mode utilisateur avec les niveaux de privilège programmés en conséquence. En retournant de l'exception, le matériel apparaît CS (segment de code) et SS (segment de pile) de Stack pour revenir au niveau de privilège inférieur.
Nous programmons cette trame de pile en conséquence tout en créant une nouvelle tâche,
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;Le matériel X86 a une prise en charge intégrée pour la commutation des tâches, en fondant essentiellement de la pile utilisateur à la pile du noyau ainsi que d'autres paramètres de segmentation. Pour cela, chaque tâche doit configurer avec son propre TSS, qui est modifié lors de la commutation de contexte. Nous n'utiliserons pas la commutation des tâches matérielles, mais nous ferons de même dans le logiciel lui-même. Dans tous les cas, nous devons configurer au moins un TSS qui a un mode de noyau valide SS (segment de pile) et ESP (pointeur de pile) pour la tâche actuelle.
FAQ aléatoire
N'hésitez pas à se nourrir et à envoyer une demande de fusion