diff --git a/entryother.S b/entryother.S index 8a8a020..4a791cf 100644 --- a/entryother.S +++ b/entryother.S @@ -17,37 +17,43 @@ # place to jump to (mpenter) in start-8, and the physical address # of entrypgdir in start-12. # -# This code is identical to bootasm.S except: -# - it does not need to enable A20 -# - it uses the address at start-4, start-8, and start-12 +# This code combines elements of bootasm.S and entry.S. .code16 .globl start start: cli + # Zero data segment registers DS, ES, and SS. xorw %ax,%ax movw %ax,%ds movw %ax,%es movw %ax,%ss + # Switch from real to protected mode. Use a bootstrap GDT that makes + # virtual addresses map directly to physical addresses so that the + # effective memory map doesn't change during the transition. lgdt gdtdesc movl %cr0, %eax orl $CR0_PE, %eax movl %eax, %cr0 //PAGEBREAK! + # Complete the transition to 32-bit protected mode by using a long jmp + # to reload %cs and %eip. The segment descriptors are set up with no + # translation, so that the mapping is still the identity mapping. ljmpl $(SEG_KCODE<<3), $(start32) -.code32 +.code32 # Tell assembler to generate 32-bit code now. start32: - movw $(SEG_KDATA<<3), %ax - movw %ax, %ds - movw %ax, %es - movw %ax, %ss - movw $0, %ax - movw %ax, %fs - movw %ax, %gs + # Set up the protected-mode data segment registers + movw $(SEG_KDATA<<3), %ax # Our data segment selector + movw %ax, %ds # -> DS: Data Segment + movw %ax, %es # -> ES: Extra Segment + movw %ax, %ss # -> SS: Stack Segment + movw $0, %ax # Zero segments not ready for use + movw %ax, %fs # -> FS + movw %ax, %gs # -> GS # Turn on page size extension for 4Mbyte pages movl %cr4, %eax diff --git a/main.c b/main.c index 40facc4..7329015 100644 --- a/main.c +++ b/main.c @@ -98,10 +98,11 @@ startothers(void) } } -// Boot page table used in entry.S and entryother.S. -// Page directories (and page tables), must start on a page boundary, -// hence the "__aligned__" attribute. -// Use PTE_PS in page directory entry to enable 4Mbyte pages. +// The boot page table used in entry.S and entryother.S. +// Page directories (and page tables) must start on page boundaries, +// hence the __aligned__ attribute. +// PTE_PS in a page directory entry enables 4Mbyte pages. + __attribute__((__aligned__(PGSIZE))) pde_t entrypgdir[NPDENTRIES] = { // Map VA's [0, 4MB) to PA's [0, 4MB)