diff options
| -rw-r--r-- | entryother.S | 28 | ||||
| -rw-r--r-- | main.c | 9 | 
2 files changed, 22 insertions, 15 deletions
| 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 @@ -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) | 
