Ссылка на ядро - PullRequest
       37

Ссылка на ядро

3 голосов
/ 27 июля 2011

Пожалуйста, кто-нибудь знает, как связать загрузку с ядром?Например, у меня есть этот код для загрузки:

[BITS 16]   
[ORG 0x7C00]
[global start]
[extern _main]
start:
call _main
cli 
hlt

и это для моего файла C ++:

#include <iostream>
#include <string>
int main()
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

Теперь я скомпилирую файл .cpp в файл .o и .asmв .o файл.Но как мне теперь связать эти файлы с kernel.bin?Его там какой-то код для этого?Будет ли этот код работать?Пожалуйста, помогите мне.

Ответы [ 2 ]

5 голосов
/ 05 сентября 2011

Во-первых, вы не можете использовать стандартную библиотеку C / C ++, потому что в хобби ОС она не существует *.

Во-вторых, ваш код C ++ выглядит в формате 32Bit, а код на ассемблере - в 16Bit. Они не могут быть связаны, если оба не 16 или оба 32.

Я рекомендую взглянуть на OSDev Wiki (user786653 опубликовал это тоже) ... Там есть много полезных ресурсов, которые помогут вам на пути к написанию операционной системы.

Если вы действительно хотите начать с нуля, используя 16-битную сборку, и хотите использовать 32-битный код C ++, вам придется выполнить следующие шаги:

  1. Создание первого этапа загрузчика (небольшой файл, который загружает оставшуюся часть загрузчика. Он должен быть ровно 512 байт ...
  2. Создание второго этапа загрузчика (на этом этапе настраивается GDT, активируется линия A20 и переключается в 32-битный защищенный режим). Он также может настраивать режим видео, получать информацию об ОЗУ и передавать ее в 32-битное ядро. ..).
  3. Создать 32-битную заглушку ядра (на C / C ++. Предпочтительно C). Это создаст основную среду для ядра операционной системы.
  4. Напишите некоторые стандартные библиотеки C / C ++. String.h - ваш главный приоритет (CString на C ++). Также был бы полезен файл Stdio.h (CStdio на C ++)
  5. В основной функции Kernel Stub вызовите процедуру печати. ​​

(Обратите внимание, что для этого вы должны обладать высоким уровнем знаний C / C ++ и хотя бы некоторыми знаниями по сборке)

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

Надеюсь, это поможет!

-Adrian

2 голосов
/ 27 июля 2011

Посмотрите C ++ Bare Bones из OSDev wiki Но ваш код в настоящее время очень далек от возможности использовать iostream.

...