Я пытаюсь научиться разрабатывать операционную систему, но сталкиваюсь со странной проблемой.
Как только я пишу простейшее ядро Hello World, как показано ниже, все идет хорошо и после загрузки моей ОС там это "Привет домой!" на экране.
void kernel_main(void){
const char hh[] = "Hello Home!";
unsigned short* screen = (unsigned short*) 0xb8000;
for(int i=0;hh[i] != '\0';i++){
screen[i * 2] = hh[i];
screen[i*2+1]= 0x0F;
}
}
Но при попытке отобразить строку с ок. 62 символов, таких как следующие
void kernel_main(void){
const char hh[] = "Hello Home!Hello Home!Hello Home!Hello Home!Hello Home!Hello Home!Hello Home!Hello Home!Hello Home!Hello Home!";
unsigned short* screen = (unsigned short*) 0xb8000;
for(int i=0;hh[i] != '\0';i++){
screen[i * 2] = hh[i];
screen[i*2+1]= 0x0F;
}
}
Мои другие файлы похожи на веб-сайт Lowleve eu .
boot.s
//(*1)
.set ALIGN, 1<<0 /* align loaded
modules on page boundaries */
.set MEMINFO, 1<<1
.set MAGIC, 0x1BADB002
.set FLAGS, ALIGN | MEMINFO /* this is the
Multiboot 'flag' field */
.set CHECKSUM, -(MAGIC + FLAGS)
.section multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
//(*2)
.section .text
.extern kernel_main
.global _start
_start:
mov $stack_top, %esp
call kernel_main
_stop:
cli
hlt
jmp _stop
//(*3)
.section .bss
.align 16
stack_bottom:
.skip 16384 # 16 KiB
stack_top:
linker.ld
ENTRY(_start)
SECTIONS
{
. = 1M;
.text BLOCK(4K) : ALIGN(4K){
*(multiboot)
*(.text)
}
.data BLOCK(4K) : ALIGN(4K){
*(.data)
}
.rodata ALIGN(4096) : {
*(.rodata)
}
.bss BLOCK(4K) : ALIGN(4K){
*(COMMON)
*(.bss)
}
}
У вас, ребята, есть полезная идея, почему она так себя ведет. Спасибо, извините за мой плохой английский sh.
РЕШЕНИЕ: Прежде всего спасибо за ваши быстрые и полезные ответы. Для @ fy snet и @preciousbetine: не помогло изменить тип или изменить на stati c.
На @Michael Petch: objdump
была из версии, которая не работала. И да, я на Linux и использую свой нативный компилятор. Нужно ли использовать кросс-компилятор или достаточно использовать нативный компилятор ??
Для решения: я не упомянул что я кодирую на с ++. Учебное пособие, на которое я смотрел, было в C, в результате чего в моих файлах были некоторые неправильно определенные места. Мне также не хватало реализации для работы с конструкторами. Теперь, после того как я изменил файлы, проблема исправлена.
Но у меня осталась одна мысль, потому что я также выполнил код из учебника C без изменений, как это описано там. Когда я попробовал этот, у него была та же проблема.
Но я не буду больше беспокоиться об этом, потому что я использую C ++.