mirror of
https://github.com/tailix/kernel.git
synced 2024-10-30 12:03:52 -04:00
Add mapping func
This commit is contained in:
parent
6dc84eba38
commit
be3fb904d8
1 changed files with 34 additions and 29 deletions
|
@ -1,10 +1,11 @@
|
||||||
#include "paging.h"
|
#include "paging.h"
|
||||||
|
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
|
||||||
#include <kernaux/libc.h>
|
#include <kernaux/libc.h>
|
||||||
#include <kernaux/stdlib.h>
|
#include <kernaux/stdlib.h>
|
||||||
|
|
||||||
|
static void mapping(struct Paging *paging, uint32_t virt, uint32_t phys);
|
||||||
|
|
||||||
void paging_load(struct Paging *const paging)
|
void paging_load(struct Paging *const paging)
|
||||||
{
|
{
|
||||||
uint32_t page_dir_phys = (uint32_t)&paging->page_dir;
|
uint32_t page_dir_phys = (uint32_t)&paging->page_dir;
|
||||||
|
@ -49,17 +50,8 @@ void paging_clear(struct Paging *const paging)
|
||||||
void paging_identity(struct Paging *const paging)
|
void paging_identity(struct Paging *const paging)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < PAGE_DIR_LENGTH; ++i) {
|
for (size_t i = 0; i < PAGE_DIR_LENGTH; ++i) {
|
||||||
paging->page_dir[i].addr = PAGE_DIR_ADDR(i * PAGE_BIG_SIZE);
|
const size_t addr = i * PAGE_BIG_SIZE;
|
||||||
|
mapping(paging, addr, addr);
|
||||||
paging->page_dir[i].available1 = 0;
|
|
||||||
paging->page_dir[i].page_size = 1;
|
|
||||||
paging->page_dir[i].available0 = 0;
|
|
||||||
paging->page_dir[i].accessed = 0;
|
|
||||||
paging->page_dir[i].cache_disabled = 1;
|
|
||||||
paging->page_dir[i].write_through = 1;
|
|
||||||
paging->page_dir[i].user = 1;
|
|
||||||
paging->page_dir[i].writable = 1;
|
|
||||||
paging->page_dir[i].present = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,27 +62,40 @@ void paging_mapkernel(
|
||||||
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.");
|
||||||
|
|
||||||
size_t pde = kinfo->kernel_virt_base / PAGE_BIG_SIZE;
|
size_t phys = kinfo->kernel_phys_base;
|
||||||
|
size_t virt = kinfo->kernel_virt_base;
|
||||||
size_t mapped = 0;
|
size_t mapped = 0;
|
||||||
size_t kern_phys = kinfo->kernel_phys_base;
|
|
||||||
|
|
||||||
while (mapped < kinfo->kernel_size) {
|
while (mapped < kinfo->kernel_size) {
|
||||||
paging->page_dir[pde].addr = PAGE_DIR_ADDR(kern_phys);
|
mapping(paging, virt, phys);
|
||||||
|
|
||||||
paging->page_dir[pde].available1 = 0;
|
|
||||||
paging->page_dir[pde].page_size = 1;
|
|
||||||
paging->page_dir[pde].available0 = 0;
|
|
||||||
paging->page_dir[pde].accessed = 0;
|
|
||||||
paging->page_dir[pde].cache_disabled = 0;
|
|
||||||
paging->page_dir[pde].write_through = 0;
|
|
||||||
paging->page_dir[pde].user = 0;
|
|
||||||
paging->page_dir[pde].writable = 1;
|
|
||||||
paging->page_dir[pde].present = 1;
|
|
||||||
|
|
||||||
|
phys += PAGE_BIG_SIZE;
|
||||||
|
virt += PAGE_BIG_SIZE;
|
||||||
mapped += PAGE_BIG_SIZE;
|
mapped += PAGE_BIG_SIZE;
|
||||||
kern_phys += PAGE_BIG_SIZE;
|
}
|
||||||
|
}
|
||||||
++pde;
|
|
||||||
|
void mapping(
|
||||||
|
struct Paging *const paging,
|
||||||
|
const uint32_t virt,
|
||||||
|
const uint32_t phys
|
||||||
|
) {
|
||||||
|
KERNAUX_NOTNULL_RETURN(paging);
|
||||||
|
|
||||||
|
const size_t pde_index = virt / PAGE_BIG_SIZE;
|
||||||
|
struct KernAux_Arch_I386_PDE *const pde = &paging->page_dir[pde_index];
|
||||||
|
|
||||||
|
if (!pde->present) {
|
||||||
|
pde->addr = PAGE_DIR_ADDR(phys);
|
||||||
|
|
||||||
|
pde->available1 = 0;
|
||||||
|
pde->page_size = 1;
|
||||||
|
pde->available0 = 0;
|
||||||
|
pde->accessed = 0;
|
||||||
|
pde->cache_disabled = 0;
|
||||||
|
pde->write_through = 0;
|
||||||
|
pde->user = 0;
|
||||||
|
pde->writable = 1;
|
||||||
|
pde->present = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue