diff --git a/bootloader-legacy/README.md b/bootloader-legacy/README.md index c32922a2fcfbe03ff9155b65f9b047a6885cfa26..b3ce53fc6bcef0ee9bee4d9d271e5c6d528e1057 100644 --- a/bootloader-legacy/README.md +++ b/bootloader-legacy/README.md @@ -26,7 +26,7 @@ Just used this mode to launch 64bit long mode. No paging enabled. - 64bit long mode age 0x1000 - 0x5000 : 64bit long mode paging table**s** -0x00100000 - 0x00300000 : 512 * 4K pages, before kernel initializing page table in C++. +0x00000000 - 0x00200000 : 512 * 4K pages, before the kernel initializing page table in C++. ## bootloader(legacy) disk model diff --git a/bootloader-legacy/boot.asm b/bootloader-legacy/boot.asm index ca3ea6ebff88b80ab2194e192aa3e55d97f99190..3610c40fbe2e0d45c3ae203c9aac826678c6f0e9 100644 --- a/bootloader-legacy/boot.asm +++ b/bootloader-legacy/boot.asm @@ -106,7 +106,6 @@ _prot_begin: je _test_passed mov ebx, _motd_no_long_mode call println_vga - jmp _stall ; debug, tmp jmp _call_kern_32 _test_passed: @@ -140,17 +139,20 @@ _stall: jmp $ _motd_disk_error: - db 'DISK_IO_ERROR', 0x0 + db 'MED', 0x0 _motd_32: - db '[LOAD KERN SUCC] [ENTER X86 MODE SUCC]', 0x0 + db 'M32', 0x0 _motd_kern_ok: - db '[LOAD KERN SUCC]', 0x0 + db 'MKN', 0x0 _motd_endk: - db '[LOAD KERN SUCC] [ENTER X86 MODE SUCC] [KERN EXITED]', 0x0 + db 'MEK', 0x0 _motd_no_long_mode: - db '[ENTER LONG MODE ERR] NOT_SUPPORTED', 0x0 + db 'MNL', 0x0 _boot_drive_id: db 0x0 + +_motd_debug_point: + db 'MDB', 0x0 %include "./mbr_end.inc" diff --git a/bootloader-legacy/inline_x64lib.inc b/bootloader-legacy/inline_x64lib.inc index a34b39aa7946d7f4a76f9c2cabc2e2b4d361d045..463e4879745717bf8ccfb315b48d575bdde1d200 100644 --- a/bootloader-legacy/inline_x64lib.inc +++ b/bootloader-legacy/inline_x64lib.inc @@ -2,38 +2,38 @@ ; requires: str.32.inc ; runs in 32bit protection mode -test_cpuid_support: - ; Check if CPUID is supported by attempting to flip the ID bit (bit 21) in - ; the FLAGS register. If we can flip it, CPUID is available. - - ; Copy FLAGS in to EAX via stack - pushfd - pop eax - - ; Copy to ECX as well for comparing later on - mov ecx, eax - - ; Flip the ID bit - xor eax, 1 << 21 - - ; Copy EAX to FLAGS via the stack - push eax - popfd - - ; Copy FLAGS back to EAX (with the flipped bit if CPUID is supported) - pushfd - pop eax - - ; Restore FLAGS from the old version stored in ECX (i.e. flipping the ID bit - ; back if it was ever flipped). - push ecx - popfd - - ; Compare EAX and ECX. If they are equal then that means the bit wasn't - ; flipped, and CPUID isn't supported. - sub eax, ecx - ; eax != 0 if CPUID supported, eax==0 if not supported. - ret +;test_cpuid_support: +; ; Check if CPUID is supported by attempting to flip the ID bit (bit 21) in +; ; the FLAGS register. If we can flip it, CPUID is available. +; +; ; Copy FLAGS in to EAX via stack +; pushfd +; pop eax +; +; ; Copy to ECX as well for comparing later on +; mov ecx, eax +; +; ; Flip the ID bit +; xor eax, 1 << 21 +; +; ; Copy EAX to FLAGS via the stack +; push eax +; popfd +; +; ; Copy FLAGS back to EAX (with the flipped bit if CPUID is supported) +; pushfd +; pop eax +; +; ; Restore FLAGS from the old version stored in ECX (i.e. flipping the ID bit +; ; back if it was ever flipped). +; push ecx +; popfd +; +; ; Compare EAX and ECX. If they are equal then that means the bit wasn't +; ; flipped, and CPUID isn't supported. +; sub eax, ecx +; ; eax != 0 if CPUID supported, eax==0 if not supported. +; ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -41,12 +41,12 @@ test_support_long_mode: ; test if possible to enter x64 mode. ; return value in eax. ; return 0 = OK. 1 = CPUID_NOT_AVAIL, 2 = CPUID_EXT_NOT_AVAIL, 3 = LONGMODE_NOT_AVAIL - call test_cpuid_support - cmp eax, 0 - jne _cpuid_supported - mov eax, 1 - ret -_cpuid_supported: +; call test_cpuid_support +; cmp eax, 0 +; jne _cpuid_supported +; mov eax, 1 +; ret +;_cpuid_supported: mov eax, 0x80000000 ; Set the A-register to 0x80000000. cpuid ; CPU identification. cmp eax, 0x80000001 ; Compare the A-register with 0x80000001. @@ -118,8 +118,8 @@ inline_enter_long_mode: mov edi, 0x4000 ; fill all entries of the PT. This is a trick, which not setting all bits in entry. - ; This page table has 512 4K page, 0x00100000 - 0x00300000. - mov ebx, 0x00100003 ; BIT M--12 contains PageFrameNumber. + ; This page table has 512 4K page, 0x00000000 - 0x00200000. + mov ebx, 0x00000003 ; BIT M--12 contains PageFrameNumber. mov ecx, 512 ; counter _set_one_entry: mov DWORD [edi], ebx @@ -142,6 +142,7 @@ _set_one_entry: or eax, 1 << 31 ; Set the PG-bit, which is the 32nd bit (bit 31). mov cr0, eax ; Set control register 0 to the A-register. + ;;;;;;;;;;;;;;;;; Section 3: enter 64bit long mode lgdt [GDT64.Pointer] ; Load the 64-bit global descriptor table. jmp GDT64.Code:Realm64 ; Set the code segment and enter 64-bit long mode. @@ -157,6 +158,8 @@ Realm64: mov gs, ax ; Set the G-segment to the A-register. mov ss, ax ; Set the stack segment to the A-register. ; done + ; 32bit print_vga not working in 64bit mode + diff --git a/kernel/Makefile b/kernel/Makefile index 48aa802f839c99a99b527aab4f5bd148365348bf..a1f522b3820ca7631cf5b0342df132d98190fa35 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,19 +1,25 @@ +# BITS could be 32 or 64. +BITS ?= 64 + +ifeq ($(BITS), 64) +ARCH = x86_64 +else +ARCH = i386 +endif + assemble: kernel head - ld -o kernel.img -Ttext 0x7e00 --oformat binary image_head.o kernel.o -m elf_i386 + ld -o kernel.img -Ttext 0x7e00 --oformat binary image_head.o kernel.o -m elf_$(ARCH) # Sector 1 = bootloader, Sector 2 - (512B TO 64K) = kernel # Extend kernel.img to correct size. test $$(stat -c %s kernel.img) -le 65024 truncate --size=65024 kernel.img head: - nasm -f elf image_head.asm -o image_head.o + nasm -f elf -DBITS=$(BITS) image_head.asm -o image_head.o kernel: - g++ -ffreestanding -fno-pie -c kernel.cc -o kernel.o -m32 -std=c++17 - -kernel_x64: - g++ -ffreestanding -fno-pie -c kernel.cc -o kernel.o -m64 -std=c++17 + g++ -ffreestanding -fno-pie -c kernel.cc -o kernel.o -m$(BITS) -std=c++17 clean: rm *.o *.img diff --git a/kernel/image_head_64.asm b/kernel/image_head_64.asm new file mode 100644 index 0000000000000000000000000000000000000000..b2f3d2ebbccd06848b21c5ac4abeeb3731d74e28 --- /dev/null +++ b/kernel/image_head_64.asm @@ -0,0 +1,4 @@ +[bits 64] +[extern main] +call main +ret