OSDEV: печать терминала VGA не работает должным образом - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь научиться разрабатывать операционную систему, но сталкиваюсь со странной проблемой.

Как только я пишу простейшее ядро ​​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 ++.

...