added code to reset segmentation and enable paging; added fmt_xl2a() in kio; added debug prints in k_bootstrap() since kernel is crashing when trying to enable paging
git-svn-id: svn://anubis/hos/trunk@49 5b3e749e-e535-0410-8002-a9bb6afbdfca
This commit is contained in:
parent
0fb590a407
commit
df719b4281
@ -8,7 +8,7 @@
|
|||||||
%define MULTIBOOT_HEADER_FLAGS 0x00010003
|
%define MULTIBOOT_HEADER_FLAGS 0x00010003
|
||||||
|
|
||||||
%define VIRTUAL_OFFSET 0xE0000000 ; kernel virtual addr
|
%define VIRTUAL_OFFSET 0xE0000000 ; kernel virtual addr
|
||||||
%define CONSOLE_MEMORY VIRTUAL_OFFSET + 0xB8000
|
%define CONSOLE_MEMORY 0xB8000
|
||||||
|
|
||||||
%define PAGE_SIZE 0x1000 ; 4KB pages
|
%define PAGE_SIZE 0x1000 ; 4KB pages
|
||||||
|
|
||||||
@ -16,7 +16,7 @@
|
|||||||
extern _end, _bss
|
extern _end, _bss
|
||||||
|
|
||||||
; Symbols from C
|
; Symbols from C
|
||||||
extern k_bootstrap, bootstrap_stack
|
extern k_bootstrap, bootstrap_stack, mm_gdtr
|
||||||
|
|
||||||
;-------------------------------------------------------
|
;-------------------------------------------------------
|
||||||
[section .text]
|
[section .text]
|
||||||
@ -48,7 +48,7 @@ multiboot_header:
|
|||||||
;**************************************************************************
|
;**************************************************************************
|
||||||
multiboot_entry:
|
multiboot_entry:
|
||||||
mov cx, 0x0700 + 'a'
|
mov cx, 0x0700 + 'a'
|
||||||
mov [CONSOLE_MEMORY-VIRTUAL_OFFSET+160*8+0*2], cx
|
mov [CONSOLE_MEMORY+160*8+0*2], cx
|
||||||
|
|
||||||
lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR
|
lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR
|
||||||
jmp KERNEL_CODE_32_TMP_SEG:segmented_start
|
jmp KERNEL_CODE_32_TMP_SEG:segmented_start
|
||||||
@ -67,7 +67,7 @@ segmented_start:
|
|||||||
mov esp, bootstrap_stack+4096-4 ; set up temporary stack space
|
mov esp, bootstrap_stack+4096-4 ; set up temporary stack space
|
||||||
|
|
||||||
mov cx, 0x0700 + 'b'
|
mov cx, 0x0700 + 'b'
|
||||||
mov [CONSOLE_MEMORY+160*8+1*2], cx
|
mov [CONSOLE_MEMORY+VIRTUAL_OFFSET+160*8+1*2], cx
|
||||||
|
|
||||||
add ebx, VIRTUAL_OFFSET
|
add ebx, VIRTUAL_OFFSET
|
||||||
push eax ; multiboot bootloader magic value
|
push eax ; multiboot bootloader magic value
|
||||||
@ -76,13 +76,37 @@ segmented_start:
|
|||||||
add esp, 8
|
add esp, 8
|
||||||
|
|
||||||
mov cx, 0x0700 + 'e'
|
mov cx, 0x0700 + 'e'
|
||||||
mov [CONSOLE_MEMORY+160*8+4*2], cx
|
mov [CONSOLE_MEMORY+VIRTUAL_OFFSET+160*8+4*2], cx
|
||||||
|
|
||||||
|
lgdt [mm_gdtr-VIRTUAL_OFFSET] ; load permanent GDTR
|
||||||
|
jmp 0x8:segmentation_disabled-VIRTUAL_OFFSET
|
||||||
|
|
||||||
|
;**************************************************************************
|
||||||
|
;* At this point both segmentation and paging are disabled but we can *
|
||||||
|
;* now enable paging *
|
||||||
|
;**************************************************************************
|
||||||
|
segmentation_disabled:
|
||||||
|
mov cx, 0x10
|
||||||
|
mov ss, cx
|
||||||
|
mov ds, cx
|
||||||
|
mov es, cx
|
||||||
|
mov gs, cx
|
||||||
|
mov fs, cx
|
||||||
|
|
||||||
; at this point paging is still disabled but the PDBR is valid and
|
; at this point paging is still disabled but the PDBR is valid and
|
||||||
; points to a page directory that has all of RAM mapped to the
|
; points to a page directory that has all of RAM mapped to the
|
||||||
; beginning of the kernel's virtual address space, and the entire
|
; beginning of the kernel's virtual address space, and the entire
|
||||||
; kernel mapped in above 0xE000_0000.
|
; kernel mapped in above 0xE000_0000.
|
||||||
|
|
||||||
|
; turn on paging
|
||||||
|
mov eax, cr0
|
||||||
|
bts eax, 31
|
||||||
|
mov cr0, eax
|
||||||
|
|
||||||
|
; OK, segmentation is disabled and paging is active!
|
||||||
|
mov cx, 0x0700 + 'f'
|
||||||
|
mov [CONSOLE_MEMORY+160*8+5*2], cx
|
||||||
|
|
||||||
idle_loop:
|
idle_loop:
|
||||||
hlt
|
hlt
|
||||||
jmp idle_loop
|
jmp idle_loop
|
||||||
|
@ -49,6 +49,15 @@ u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic)
|
|||||||
kio_bootstrap();
|
kio_bootstrap();
|
||||||
|
|
||||||
kprintf("Hello from kprintf()! %d, %x, %u, %l\n", 42, 0xabcd0123, 0xFFFFFFFF, -1234567891234ll);
|
kprintf("Hello from kprintf()! %d, %x, %u, %l\n", 42, 0xabcd0123, 0xFFFFFFFF, -1234567891234ll);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
kprintf("d1: 0x%X\n", MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 1));
|
||||||
|
kprintf("d2: 0x%X\n", MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 0));
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
;
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ static void fmt_u2a(char * buf, unsigned int val);
|
|||||||
static void fmt_ll2a(char * buf, long long val);
|
static void fmt_ll2a(char * buf, long long val);
|
||||||
static void fmt_ull2a(char * buf, unsigned long long val);
|
static void fmt_ull2a(char * buf, unsigned long long val);
|
||||||
static void fmt_x2a(char * buf, unsigned int val);
|
static void fmt_x2a(char * buf, unsigned int val);
|
||||||
|
static void fmt_xl2a(char * buf, unsigned long long val);
|
||||||
static void fmt_o2a(char * buf, unsigned int val);
|
static void fmt_o2a(char * buf, unsigned int val);
|
||||||
|
|
||||||
static int cursor_x, cursor_y;
|
static int cursor_x, cursor_y;
|
||||||
@ -76,6 +77,10 @@ void kvprintf(const char * fmt, va_list args)
|
|||||||
fmt_x2a(tmpbuf, va_arg(args, unsigned int));
|
fmt_x2a(tmpbuf, va_arg(args, unsigned int));
|
||||||
kputs(tmpbuf);
|
kputs(tmpbuf);
|
||||||
break;
|
break;
|
||||||
|
case 'X':
|
||||||
|
fmt_xl2a(tmpbuf, va_arg(args, unsigned long long));
|
||||||
|
kputs(tmpbuf);
|
||||||
|
break;
|
||||||
case '%':
|
case '%':
|
||||||
kputc('%');
|
kputc('%');
|
||||||
break;
|
break;
|
||||||
@ -228,6 +233,26 @@ static void fmt_x2a(char * buf, unsigned int val)
|
|||||||
*buf = '\0';
|
*buf = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fmt_xl2a(char * buf, unsigned long long val)
|
||||||
|
{
|
||||||
|
fmt_x2a(buf, val >> 32);
|
||||||
|
buf += strlen(buf);
|
||||||
|
bool printing = ( (val >> 32) != 0 );
|
||||||
|
for (int s = 28; s >= 0; s -= 4)
|
||||||
|
{
|
||||||
|
unsigned int n = (val >> s) & 0xF;
|
||||||
|
if (n)
|
||||||
|
{
|
||||||
|
printing = true;
|
||||||
|
}
|
||||||
|
if (printing)
|
||||||
|
{
|
||||||
|
*buf++ = "0123456789abcdef"[n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*buf = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
static void fmt_o2a(char * buf, unsigned int val)
|
static void fmt_o2a(char * buf, unsigned int val)
|
||||||
{
|
{
|
||||||
bool printing = false;
|
bool printing = false;
|
||||||
|
@ -12,6 +12,16 @@ void strcpy(char * dst, const char * src)
|
|||||||
*dst = '\0';
|
*dst = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32_t strlen(const char * s)
|
||||||
|
{
|
||||||
|
u32_t len = 0;
|
||||||
|
while (*s++)
|
||||||
|
{
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
void memcpy(u8_t * dst, u8_t * src, u32_t size)
|
void memcpy(u8_t * dst, u8_t * src, u32_t size)
|
||||||
{
|
{
|
||||||
for (u32_t n = 0; n < size; n++)
|
for (u32_t n = 0; n < size; n++)
|
||||||
|
@ -10,6 +10,8 @@ extern "C" {
|
|||||||
|
|
||||||
void strcpy(char * dst, const char * src);
|
void strcpy(char * dst, const char * src);
|
||||||
|
|
||||||
|
u32_t strlen(const char * s);
|
||||||
|
|
||||||
void memcpy(u8_t * dst, u8_t * src, u32_t size);
|
void memcpy(u8_t * dst, u8_t * src, u32_t size);
|
||||||
void memcpyw(u16_t * dst, u16_t * src, u32_t size);
|
void memcpyw(u16_t * dst, u16_t * src, u32_t size);
|
||||||
void memcpyd(u32_t * dst, u32_t * src, u32_t size);
|
void memcpyd(u32_t * dst, u32_t * src, u32_t size);
|
||||||
|
@ -15,6 +15,7 @@ static int mm_mmap_num_entries = 0;
|
|||||||
static int mm_num_free_pages = 0;
|
static int mm_num_free_pages = 0;
|
||||||
u32_t * mm_free_page_ptr = NULL;
|
u32_t * mm_free_page_ptr = NULL;
|
||||||
gdtr_t mm_gdtr;
|
gdtr_t mm_gdtr;
|
||||||
|
static u64_t * mm_gdt;
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* This function is run in segmented memory before paging is in effect. *
|
* This function is run in segmented memory before paging is in effect. *
|
||||||
@ -145,12 +146,12 @@ void mm_bootstrap()
|
|||||||
|
|
||||||
/* set up the global descriptor table */
|
/* set up the global descriptor table */
|
||||||
u32_t gdt_base = mm_page_alloc();
|
u32_t gdt_base = mm_page_alloc();
|
||||||
u64_t * gdt = (u64_t *) ((u32_t) gdt_base + (u32_t) KERNEL_OFFSET);
|
mm_gdt = (u64_t *) ((u32_t) gdt_base + (u32_t) KERNEL_OFFSET);
|
||||||
memsetd((u32_t *) gdt, 0, PAGE_SIZE / 4);
|
mm_gdt[0] = 0x0ull;
|
||||||
mm_gdtr.length = PAGE_SIZE - 1;
|
mm_gdt[1] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 1);
|
||||||
|
mm_gdt[2] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 0);
|
||||||
|
mm_gdtr.length = 3*sizeof(mm_gdt[0]) - 1;
|
||||||
mm_gdtr.phys_addr = gdt_base;
|
mm_gdtr.phys_addr = gdt_base;
|
||||||
gdt[1] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 1);
|
|
||||||
gdt[2] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 0);
|
|
||||||
|
|
||||||
/* set the page directory base register */
|
/* set the page directory base register */
|
||||||
set_cr3(page_directory);
|
set_cr3(page_directory);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user