C'était une grande courbe d'apprentissage qui m'a apparemment aidé à favoriser des idées plus théoriques et conceptuelles entourant les théories / lois sur les mystères sous-jacents des systèmes d'exploitation et des grains. J'avais présumé, j'avais une bonne idée sur le fonctionnement de l'OSS. Cependant, créer mon propre système d'exploitation était absolument plus définitif par rapport à la lecture. Dans ma propre opinion honnête. C'était une façon pour moi d'avoir une meilleure compréhension des logiciels avec lesquels je voudrais jouer sur le mode du noyau et le mode utilisateur.
Avant de commencer, même si le noyau et le système d'exploitation sont de 32 bits. J'expliquerai également les concepts en 64 bits, évidemment l'un d'entre eux étant en mode long.
Modes
Interruptions
Descripteurs
Pagination
Lisez plus en mode protégé dans Intel® 64 et IA-32 Architectures Logiciel Manuel Volume 3A: Guide de programmation système, partie 1; Chapitre 3 *
Que sont les interruptions
Vous pouvez considérer les interruptions comme étant un signal ou des données envoyées par un appareil tel que le clavier, le disque solide, le pilote dur ou la souris et les logiciels qui indiquent le processeur qu'un événement s'est produit et doit immédiatement arrêter ce qu'il fait actuellement, pour procéder à ce qui lui a envoyé l'interruption.
Par exemple, lorsque vous déplacez / cliquez sur une souris, le contrôleur de souris enverra une interruption au contrôleur d'interruption pour le CPU, l'attention du CPU ira immédiatement à l'interruption de la souris et procédera à une routine (mouvement de la souris ou cliquer). Après l'interruption de la souris, le CPU continuera à faire tout ce qu'il était avant l'interruption ou à gérer une autre interruption s'il a été signalé.
+------------------------+ +------------+
| TYPES OF INTERRUPTS |------------| Exceptions |
+------------------------+ +------------+
/
/
/
+------------+ +------------+
| HARDWARE | | SOFTWARE |
| INTERRUPTS | | INTERRUPTS |
+------------+ +------------+
Lignes IRQ, ou IRQ basées sur PIN: celles-ci sont généralement acheminées statiquement sur le chipset. Les fils ou les lignes passent des appareils du chipset à un contrôleur IRQ qui sérialise les demandes d'interruption envoyées par les appareils, en les envoyant au CPU un par un pour éviter les courses. Dans de nombreux cas, un contrôleur IRQ enverra plusieurs IRQ au CPU à la fois, en fonction de la priorité de l'appareil. Un exemple de contrôleur IRQ très connu est la chaîne de contrôleur Intel 8259, qui est présente sur tous les chipsets compatibles IBM-PC, enchaînant deux contrôleurs ensemble, fournissant chacun 8 broches d'entrée pour un total de 16 broches de signalisation IRQ utilisables sur le héritage IBM-PC.
Interruptions basées sur des messages: celles-ci sont signalées en écrivant une valeur à un emplacement de mémoire réservé aux informations sur le périphérique d'interruption, l'interruption elle-même et les informations de vectorisation. L'appareil se voit attribuer un emplacement auquel il écrit soit par firmware ou par le logiciel du noyau. Ensuite, un IRQ est généré par l'appareil à l'aide d'un protocole d'arbitrage spécifique au bus de l'appareil. Un exemple de bus qui fournit des fonctionnalités d'interruption basés sur des messages est le bus PCI. Par wiki.osdev - https://wiki.osdev.org/interrupts
Entrée - L'entrée définit une région en mémoire par où commencer, ainsi que la limite de la région et les privilèges d'accès associés à l'entrée. Privilège d'accès comme dans Disent le processeur si le système d'exploitation est en cours d'exécution dans le système (Ring 0) ou l'application (Ring 3). Il empêche les applications ou la mode Usermode d'avoir accès à certains registres / opérandes et mnémoniques. Tels que les registres CR et CLI / STI respectivement.
Limite - La taille du descripteur du segment
Sélecteur de segment - Ce sont des registres qui détiennent l'index des descripteurs
Pour être plus explicite, un index n'est pas un sélecteur
Choses qu'un registre de segment détient:
Accédez à la table des descripteurs a également privilEGDE, c'est ce qu'on appelle RPL (demande de privilège de demande) pour chaque registre, mais pour le cs est appelé CPL (niveau de privilège actuel). Ils servent tous les deux des objectifs différents, que vous pouvez découvrir dans les manuels Intel ou AMD.
La table à utiliser pour étudier. Un tableau est le GDT, l'autre est le LDT.
Une règle informelle pour imaginer conceptuellement l'utilisation du sélecteur: la règle informelle est donc:
sélecteur = index + table_to_use + privilège table_to_use + index = descriptor = toutes les informations sur le segment de la mémoire à utiliser
où le signe plus n'est pas une opération arithmétique
Bit Champ of Segment Selector Register:
15 3 2 0
+--------------------------------------------------+----+--------+
| Index | TI | RPL |
+--------------------------------------------------+----+--------+
TI = Table Indicator: 0 = GDT, 1 = LDT
The TI specify if the Descriptor were dealing with is a GDT or LDT
IF(TI == 0) THEN
... THE DESCRIPTOR IS A GDT
ELSEIF(TI == 1) THEN
... THE DESCRIPTOR IS A LDT
GDT est 1: 1 avec une adresse logique, un exemple du GDT travaillant avec le sélecteur:
<---- Selector ----> +----- Segment Selector Register
+-------+----+-----+ v
| Index | TI | RPL | = DS
+-------+----+-----+ GDT LDT
| | +---------------------+ +---------------------+
| +------------>| Null Descriptor | | Null Descriptor |
| +---------------------+ +---------------------+
| | Descriptor 1 | | Descriptor 1 |
| +---------------------+ +---------------------+
| | | | |
| ... ... ... ... ... ... ... ...
| | |
| +---------------------+
+------------------->| Descriptor K |
+---------------------+
| |
... ... ... ...
RPL (Request Privilege Level) describes the privilege for accessing the descriptor
Nous stockons toute la base GDT (adresse) et limite (taille de notre GDT) dans le GDTR. Le GDTR pointe vers toutes nos entrées GDT en mémoire, à partir de la base. Après cela, il est ensuite chargé du lgdt Mnemonic:
typedef union _gdt_descriptor
{
struct
{
uint64_t limit_low : 16 ;
uint64_t base_low : 16 ;
uint64_t base_middle : 8 ;
uint64_t access : 8 ;
uint64_t granularity : 8 ;
uint64_t base_high : 8 ;
};
} __attribute__((packed)) gdt_entry_t ;
gdt_entry_t gdt_entrys[ 256 ];
/* The GDTR (GDT Register) */
struct gdtr
{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) gdtr;
...
gdtr.base = &gdt_entrys;
gdtr.limit = ( sizeof (gdt_descr) * 256 ) - 1 )
Lisez-vous en savoir plus dans le manuel du programmeur AMD64 Architecture, volume 2, section 4.7 (p. 84 - 90 {+})
référence à cela et à l'avance. https://notes.shichao.io/utlk/ch2/#paging-in-hardware c'était de loin le plus amusant que j'ai eu, j'étais extrêmement excité une fois que je l'ai compris.
X86 OS Adresse virtuelle de paginage hérité avec 4KB Pages:
X86 OS CR4.Pae Adresse virtuelle de pagination avec Page 4KB:
x86_64 (IA-32E) OS CR4.lme / cr
• Les drapeaux WP et PG dans le registre de contrôle CR0 (bit 16 et bit 31, respectivement).
• Les drapeaux PSE, PAE, PGE, PCIDE, SMEP, SMAP et PKE dans le registre de contrôle CR4 (Bit 4, Bit 5, Bit 7, Bit 17, Bit 20, Bit 21 et Bit 22, respectivement).
• Les drapeaux LME et NXE dans le MSR IA32_EFER (Bit 8 et Bit 11, respectivement). • Le drapeau AC dans le registre EFLAGS (BIT 18). Par le chapitre 4 des Intel® 64 et IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide, partie 1; Chapitre 4
• Les drapeaux LME et NXE dans le MSR IA32_EFER (Bit 8 et Bit 11, respectivement). • Le drapeau AC dans le registre EFLAGS (BIT 18). Chapitre 4 du manuel Intel® 64 et IA-32 Architectures Volume Manuel Volume 3A: Guide de programmation système, partie 1; Chapitre 4
Si CR4.pae et / ou CR4.lme est réglé sur 1, alors PSE est complètement ignoré.
Aucun terminal ajouté
cd smkrnl; make run
Pour l'étincelle d'inspiration / soutien sur mon effort continu sur ce projet et pour m'aider à comprendre certains concepts dans le développement du noyau / OS. =)