summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2016-08-10 11:35:28 -0400
committerRobert Morris <[email protected]>2016-08-10 11:35:28 -0400
commit3431cd492703e85909e7d5c0928ffc292ac518ec (patch)
tree37645b38b3eaa1727f2bf6cad575b906196b69e5
parent0a69dc9b1745e863f0c16e50dba78804ba0925f7 (diff)
downloadxv6-labs-3431cd492703e85909e7d5c0928ffc292ac518ec.tar.gz
xv6-labs-3431cd492703e85909e7d5c0928ffc292ac518ec.tar.bz2
xv6-labs-3431cd492703e85909e7d5c0928ffc292ac518ec.zip
more comments in entryother.S
-rw-r--r--entryother.S28
-rw-r--r--main.c9
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
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)