1
0
Fork 0
mirror of https://github.com/tailix/kernel.git synced 2024-10-30 12:03:52 -04:00

Improve paging code

This commit is contained in:
Alex Kotov 2021-12-18 08:44:19 +05:00
parent afa7c3c50d
commit ed452379f4
Signed by: kotovalexarian
GPG key ID: 553C0EBBEB5D5F08
2 changed files with 22 additions and 25 deletions

View file

@ -10,8 +10,8 @@ static PageDir page_dir;
void paging_enable() void paging_enable()
{ {
unsigned long cr0 = kernaux_arch_i386_read_cr0(); uint32_t cr0 = kernaux_arch_i386_read_cr0();
unsigned long cr4 = kernaux_arch_i386_read_cr4(); uint32_t cr4 = kernaux_arch_i386_read_cr4();
assert(cr0 & KERNAUX_ARCH_I386_CR0_PE, "The boot loader should have put us in protected mode."); assert(cr0 & KERNAUX_ARCH_I386_CR0_PE, "The boot loader should have put us in protected mode.");
@ -45,7 +45,7 @@ void paging_clear()
void paging_identity() void paging_identity()
{ {
for (int i = 0; i < PAGE_DIR_LENGTH; ++i) { for (size_t i = 0; i < PAGE_DIR_LENGTH; ++i) {
page_dir[i].addr = PAGE_DIR_ADDR(i * PAGE_BIG_SIZE); page_dir[i].addr = PAGE_DIR_ADDR(i * PAGE_BIG_SIZE);
page_dir[i].unused = 0; page_dir[i].unused = 0;
@ -61,15 +61,15 @@ void paging_identity()
} }
} }
int paging_mapkernel(const struct Kernel_Info *const kinfo) void paging_mapkernel(const struct Kernel_Info *const kinfo)
{ {
assert(!(kinfo->kernel_phys_base % PAGE_BIG_SIZE), "Kernel physical address is not aligned."); assert(!(kinfo->kernel_phys_base % PAGE_BIG_SIZE), "Kernel physical address is not aligned.");
assert(!(kinfo->kernel_virt_base % PAGE_BIG_SIZE), "Kernel virtual address is not aligned."); assert(!(kinfo->kernel_virt_base % PAGE_BIG_SIZE), "Kernel virtual address is not aligned.");
int pde = kinfo->kernel_virt_base / PAGE_BIG_SIZE; size_t pde = kinfo->kernel_virt_base / PAGE_BIG_SIZE;
unsigned long mapped = 0; size_t mapped = 0;
unsigned long kern_phys = kinfo->kernel_phys_base; size_t kern_phys = kinfo->kernel_phys_base;
while (mapped < kinfo->kernel_size) { while (mapped < kinfo->kernel_size) {
page_dir[pde].addr = PAGE_DIR_ADDR(kern_phys); page_dir[pde].addr = PAGE_DIR_ADDR(kern_phys);
@ -90,13 +90,10 @@ int paging_mapkernel(const struct Kernel_Info *const kinfo)
++pde; ++pde;
} }
return pde;
} }
unsigned long paging_load() void paging_load()
{ {
unsigned long page_dir_phys = (unsigned long)page_dir; size_t page_dir_phys = (size_t)page_dir;
kernaux_arch_i386_write_cr3(page_dir_phys); kernaux_arch_i386_write_cr3(page_dir_phys);
return page_dir_phys;
} }

View file

@ -9,17 +9,17 @@
#define PAGE_DIR_ADDR(base) ((base) >> 12) #define PAGE_DIR_ADDR(base) ((base) >> 12)
struct PageDir_Entry { struct PageDir_Entry {
unsigned int present : 1; unsigned present : 1;
unsigned int writable : 1; unsigned writable : 1;
unsigned int user : 1; unsigned user : 1;
unsigned int write_through : 1; unsigned write_through : 1;
unsigned int cache_disabled : 1; unsigned cache_disabled : 1;
unsigned int accessed : 1; unsigned accessed : 1;
unsigned int always_0 : 1; unsigned always_0 : 1;
unsigned int page_size : 1; unsigned page_size : 1;
unsigned int ignored : 1; unsigned ignored : 1;
unsigned int unused : 3; unsigned unused : 3;
unsigned int addr : 20; unsigned addr : 20;
} }
__attribute__((packed)); __attribute__((packed));
@ -29,7 +29,7 @@ void paging_enable();
void paging_clear(); void paging_clear();
void paging_identity(); void paging_identity();
int paging_mapkernel(const struct Kernel_Info *kinfo); void paging_mapkernel(const struct Kernel_Info *kinfo);
unsigned long paging_load(); void paging_load();
#endif #endif