Deze tutorial zal proberen te laten zien hoe je een eenvoudige pagina kader allocator voor de x86 CPU schrijven. De gebruikte taal C en we zijn met behulp van standaard paging met 4 KiB pagina's. De paginaframe allocator wordt frames toewijzen van het eerste frame begint direct na afloop van de kernel.
Elk frame wordt beheerd door een byte kaart (omwille van de eenvoud) : een waarde van 0x01 voor gebruikte pagina's en een waarde van 0x00 voor ongebruikte pagina's.
Om een pagina toe te wijzen, alles wat nodig is, is om door middel van de reeks voor een gratis pagina en vervolgens markeren als gebruikt. Je hebt misschien gemerkt dat dit zeer inefficiënt zou zijn, hebben te zoeken door middel van een aantal mogelijke 1048319 pagina's. Om het tempo van de toewijzing van de allocator zal 20 pagina frames toe te wijzen in een tijd, dus de meeste van de tijd dat alles zal zijn gedaan voor de hand. Alocatting een nieuwe pagina is gewoon een kwestie van een pagina kader uit een reeks van vooraf toegewezen frames.
In de eerste plaats zullen we iets in de linker-script nodig hebben om ons te vertellen waar het einde van onze kernel.
ENTRY (loader) SECTIONS {. = 0x00100000; .text:. {text_start =; (. rodata): * (. tekst)} .rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. data) end_data =;} .bss:.. {sbss =; * (Vaak) * (BSS). EBSS =.; endkernel =.; }}De variabele endkernel zal worden verklaard in de kernel als:
extern u32int endkernel;De variabele zelf heeft geen waarde, is het adres van de variabele die we gebruiken.
endkernel wordt gebruikt om het adres van de eerste paginaframe berekenen na de kernel. De code voor het zoeken door middel van de reeks is ook zeer eenvoudig:
statische pageframe_t kalloc_frame_int () {u32int i = 0; while (frame_map [i] = GRATIS!) {i ++; if (i == npages) {return (ERROR); }} Frame_map [i] = GEBRUIKT; return (startframe + (i * 0x1000)); //terug het adres van de pagina kader gebaseerd op de locatie vrij verklaard //in de array}De laatste functie gebruikt oproepen kalloc_frame_int elke 20 pagina kader toewijzingen:
pageframe_t kalloc_frame () {statische u8int toewijzen = 1; //of we gaan naar een nieuwe reeks van preframes wijzen statische u8int PKADER = 0; pageframe_t ret; if (PKADER == 20) {toewijzen = 1; } If (toewijzen == 1) {voor (int i = 0; i {pre_frames [i] = kalloc_frame_int ();} PKADER = 0; toHet creëren van een Flash-platform game met flixel en Flex - Getting Started
- Aantrekkelijk en Professional Web Pages
- Combo Box Messages
- Leer Cobol programmeren en krijg een break through.
- ECMAScript String Regelmatige Expressions
- Data Manipulation in Mysql
- Console toepassing voor het maken Driehoek Piramide Met behulp van C # Code
- Android programmeren: Hello World [1]
- Aan de slag met C ++ door Chrys
- Verklaringen in Sybase Compound Statements
- Mysql Access Privileges