Как написать привет ядро ​​мира? - PullRequest
16 голосов
/ 20 августа 2011

Я пишу ядро, так что я начинаю с программы hello world в ядре.

Я написал ядро ​​hello world на c ++, и оно успешно компилируется.

Но когда я загружаю его, он ничего не показывает на экране.

Что не так с этим кодом?

link.ld

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS{
. = 0x00100000;

.text :{
    *(.text)
}

.rodata ALIGN (0x1000) : {
    *(.rodata)
}

.data ALIGN (0x1000) : {
    *(.data)
}

.bss : {
    sbss = .;
    *(COMMON)
    *(.bss)
    ebss = .;
}
}

loader.asm

[BITS 32]

global start
extern _main

start:
    call _main
    cli 
    hlt

video.h

#ifndef VIDEO_H
#define VIDEO_H

class Video{
    public:
        Video();
        ~Video();
        void clear();
        void write(char *cp);
        void put(char c);
    private:
        unsigned short *videomem;
        unsigned int off;
        unsigned int pos;
};
#endif

video.cpp

#include "Video.h"

Video::Video(){
pos = 0;
off = 0;
videomem = (unsigned short*)0xb8000;
}

Video::~Video(){}

void Video::clear(){
unsigned int i;
for(i=0;i<(80*25);i++){
    videomem[i] = (unsigned short)' '|0x0700;
}
pos = 0;
off = 0;
}

void Video::write(char *cp){
char *str = cp, *ch;
for(ch=str;*ch;ch++){
    put(*ch);
}
}

void Video::put(char c){
if(pos>=80){
    pos = 0;
    off+=80;
}
if(off>=(80*25)){
    clear();
}

videomem[off+pos] = (unsigned short)c|0x0700;
pos++;
}

Kernel.cpp

#include "Video.h"
int _main(void){
Video vid;
vid.clear();
vid.write("Hello World!");
}

Я компилирую его с помощью следующих команд:

g++ -c video.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions
g++ -c Kernel.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions
nasm -f aout Loader.asm -o Loader.o
ld -T linker.ld -o Kernel.bin Loader.o Video.o Kernel.o

Не выдает никаких ошибок.

Если есть возможность отладки, то, пожалуйста, помогите мне, как отлаживать.

Я загружаю его в виртуальную коробку.

Любая помощь будет оценена.

Ответы [ 4 ]

12 голосов
/ 20 августа 2011

Если хотите, вы можете проверить ОС, которая использовалась в качестве примера в моем классе в этом семестре.Это сделано в c.Мы использовали загрузчик GRUB и qemu для запуска вещей.

Он написан довольно чисто с приращениями, первый из которых точно соответствует ОС «Hello world», а последний - все, что содержится в полной оболочке, потоках.и процессы и многое другое.Там вы можете найти примеры исходных кодов, make-файлов и скриптов компоновщика (от простых до довольно сложных примеров)

http://sourceforge.net/projects/oszur11/

Я также буду ссылаться на скрипт после приращений, ноэто, к сожалению, не на английском языке.

О, а также есть один шаг, специально предназначенный для отладки, но это больше для отладки процедур, сделанных для вашей ОС, чем для отладки ОС в целом (еслипомните правильно, мы использовали две консоли, одна с qemu и одна с gdb, подключенным к операционной системе, работающей в другой).

5 голосов
/ 20 августа 2011

Когда компьютер загружается, BIOS загружает все, что находится в MBR по физическому адресу 0x7c00, а затем переходит на этот адрес.Поэтому вы должны связать свой код, начиная с 0x7c00, а не с 0x00100000.

Итак, изменение сценария компоновщика следующим образом должно решить проблему:

...
SECTIONS{
    . = 0x7c00;
    ...
}

РЕДАКТИРОВАТЬ: Посмотрев на ваш код, я заметил еще несколько проблем.Если вы не используете загрузчик, вам нужно настроить некоторые вещи, прежде чем вы сможете приступить к выполнению 32-битного кода, наиболее важно включить защищенный режим. Здесь - некоторые учебники, которые помогут вам в вашем пути.

3 голосов
/ 20 августа 2011

Вы пробовали qemu? Делая крошечную операционную систему в универе, она оказалась лучшей программой для такого рода вещей.

1 голос

Чтобы это работало, вам нужно:

  • внедрить стандарт мультизагрузки в loader.asm и использовать GRUB. Мультизагрузочный файл - это файл ELF со специальными заголовками. Пример .
  • Реализуйте загрузчик самостоятельно. Как минимум, вам необходимо:
...