1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/*
head.s is loaded at 0x1000 (by second stage), its main goal
is run 32-bit startup code.
After that manipulations it jumps to kernel written by C
*/
.code32 # Tell GAS to generate 32 bit code
.extern kernel_main
.set CODESEG, 0x08
.set DATASEG, 0x10
.global _start
_start:
mov $DATASEG, %ax # Point segment registers to the
mov %ax, %ds # data selector we defined in our GDT
mov %ax, %es
mov %ax, %ss
mov %ax, %fs
mov %ax, %gs
mov $0x90000, %ebp # Update stack position so it is right
mov %ebp, %esp # at the top of the free space.
check_a20:
mov $0x112345, %edi # Odd megabyte address
mov $0x012345, %esi # Even megabyte address
mov %esi, (%esi) # If A20 line is disabled two pointers
mov %edi, (%edi) # would point to the address 0x012345
cmpsd # Compare values at addresses
je . # If equivalent, loop forever
call kernel_main
jmp . # infinite loop
|