с использованием multiboot.
Ядро просто получает адрес:
char *vidptr = (char*)0xb8000;
И выводит надпись.
Я написал простой скрипт, который генерирует рандомно 10 тысяч переменных (int a(номер переменной) = рандомное значение):
т.е:
int a1 = 67324;
int a2 = 12343;
int a3 = 32434;
Скомпилировал, запустил и ядро уходит в перезагрузку (если сгенерировать 1000 тысяч переменных, то все работает).
Собственно вопрос, есть какие-то ограничения на кол-во переменных (хотя мне кажется, я просто что-то делаю не так)?
Если объявить 1 переменную и перезаписывать 100 тысяч раз, то все работает, ядро выводит надпись и не перезагружается.
kernel.asm:
bits 32
section .text
;multiboot spec
align 4
dd 0x1BADB002 ;magic
dd 0x00 ;flags
dd - (0x1BADB002 + 0x00) ;checksum
global start
extern kmain
start:
cli
mov esp, stack_space
call kmain
hlt
section .bss
resb 8192
stack_space:
linker:
OUTPUT_FORMAT(elf32-i386)
ENTRY(start)
SECTIONS
{
. = 0x100000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
kernel.c
void kmain(void)
{
const char *str = "Hello, World!";
char *vidptr = (char*)0xb8000;
unsigned int i = 0;
unsigned int j = 0;
while(j < 80 * 25 * 2) {
vidptr[j] = ' ';
vidptr[j+1] = 0x07;
j = j + 2;
}
j = 0;
while(str[j] != '\0') {
vidptr[i] = str[j];
vidptr[i+1] = 0x07;
++j;
i = i + 2;
}
int a = 1;
...
return;
}
Собираю так:
nasm -f elf32 kernel.asm -o kasm.o
gcc -m32 -c kernel.c -o kc.o
ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o
Запуск:
qemu-system-i386 -kernel kernel
Извините, если глупый вопрос
Наверно мне также лучше собрать свой toolchain вместо, того чтобы собирать системным gcc. Или возможно использовать clang, насколько мне известно там можно указать target архитектуру. os: Linux
Только что решил проблему увеличив: resb 8192 в 10 раз: resb 81920 Не знаю, нормальное ли решение.
Обсуждают сегодня