Ответ 1
Вы пробовали qemu? При создании крошечных os в uni, это оказалось лучшей программой для этого типа вещей.
Я пишу ядро, так что я начинаю с приветственной мировой программы в ядре.
Я написал зелёное ядро мира в С++ и успешно компилируется.
Но когда я его загружаю, он ничего не показывает на экране.
Что не так с этим кодом?
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
Он не дает никаких ошибок.
Если можно отлаживать, то, пожалуйста, помогите мне, как отлаживать.
Я загружаю его в виртуальную коробку.
Любая помощь будет оценена.
Вы пробовали qemu? При создании крошечных os в uni, это оказалось лучшей программой для этого типа вещей.
Если вы хотите, вы можете проверить ОС, которая была использована в качестве примера в моем классе в этом семестре. Это сделано в c
. Мы использовали загрузчик GRUB и qemu для запуска файлов.
Это написано довольно чисто пошагово, первый приращение - именно "Hello world" OS, а последний инкремент содержит все, от полной оболочки, потоков и процессов и множества других вещей. Здесь вы можете найти примеры исходных кодов, make файлов и скриптов-линкеров (от простых до довольно сложных)
http://sourceforge.net/projects/oszur11/
Я бы также ссылался на script, следуя приращениям, но, к сожалению, не на английском языке.
О, а также один шаг, специально предназначенный для отладки там, но это больше для отладки процедур, сделанных для вашей ОС, чем отладка ОС в целом (если я правильно помню, мы использовали две консоли, одну с qemu и один с gdb, подключенным к ОС, работающим в другой).
Когда компьютер загружается, BIOS загружает все, что находится в MBR, по физическому адресу 0x7c00, а затем переходит к этому адресу. Таким образом, вы должны связать свой код, начинающийся с 0x7c00, а не с 0x00100000.
Итак, изменение вашего компоновщика script следующим образом должно решить проблему:
...
SECTIONS{
. = 0x7c00;
...
}
EDIT:. Посмотрев на свой код, я заметил еще несколько проблем. Если вы не используете загрузчик, вам необходимо настроить некоторые параметры, прежде чем вы сможете начать выполнение 32-битного кода, а самое главное - включить защищенный режим. Вот несколько учебных пособий, которые помогут вам на вашем пути.
Для этого вам придется либо:
loader.asm
и использовать GRUB. Мультизагрузочный файл представляет собой файл ELF со специальными заголовками. Example.int 13h
вызова BIOS, поскольку прошивка только считывает 512 байт в память, а вы ваш код, скорее всего, скомпилируется. Example