12345678910111213141516171819202122 |
- [bits 16]
- switch_to_pm:
- cli ; 1. disable interrupts
- lgdt [gdt_descriptor] ; 2. load the GDT descriptor
- mov eax, cr0
- or eax, 0x1 ; 3. set 32-bit mode bit in cr0
- mov cr0, eax
- jmp CODE_SEG:init_pm ; 4. far jump by using a different segment
- [bits 32]
- init_pm: ; we are now using 32-bit instructions
- mov ax, DATA_SEG ; 5. update the segment registers
- mov ds, ax
- mov ss, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov ebp, 0x90000 ; 6. update the stack right at the top of the free space
- mov esp, ebp
- call BEGIN_PM ; 7. Call a well-known label with useful code
|