Ich habe gerade ein Problem damit, dass ich meinen 16-bit Code zwar in meine ELF-Datei gelinkt bekomme, aber dann bootet mein System nicht mehr.
Hier mal der Code aus dem Linkerskript:
SECTIONS
{
. = 0x100000;
__kernel_entry = .;
__init_entry = .;
__smp_init_entry = LOADADDR(.smp_init);
.smp_init 0x7000 : AT(__init_entry) {
*(.smp_init)
}
__smp_init_end = LOADADDR(.smp_init) + SIZEOF(.smp_init);
__init32_entry = LOADADDR(.smp_init) + SIZEOF(.smp_init);
.init32 (LOADADDR(.smp_init) + SIZEOF(.smp_init)) : {
*(.multiboot)
*(.init32_text)
*(.init32_data)
}
__init32_end = .;
__init_end = .;
. = ALIGN(0x1000);
Hier jetzt noch mein Trampolin-Code:
#if defined(CONFIG_ARCH_I386) && defined(CONFIG_SMP)
.extern gdt;
.extern idt;
.extern smp_ap_init
.section .smp_init,"aw",@progbits
.code16
start_up:
cli
lgdtl gdtr
xor %ax , %ax
inc %ax
lmsw %ax
ljmp $0x0000 , $code_32
.code32
code_32:
mov $0x10 , %eax
mov %eax , %ds
mov %eax , %es
mov %eax , %fs
mov %eax , %gs
mov %eax , %ss
lidtl idt
jmp smp_ap_init
gdtr:
.word 24
.long gdt
gdt:
.word 0x0000
.word 0x0000
.word 0x0000
.word 0x0000
.word 0xFFFF
.word 0x0000
.word 0x9800
.word 0x00CF
.word 0xFFFF
.word 0x0000
.word 0x9200
.word 0x00CF
#endif
Was mache ich da falsch?
Gruß,
rizor