Edit: I've been able to isolate the problem; it is the linker allright.
If I use "ld -T link.ld -o kernel.bin entry.o conio.o" instead of "ld -T link.ld -o kernel.bin entry.o main.o conio.o", all the stuff in conio.o works.
If I use "ld -T link.ld -o kernel.bin entry.o conio.o main.o", it doesn't work, as usual.
Could it be the linker script, or perhaps the linker itself?
Bootloader:
Code: Select all
[BITS 16]
[ORG 7C00h]
jmp boot
;-------------------Variables-------------------;
drive db 0
;-----------------End Variables-----------------;
;----------------------GDT----------------------;
gdtr:
dw gdt_end-gdt-1
dd gdt
gdt:
null_sel equ $-gdt
dd 0x0
dd 0x0
code_sel equ $-gdt
dw 0xFFFF
dw 0x0
db 0x0
db 0x9A
db 0xCF
db 0x0
data_sel equ $-gdt
dw 0xFFFF
dw 0x0
db 0x0
db 0x92
db 0xCF
db 0x0
gdt_end:
;--------------------End GDT--------------------;
;-------------------Functions-------------------;
panic:
mov byte [gs:0],al
mov byte [gs:1],0x04
cli
hlt
try_enable_a20:
cli
call enable_A20_primary
call kbdc_status
test al, 2
jnz .success
call enable_A20_secondary
call kbdc_status
test al, 2
jnz .success
xor ax, ax
ret
.success:
mov ax, -1
ret
enable_A20_secondary:
call kbdc_command
mov al, 0xDF
out 0x64, al
ret
enable_A20_primary:
call kbdc_status
push ax
call kbdc_command
mov al, 0xD1
out 0x64, al
call kbdc_command
pop ax
or al, 00000010b
out 0x60, al
ret
kbdc_command:
xor ax, ax
in al, 0x64
test ax, 2
jnz kbdc_command
ret
kbdc_data:
xor ax, ax
in al, 0x64
test al, 1
jz kbdc_data
ret
kbdc_status:
call kbdc_command
mov al, 0xD0
out 0x64, al
call kbdc_data
xor ax, ax
in al, 0x60
ret
;-----------------End Functions-----------------;
boot:
mov [drive], dl
mov ax, cs
mov ds, ax
mov es, ax
mov fs, ax
mov al, 17
mov ah, 02h
mov ss, ax
mov sp, 0x200
mov ax, 0xB800
mov gs, ax
call try_enable_a20
or ax, ax
jnz .a20_enabled
mov al, 'P'
call panic
.a20_enabled:
sti
mov cx, 0x3
.try_load_kernel:
push cx
mov ah, 0x2
mov al, 0x2
mov ch, 0x0
mov cl, 0x2
mov dh, 0x0
mov dl, [drive]
mov bx, 0xFFFF
mov es, bx
mov bx, 0x10
int 13h
jnc .kernel_loaded
pop cx
loop .try_load_kernel
mov al, 'L'
call panic
.kernel_loaded:
cli
lgdt [gdtr]
mov eax, cr0
or al, 0x1
mov cr0, eax
jmp code_sel:flush
[BITS 32]
flush:
mov eax, data_sel
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
mov esp, 0xFFFF
mov eax, gdtr
jmp code_sel:0x100000
hlt
times 510-($-$$) db 0
dw 0xAA55
Startup stuff:
Code: Select all
SECTION .text
[BITS 32]
[EXTERN _kernel_entry]
[GLOBAL entry]
entry:
[GLOBAL _entry]
_entry:
mov esp, _sys_stack
push eax
call _kernel_entry ;Calls the C kernel entry
cli
hlt
jmp $
SECTION .bss
resb 16384
_sys_stack: