Ce tutoriel va tenter de vous montrer comment rédiger un texte simple allocateur page de cadre pour le CPU x86. Le langage utilisé est C et nous utilisons la pagination standard avec 4 pages KiB. L'allocateur de cadre de page va allouer cadres avec la première image de départ juste après la fin du noyau.
Chaque cadre doit être géré avec une carte d'octets (pour des raisons de simplicité) : une valeur de 0x01 pour les pages utilisées et une valeur de 0x00 pour les pages inutilisées.
Pour allouer une page, tout ce qui est nécessaire est de chercher à travers le réseau pour une page libre, puis la marquer comme utilisé. Vous avez peut-être remarqué que ce serait très inefficace, avoir à chercher dans un certain nombre possible de 1048319 pages. Pour accélérer le processus d'attribution de l'allocateur va allouer 20 cadres de page à la fois, donc la plupart du temps tout ce qui aura été fait avant de la main. Alocatting une nouvelle page est tout simplement une question d'obtenir un cadre de page au large éventail de cadres d'une préallouées.
Tout d'abord, nous aurons besoin de quelque chose dans le script de linker de nous dire où la fin de notre noyau est.
ENTRÉE (chargeur) {SECTIONS. = 0x00100000; .text:. {text_start =; (. Rodata): * (. texte)} .rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. des données) end_data =;} .bss:.. {sbss =; * (COMMUN) * (de BSS.) EBSS =.; endkernel =.; }}Le endkernel variable sera déclaré dans le noyau comme:
extern u32int endkernel;La variable n'a pas de valeur, il est l'adresse de la variable que nous utilisons.
endkernel sera utilisé pour calculer l'adresse de la première trame de la page après que le noyau. Le code pour la recherche à travers le réseau est également très simple:
kalloc_frame_int de pageframe_t statique () {u32int i = 0; while (frame_map [i] = GRATUIT!) {i ++; si (i == NPAGES) {return (erreur); }} Frame_map [i] = utilisées; retour (startFrame + (i * 0x1000)); //retourne l'adresse du cadre de page basée sur l'emplacement déclaré //gratuitement dans le tableau}La dernière fonction utilisée appels kalloc_frame_int toutes les 20 allocations de page de cadre:
pageframe_t kalloc_frame () {u8int statique allouer = 1; si oui ou non //nous allons allouer un nouvel ensemble de précadres statique u8int pFrame = 0; ret pageframe_t; si (pFrame == 20) {allouer = 1; }Création d'un jeu de plateforme flash avec Flixel et Flex - Obtenir Started
- Tutorial MySQL et Commandes partie 1
- iPhone redimensionnement d'une UIImage
- Notions de base de la POO dans Php
- Html5 pouvez faire comme Flash And Silverlight
- Données MySQL Types
- La logique booléenne Pour Javascript
- Airtel Dth HD à offrir Dolby Digital Plus 7.1 canaux Sound
- Sujets complémentaires dans une conception de site Web Course
- Perl référence à un Array
- Tableaux dans C