LINUX.ORG.RU

Загрузчик


0

0

Имеются 3 файла :
loader.s
kernel.c
linker.ld
Результатом компиляции является образ kernel.img
После компиляции образ собирается , после чего я запускаю его на vmware 5.0
Но не работает он как надо - а надо , чтобы он отпечатал на экране Hello world
Ничего вообще не печатает .
Собираю на 3-й федоре
Компиляция :

as -o loader.o loader.s
gcc -o kernel.o -c kernel.c -Wall -Werror -nostdlib -nostartfiles -nodefaultlibs
ld -T linker.ld kernel.o loader.o -o kernel.img

Loader.s :

.global _loader # making entry point visible to linker
# setting up the Multiboot header - see GRUB docs for details
.set ALIGN, 1<<0 # align loaded modules on page boundaries
.set MEMINFO, 1<<1 # provide memory map
.set FLAGS, ALIGN | MEMINFO # this is the Multiboot 'flag' field
.set MAGIC, 0x1BADB002 # 'magic number' lets bootloader find the header
.set CHECKSUM, -(MAGIC + FLAGS) # checksum required
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
# reserve initial kernel stack space
.set STACKSIZE, 0x4000 # that's 16k.
.comm stack, STACKSIZE, 32 # reserve 16k stack on a quadword boundary
_loader: mov $(stack + STACKSIZE), %esp # set up the stack
push %eax # Multiboot magic number
push %ebx # Multiboot data structure
call _main # call kernel proper
hlt # halt machine should kernel return

Kernel.c :

nsigned short* const VIDMEM = (unsigned short*) 0xC00B8000;
void clear( void )
{
unsigned short* vp = VIDMEM;
for (int i = 0; i < 80 * 25; i++)
{
*vp++ = 0;
}
}
void print( const char* str )
{
unsigned short* vp = VIDMEM;
while (*str != '\0')
{
*vp++ = (0x0700 | ((unsigned short) *str++));
}
}
void _main( void* mbd, unsigned int magic )
{
clear();
print("Hello world!\0");
while (1);
}

Linker.ld :

ENTRY (_loader)
SECTIONS
{
. = 0x00100000;
.text :
{
*(.text)
}
.rodata ALIGN (0x1000) :
{
*(.rodata)
}
.data ALIGN (0x1000) :
{
*(.data)
}
.bss :
{
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
}

anonymous

Похоже проблема в том, что при загузке процессор работает в реальном режиме, а as и gcc генерируют код для защищенного.

anonymous
()
Ответ на: комментарий от anonymous

Я подправил .code32 на .code16
А gcc нельзя заставить сгенерировать 16-битный код ?

anonymous
()
Ответ на: комментарий от anonymous

Какая разница в реальный или защищенный режим, тут всю работу по загрузке виполняет grub, а OS уже потом переходит в protected mode

sjorij
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.