mirror of
https://github.com/cfenollosa/os-tutorial.git
synced 2025-12-18 04:44:35 +03:00
lessons 8, 9, 10, entering 32-bit mode
This commit is contained in:
27
10-32bit-enter/32bit-main.asm
Normal file
27
10-32bit-enter/32bit-main.asm
Normal file
@@ -0,0 +1,27 @@
|
||||
[org 0x7c00] ; bootloader offset
|
||||
mov bp, 0x9000 ; set the stack
|
||||
mov sp, bp
|
||||
|
||||
mov bx, MSG_REAL_MODE
|
||||
call print ; This will be written after the BIOS messages
|
||||
|
||||
call switch_to_pm
|
||||
jmp $ ; this will actually never be executed
|
||||
|
||||
%include "../05-bootsector-functions-strings/boot_sect_print.asm"
|
||||
%include "../09-32bit-gdt/32bit-gdt.asm"
|
||||
%include "../08-32bit-print/32bit-print.asm"
|
||||
%include "32bit-switch.asm"
|
||||
|
||||
[bits 32]
|
||||
BEGIN_PM: ; after the switch we will get here
|
||||
mov ebx, MSG_PROT_MODE
|
||||
call print_string_pm ; Note that this will be written at the top left corner
|
||||
jmp $
|
||||
|
||||
MSG_REAL_MODE db "Started in 16-bit real mode", 0
|
||||
MSG_PROT_MODE db "Loaded 32-bit protected mode", 0
|
||||
|
||||
; bootsector
|
||||
times 510-($-$$) db 0
|
||||
dw 0xaa55
|
||||
22
10-32bit-enter/32bit-switch.asm
Normal file
22
10-32bit-enter/32bit-switch.asm
Normal file
@@ -0,0 +1,22 @@
|
||||
[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
|
||||
23
10-32bit-enter/README.md
Normal file
23
10-32bit-enter/README.md
Normal file
@@ -0,0 +1,23 @@
|
||||
*Concepts you may want to Google beforehand: interrupts, pipelining*
|
||||
|
||||
**Goal: Enter 32-bit protected mode and test our code from previous lessons**
|
||||
|
||||
To jump into 32-bit mode:
|
||||
|
||||
1. Disable interrupts
|
||||
2. Load our GDT
|
||||
3. Set a bit on the CPU control register `cr0`
|
||||
4. Flush the CPU pipeline by issuing a carefully crafted far jump
|
||||
5. Update all the segment registers
|
||||
6. Update the stack
|
||||
7. Call to a well-known label which contains the first useful code in 32 bits
|
||||
|
||||
We will encapsulate this process on the file `32bit-switch.asm`. Open it
|
||||
and take a look at the code.
|
||||
|
||||
After entering 32-bit mode, we will call `BEGIN_PM` which is the entry point
|
||||
for our actual useful code (e.g. kernel code, etc). You can read the code
|
||||
at `32bit-main.asm`. Compile and run this last file and you will see the two
|
||||
messages on the screen.
|
||||
|
||||
Congratulations! Our next step will be to write a simple kernel
|
||||
Reference in New Issue
Block a user