Как скомпилировать простую операционную систему и сделать ее загрузочной?

Меня интересуют концепции операционных систем, поэтому я скачал Hello world OS. Я хотел бы знать, как скомпилировать и связать код и сделать загрузочный образ. Я использую старую версию Cygwin для Windows (Cygwin-b20) 1999 года.

Мой код для main.c:

#include "bloader.h"

int main();

unsigned int oldEBP;
struct boot_dir *viewableDirectory;
int totalMem;
char * passedParams;

void _start(int memSize, char *parms, struct boot_dir *loadedfiles)
{
    asm("mov %%ebp, %0":"=m"(oldEBP));
    viewableDirectory = loadedfiles; /*make file mem locations global*/
    totalMem = memSize; /*make mem of system global*/
    passedParams = parms; /*make paramaters passed to system global*/
    main();

    asm("hlt");     /* this halts the machine, solving the problem of triple-faults on 
                        some machines, but also making it impossible to return to DOS */
}

int main()
{
    char *vidmem = (char *) 0xb8000;

    /* "Hello " */
    vidmem[0] = 'H';
    vidmem[1] = 0x7;
    vidmem[2] = 'e';
    vidmem[3] = 0x7;
    vidmem[4] = 'l';
    vidmem[5] = 0x7;
    vidmem[6] = 'l';
    vidmem[7] = 0x7;
    vidmem[8] = 'o';
    vidmem[9] = 0x7;
    vidmem[10] = ' ';
    vidmem[11] = 0x7;

    /* "World " */
    vidmem[12] = 'W';
    vidmem[13] = 0x7;
    vidmem[14] = 'o';
    vidmem[15] = 0x7;
    vidmem[16] = 'r';
    vidmem[17] = 0x7;
    vidmem[18] = 'l';
    vidmem[19] = 0x7;
    vidmem[20] = 'd';
    vidmem[21] = 0x7;
    vidmem[22] = ' ';
    vidmem[23] = 0x7;

    /* "OS" */
    vidmem[24] = 'O';
    vidmem[25] = 0x7;
    vidmem[26] = 'S';
    vidmem[27] = 0x7;

    return 0;
}

Меня интересуют инструкции:

  1. Создайте файл ISO после компиляции и запустите его с помощью VMware (или других виртуальных машин).
  2. Запустите этот код после компиляции на реальной машине при загрузке системы и как добавить его в запись загрузчика (например, GRUB)

person Mojtaba Kamyabi    schedule 30.05.2014    source источник
comment
Вы пробовали Makefile, предоставленный веб-сайтом? Он должен вывести файл img. С помощью этого файла вы сможете смонтировать его внутри программного обеспечения виртуальной машины или dd на USB-накопителе.   -  person z̫͋    schedule 30.05.2014
comment
спасибо, но я получаю следующую ошибку при запуске make: gcc -g -O -I. -c main.c -o main.o [sig] E:\softwares\cygnus\cygwin-b20\H-i586-cygwin32\bin\make.exe 1000 (0) call_ handler: couldn't get context of main thread, error 998   -  person Mojtaba Kamyabi    schedule 30.05.2014
comment
Вы пробовали это? stackoverflow .com/questions/11817747/   -  person Ruud Helderman    schedule 30.05.2014
comment
Погуглив ошибку, она как-то связана с вашим bash. Возможно, вы захотите попробовать Msys или скомпилировать его на платформе *nix, если у вас есть доступ к одному из них.   -  person z̫͋    schedule 30.05.2014
comment
@Ruud да. Я правильно установил gcc из sygwin   -  person Mojtaba Kamyabi    schedule 30.05.2014
comment
@z̫͋ спасибо за ваш комментарий, но у меня проблема, когда я делаю загрузку из kernel.elf файла с помощью bootmaker команды: error: cannot load kernel.elf Я гуглил, но ничего не нашел :(   -  person mojibuntu    schedule 30.05.2014


Ответы (1)


Создайте пустой файл и дайте ему расширение .vmdk.

откройте его в своем любимом шестнадцатеричном редакторе

и поместите скомпилированный код загрузчика

это точно так же, как жесткий диск

также последние 2 байта в секторе должны быть 55 и AA

ваш код загрузчика начинается с 00

это будет выглядеть примерно так

Sector    Offset    Hex Values                                           Ascii
x00000000 x000      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      
          x010      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00       
          x020      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
          x030      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x040      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x050      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x060      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x070      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x080      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x090      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x0A0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x0B0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x0C0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x0D0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x0E0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          x0F0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
          -------------
          x1F0      00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

вот инструкция по запуску загрузчика

http://www.codeproject.com/Articles/36907/How-to-develop-your-own-Boot-Loader#_Toc231383191

person user3692106    schedule 30.05.2014
comment
Минимальный пример GAS, который работает на QEMU: stackoverflow.com/a/32483545/895245 - person Ciro Santilli 新疆再教育营六四事件ۍ 09.09.2015