Enable paging
This commit is contained in:
parent
3212145e94
commit
6edeba8fe2
12 changed files with 81 additions and 19 deletions
|
@ -8,11 +8,12 @@ LD_SCRIPT := linker.ld
|
|||
BOOT_OBJ := $(addsuffix .o,$(basename $(shell find ./boot -name "*.[c|S]" ! -name "boot.S")))
|
||||
UTILS_OBJ := $(addsuffix .o,$(basename $(shell find ./utils -name "*.[c|S]")))
|
||||
LIBC_OBJ := $(addsuffix .o,$(basename $(shell find ./libc -name "*.[c|S]")))
|
||||
INT_OBJ := $(addsuffix .o,$(basename $(shell find ./int -name "*.[c|S]")))
|
||||
|
||||
|
||||
all: $(EXEC)
|
||||
|
||||
$(EXEC): boot/boot.o $(BOOT_OBJ) $(UTILS_OBJ) $(LIBC_OBJ) bringelle.o
|
||||
$(EXEC): boot/boot.o $(BOOT_OBJ) $(UTILS_OBJ) $(LIBC_OBJ) $(INT_OBJ) bringelle.o
|
||||
ld -n -T $(LD_SCRIPT) -nostdlib -o bringelle $^
|
||||
|
||||
%.o: %.S
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
.extern gdt_memcpy
|
||||
.extern mb_load_fb_tag
|
||||
|
||||
.set STACK_LOCATION, 0x50000
|
||||
.set STACK_LOCATION, 0x1FFFFF
|
||||
|
||||
.section .multiboot
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
#include "libc/stdio.h"
|
||||
#include "utils/pic.h"
|
||||
#include "int/pic.h"
|
||||
#include "boot/multiboot.h"
|
||||
#include "utils/mem.h"
|
||||
#include "utils/gdt.h"
|
||||
#include "utils/paging.h"
|
||||
|
||||
|
||||
char show_tics=0;
|
||||
|
||||
|
@ -21,11 +23,14 @@ void bringelle(){
|
|||
// Kernel boot sequence
|
||||
pic_enable_interrupt();
|
||||
print("Interrupts enabled\n");
|
||||
print("Kernel started !\n");
|
||||
|
||||
paging_enable();
|
||||
print("Paging enable!\n");
|
||||
print("Kernel started !");
|
||||
|
||||
show_tics=1;
|
||||
// Utask
|
||||
print("Launch user task ");
|
||||
show_tics=1;
|
||||
memcpy((void*)utask,(void*)0x300000, 100); // 100 bytes seems reasonable to load utask
|
||||
asm (
|
||||
"cli \n\t" // Ensure we do not get interrupted
|
||||
|
@ -33,20 +38,22 @@ void bringelle(){
|
|||
"movl %%eax, %0 \n\t" // Save kernel ss segment into the TSS
|
||||
"movl %%esp, %1 \n\t" // Save kernel esp into the TSS BEFORE setting up the stack
|
||||
"pushl $0x33 \n\t" // Push task ss which is 0x30 along with prlv which is 0x3
|
||||
"pushl $0x400000 \n\t" // Push task esp
|
||||
"pushl $0x30FFFF \n\t" // Push task esp
|
||||
"pushfl \n\t" // Retrieve flags
|
||||
"popl %%eax \n\t"
|
||||
"orl $0x200, %%eax \n\t" // Enable interrupt for the user task
|
||||
"and $0xffffbfff, %%eax \n\t" // Clear the NT flags
|
||||
"push %%eax \n\t" // Push task flags
|
||||
"push $0x23 \n\t" // Push task cs which is 0x20 along with prlv which is 0x3
|
||||
"push $0 \n\t" // Push task entry point
|
||||
"push $0x300000 \n\t" // Push task entry point
|
||||
"mov $0x2B, %%eax \n\t" // GDT entry 0x28 along with prlv which is 0x3
|
||||
"mov %%eax, %%ds \n\t" // Setting up user data segment
|
||||
"iret \n\t" // Launch user task
|
||||
: "=m" (TSS.ss0), "=m" (TSS.esp0)
|
||||
);
|
||||
|
||||
|
||||
|
||||
while(1);
|
||||
}
|
||||
|
||||
|
@ -63,3 +70,7 @@ void clock(){
|
|||
}
|
||||
|
||||
|
||||
void page_fault(){
|
||||
print("Page fault!");
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "8042.h"
|
||||
#include "framebuffer.h"
|
||||
#include "asm.h"
|
||||
#include "utils/framebuffer.h"
|
||||
#include "utils/asm.h"
|
||||
|
||||
DEFINE_AZERTY;
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef _8042_H
|
||||
#define _8042_H
|
||||
|
||||
#include "types.h"
|
||||
#include "utils/types.h"
|
||||
|
||||
void _8042_keypress();
|
||||
|
0
src/int/int.S
Normal file
0
src/int/int.S
Normal file
|
@ -1,7 +1,7 @@
|
|||
#include "pic.h"
|
||||
#include "asm.h"
|
||||
#include "mem.h"
|
||||
#include "syscall.h"
|
||||
#include "utils/asm.h"
|
||||
#include "utils/mem.h"
|
||||
#include "utils/syscall.h"
|
||||
|
||||
struct IDT_REGISTER IDTR={
|
||||
200*8,
|
||||
|
@ -55,14 +55,24 @@ asm (
|
|||
"outb %al, $0x20 \n\t"
|
||||
"RESTORE_REGS \n\t"
|
||||
"iret \n\t"
|
||||
"INT_PAGE_FAULT: \n\t"
|
||||
"SAVE_REGS \n\t"
|
||||
"call page_fault \n\t"
|
||||
"hlt \n\t"
|
||||
"movb $0x20, %al \n\t"
|
||||
"outb %al, $0x20 \n\t"
|
||||
"RESTORE_REGS \n\t"
|
||||
"iret \n\t"
|
||||
);
|
||||
|
||||
extern u32 PIC_IRQ_DEFAULT,PIC_IRQ_PRINT,PIC_IRQ_CLOCK, PIC_IRQ_SYSCALL;
|
||||
extern u32 PIC_IRQ_DEFAULT,PIC_IRQ_PRINT,PIC_IRQ_CLOCK, PIC_IRQ_SYSCALL,INT_PAGE_FAULT;
|
||||
|
||||
void pic_enable_interrupt(){
|
||||
// Map first default 32 entries
|
||||
for(int i=0;i<200;i++){
|
||||
pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_DEFAULT,IDT_INT_GATE},i);
|
||||
if(i==14)
|
||||
pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&INT_PAGE_FAULT,IDT_INT_GATE},i);
|
||||
if(i==32)
|
||||
pic_add_idt_entry((IDT_ENTRY){0x08,(u32)&PIC_IRQ_CLOCK,IDT_INT_GATE},i);
|
||||
if(i==33)
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef PIC_H
|
||||
#define PIC_H
|
||||
|
||||
#include "types.h"
|
||||
#include "utils/types.h"
|
||||
|
||||
#define IDT_INT_GATE 0x8E00
|
||||
#define IDT_TRAP_GATE 0xEF00
|
|
@ -35,13 +35,13 @@ void gdt_memcpy(){
|
|||
|
||||
// ----- User Segments
|
||||
GDT_ENTRY ucs_desc;
|
||||
ucs_desc.base=0x300000;
|
||||
ucs_desc.base=0; // With paging will take care of allocating the right address for each task
|
||||
ucs_desc.limit=0xFFFFF;
|
||||
ucs_desc.flags=GDT_SZ|GDT_GR;
|
||||
ucs_desc.access=GDT_PR|GDT_PRVL_3|GDT_S|GDT_EXEC|GDT_RW|GDT_DC;
|
||||
|
||||
GDT_ENTRY uds_desc;
|
||||
uds_desc.base=0x300000;
|
||||
uds_desc.base=0;
|
||||
uds_desc.limit=0xFFFFF;
|
||||
uds_desc.flags=GDT_SZ|GDT_GR;
|
||||
uds_desc.access=GDT_PR|GDT_PRVL_3|GDT_S|GDT_RW;
|
||||
|
|
31
src/utils/paging.c
Normal file
31
src/utils/paging.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
#include "paging.h"
|
||||
|
||||
void paging_enable(){
|
||||
int *page_dir=(int*)PAGING_DIR_LOCATION;
|
||||
int *page_table=(int*)PAGING_TABLE_LOCATION;
|
||||
|
||||
// Init page directory
|
||||
for(int i=0;i<1024;i++)
|
||||
page_dir[i]=0;
|
||||
page_dir[0]=(int)page_table;
|
||||
page_dir[0] |=7; // Permissions
|
||||
|
||||
// Init page table 0
|
||||
int addr_offset=0;
|
||||
for(int i=0;i<1024;i++){
|
||||
page_table[i]=addr_offset;
|
||||
page_table[i]|=7; // Permission
|
||||
addr_offset+=4096; // 4Ko pages
|
||||
}
|
||||
|
||||
// Turns on paging
|
||||
asm(
|
||||
"movl %0, %%eax \n\t"
|
||||
"movl %%eax, %%cr3 \n\t" // Configure page table location
|
||||
"movl %%cr0, %%eax \n\t"
|
||||
"orl %1, %%eax \n\t"
|
||||
"movl %%eax, %%cr0 \n\t" // Turn on paging
|
||||
:: "i" (PAGING_DIR_LOCATION), "i" (PAGING_CR0_BIT)
|
||||
);
|
||||
|
||||
}
|
10
src/utils/paging.h
Normal file
10
src/utils/paging.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#ifndef PAGING_H
|
||||
#define PAGING_H
|
||||
|
||||
#define PAGING_CR0_BIT 0x80000000
|
||||
#define PAGING_DIR_LOCATION 0x1000
|
||||
#define PAGING_TABLE_LOCATION 0x5000
|
||||
|
||||
void paging_enable();
|
||||
|
||||
#endif
|
|
@ -5,11 +5,10 @@
|
|||
void syscall(){
|
||||
int call_number;
|
||||
asm("movl %%eax, %0":"=m"(call_number));
|
||||
int user_ds=gdt_user_ds_base();
|
||||
if(call_number==1){
|
||||
int msg_addr;
|
||||
asm("movl %%ebx, %0":"=m"(msg_addr));
|
||||
char *msg=(char*)user_ds+msg_addr;
|
||||
char *msg=(char*)msg_addr;
|
||||
print(msg);
|
||||
}
|
||||
else{
|
||||
|
|
Loading…
Add table
Reference in a new issue