185 похожих чатов

Здравствуйте, решил поинтересоваться osdev, взял код с ядром на Си

с использованием 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

Извините, если глупый вопрос

2 ответов

32 просмотра
Hello, World!- Автор вопроса

Наверно мне также лучше собрать свой toolchain вместо, того чтобы собирать системным gcc. Или возможно использовать clang, насколько мне известно там можно указать target архитектуру. os: Linux

Hello, World!- Автор вопроса

Только что решил проблему увеличив: resb 8192 в 10 раз: resb 81920 Не знаю, нормальное ли решение.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта