11#include "memory.h"
22#include "multiboot.h"
3+ #include "heap.h"
34#include "../drivers/screen.h"
5+ #include "../asm/asmio.h"
6+ #include "../libs/string.h"
7+ extern void usermain ();
48
59page_directory_pointer_table_entry_t page_dir_ptr_tab [4 ] __attribute__((aligned (0x20 )));
610page_directory_table_entry_t page_dir [512 ] __attribute__((aligned (0x1000 )));
@@ -12,28 +16,37 @@ unsigned int pre_frame_map[20];
1216
1317void init_memory (multiboot_info_t * mymbd ) {
1418 mbd = mymbd ;
15- startframe = 0x300000 ;
19+ startframe = 0x400000 ;
1620 // Map a 2 mb single page using an entry in the page directory table (0-0x200000)
1721 page_dir_ptr_tab [0 ].present = 1 ;
1822 page_dir_ptr_tab [0 ].page_directory_table_address = (unsigned int )& page_dir >>12 ;
1923 page_dir [0 ].present = 1 ;
2024 page_dir [0 ].ro_rw = 1 ;
2125 page_dir [0 ].size = 1 ;
22- page_dir [0 ].page_table_address = 0 ;
26+ page_dir [0 ].page_table_address = 0 ;
2327 page_dir [0 ].kernel_user = 1 ;
24- // Map 512 4kb pages (0x200000-0x400000)
25- page_dir [1 ].present = 1 ;
26- page_dir [1 ].ro_rw = 1 ;
27- page_dir [1 ].page_table_address = (unsigned int )& page_tab >>12 ;
28- unsigned int i , address = 0 ;
29- for (i = 0 ; i < 512 ; i ++ )
30- {
31- page_tab [i ].present = 1 ;
32- page_tab [i ].ro_rw = 1 ;
33- page_tab [i ].physical_page_address = address >>12 ;
34- page_tab [i ].kernel_user = 1 ;
35- address = address + 0x1000 ;
36- }
28+ // page_dir[1].present = 1;
29+ // page_dir[1].ro_rw = 1;
30+ // page_dir[1].size = 1;
31+ // page_dir[1].page_table_address = 0x200000>>12;
32+ // page_dir[1].kernel_user = 1;
33+ ////////////////////////////////////////////////////////////////////////////
34+ // An unsuccessful attempt at making a Higher Half Kernel
35+ // unsigned int i, address = 0xB0000000;
36+ // puts("\n");
37+ // for(i = 388; i < 475; i++){
38+ // screen_print_int(address>>12, 16);
39+ // puts(" ");
40+ // page_dir[i].present = 1;
41+ // page_dir[i].ro_rw = 1;
42+ // page_dir[i].size = 1;
43+ // page_dir[i].page_table_address = (unsigned int)address>>12;
44+ // screen_print_int(page_dir[i].page_table_address, 16);
45+ // puts("\n");
46+ // getc();
47+ // page_dir[i].kernel_user = 0;
48+ // address = (unsigned int)((unsigned int)address + (unsigned int)0x200000);
49+ // }
3750 puts ("Enabaling PAE paging...\n" );
3851 enablePaePagingAsm ();
3952 loadPageDirectoryAsm ((unsigned int * )& page_dir_ptr_tab );
@@ -113,4 +126,49 @@ void kfree_frame(unsigned int page_frame_addr)
113126 page_frame_addr = (unsigned int )(page_frame_addr - startframe );
114127 // Divide by 4kb to get the index of the page frame in frame_map
115128 frame_map [((unsigned int )page_frame_addr )/0x1000 ] = 0 ;
129+ }
130+
131+ // Create a page directory pointer table for a userland process
132+ unsigned int create_pdpt () {
133+ unsigned int task_pdpt , task_dt , task_tab ;
134+ // Get a page frame for each pdpt, dt, pt because their address
135+ // must be 0x1000 (4096) byte aligned.
136+ task_pdpt = kalloc_frame ();
137+ task_dt = kalloc_frame ();
138+ task_tab = kalloc_frame ();
139+ // We are entering a critical section
140+ asmcli ();
141+ // Temporarily disable paging so we can write to the physical
142+ // addresses of paging tables without problems
143+ disablePagingAsm ();
144+ // Create the pointers
145+ page_directory_pointer_table_entry_t * temp_pdpt ;
146+ temp_pdpt = (page_directory_pointer_table_entry_t * )task_pdpt ;
147+ page_directory_table_entry_t * temp_dt ;
148+ temp_dt = (page_directory_table_entry_t * )task_dt ;
149+ page_table_entry_t * temp_tab ;
150+ temp_tab = (page_table_entry_t * )task_tab ;
151+ temp_pdpt [0 ].page_directory_table_address = (unsigned int )temp_dt >>12 ;
152+ temp_pdpt [0 ].present = 1 ;
153+ // Map the kernel space
154+ temp_dt [0 ].present = 1 ;
155+ temp_dt [0 ].ro_rw = 1 ;
156+ temp_dt [0 ].size = 1 ;
157+ temp_dt [0 ].page_table_address = 0 ;
158+ temp_dt [0 ].kernel_user = 0 ;
159+ // Map user space (0x300000-0x301000)
160+ temp_dt [1 ].present = 1 ;
161+ temp_dt [1 ].page_table_address = (unsigned int )temp_tab >>12 ;
162+ temp_dt [1 ].kernel_user = 1 ;
163+ temp_tab [256 ].present = 1 ;
164+ temp_tab [256 ].ro_rw = 1 ;
165+ temp_tab [256 ].physical_page_address = 0x300000 >>12 ;
166+ temp_tab [256 ].kernel_user = 1 ;
167+ // Re-enable interrupts and paging
168+ /* Temporary loading of the user task to the appropriate location
169+ * in memory. will be removed. */
170+ memcpy (0x300000 , & usermain , 0x1000 ); // temp
171+ enablePagingAsm ();
172+ asmsti ();
173+ return task_pdpt ;
116174}
0 commit comments