Skip to content

Commit

Permalink
add paging
Browse files Browse the repository at this point in the history
  • Loading branch information
tw4452852 committed Sep 18, 2013
1 parent 2524034 commit cf55be4
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 8 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
*.swp
*.o
*.d
cscope.*
boot.bin
hd.img
orange/
4 changes: 2 additions & 2 deletions boot/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ all: $(BINFILE) $(HDIMAGE)
$(HDIMAGE):
dd if=/dev/zero of=$@ bs=1M count=32

$(BINFILE): $(OBJFILES)
ld $(LDFLAGS) -o $@ $+
$(BINFILE): $(OBJFILES) $(LDSCRIPT)
ld $(LDFLAGS) -o $@ $(OBJFILES)

clean:
-@rm -fr $(OBJFILES) $(DEPFILES) $(BINFILE)
Expand Down
7 changes: 7 additions & 0 deletions boot/boot.ld
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ MEMORY
{
BOOT : ORIGIN = 0x7c00, LENGTH = 512
MAIN : ORIGIN = 0X10000, LENGTH = 16M
PAGE : ORIGIN = 0X100000, LENGTH = 8M
}
SECTIONS
{
Expand All @@ -23,4 +24,10 @@ SECTIONS
*(.text)
*(.*)
} > MAIN = 0

.page :
{
_cmain_end = .;
} > PAGE = 0

}
2 changes: 1 addition & 1 deletion boot/gdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ gdt_init()
} __attribute__ ((packed)) gdtr;
gdtr.addr = (unsigned long)gdt;
gdtr.limit = GDT_MAX_DESCS * sizeof(u64);
__asm__("lgdt %0"::"m"(gdtr));
__asm__ __volatile__("lgdt %0"::"m"(gdtr));
}

inline void
Expand Down
2 changes: 1 addition & 1 deletion boot/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ init_idt()
} __attribute__ ((packed)) idtr;
idtr.addr = (u32)idt;
idtr.limit = IDT_MAX_DESCS * sizeof(u64);
__asm__(
__asm__ __volatile__(
"cli\n\t"
"lidt %0\n\t"
::"m"(idtr)
Expand Down
2 changes: 1 addition & 1 deletion boot/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ cmain()
gdt_init();
reload_segs(SEL_DATA_PL0);
tw_printf("%%%s: (%d=0x%x=0b%b)\n", "cmain", 10, 10, 10);
show_mem_map();
interrupt_init();
mem_init();
keyboard_init();
timer_init();

Expand Down
67 changes: 66 additions & 1 deletion boot/mem.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "common.h"
#include "mem.h"
#include "video.h"

Expand Down Expand Up @@ -45,7 +46,7 @@ tw_memcmp(char *dst, char *src, int len)
return ret;
}

void
static void
show_mem_map()
{
long cnt = *(long *)MEM_DESC_CNT_ADDR, i;
Expand All @@ -59,3 +60,67 @@ show_mem_map()
descs[i].type);
}
}

static void
add_a_page(u32 addr, u32 *page_dir)
{
int dir_index, tbl_index;
u32 *page_tbl;

dir_index = (addr>>22)&0x3ff;
tbl_index = (addr>>12)&0x3ff;
page_dir[dir_index] |= 1;
page_tbl = (u32 *)((page_dir[dir_index])&0xfffff000);
page_tbl[tbl_index] |= 1;
}

extern char* _cmain_end;
static void
setup_page()
{
int i;
u32 *page_dir = (u32 *)(((u32)(&_cmain_end) & 0xfffff000) + 0x1000);
u32 *page_tbl = page_dir + 0x1000;
u32 addr = 0;
long cnt = *(long *)MEM_DESC_CNT_ADDR;
mem_desc_s *descs = (mem_desc_s *)MEM_MAP_ADDR;

tw_printf("0x%x, 0x%x\n", page_dir, page_tbl);
// setup blank page directory
for (i = 0; i < 1024; i++) {
page_dir[i] = (u32)(&page_tbl[i*1024]) | 2;
}
for (i = 0; i < 1024*1024; i++) {
page_tbl[i] = addr | 2;
addr += 0x1000;
}
for (i = 0; i < cnt; i++) {
for (addr = 0; addr < descs[i].length_low; addr += 0x1000) {
add_a_page(descs[i].base_low + addr, page_dir);
}
}
// add video memory map
for (i = 0; i < VIDEO_RAM_SIZE; i += 0x1000) {
add_a_page(VIDEO_RAM_START_ADDR + i, page_dir);
}
// add local apic memory map
for (i = 0; i < 0x1000; i += 0x1000) {
add_a_page(0xfee00000+i, page_dir);
}

// tell cpu the page directory address
__asm__ __volatile__("movl %0, %%cr3"::"b"(page_dir));
// enable paging
__asm__ __volatile__(
"movl %cr0, %eax\n\t"
"orl $0x80000000, %eax\n\t"
"movl %eax, %cr0\n\t"
);
}

void
mem_init()
{
show_mem_map();
setup_page();
}
2 changes: 1 addition & 1 deletion boot/mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,6 @@ typedef struct {
long type;
} mem_desc_s;

void show_mem_map(void);
void mem_init(void);
int tw_memcmp(char *dst, char *src, int len);
#endif /* end of include guard: MEM_H */

0 comments on commit cf55be4

Please sign in to comment.