OSを自作する

中古のノートパソコンであっても直近5年程度のものであれば、どうやらUEFIがexFATに対応しているらしい。
とても簡単にいうと、

・/EFI/BOOT/BOOT64.EFI

というフォルダとファイルを作ると、BOOT64.EFIというEFIアプリケーションが起動される。
オプション多めのコンパイルをして、DELL5415とDELL5405で試したところ、きちんと起動し動作した。

使用したファイル群は、

・gnu-efi
・minGW64

の二つ。どちらもライセンス上オープンソースで配ることになる。
ある程度完成したらば公開する。

もう一つ、qemuなどの仮想化アプリを使いたいが、試したところ、起動せず。

SDカードスロットを持つノートPCが手元に良くありました。

こちらのサイトの4番をせず、9番は開発マシンの他でSDカードをブートしました。

特に、3番と6番と7番は、メモ必須なので、コピペを書いておきます。
3.gnu-efiのダウンロードと解凍とdata.cファイルの変更
sourceforgeのgnu-efi

https://sourceforge.net/projects/gnu-efi/

へ行って
Download
をクリックして、tar.bz2ファイルをダウンロードします。
「gnu-efi-3.0.14.tar.bz2」というファイルがダウンロードされるので、これを展開します。
展開したら「gnu-efi-3.0.14.tar」というファイルができるので、これを展開します。
展開したら「gnu-efi-3.0.14」というファイルができるので、これを名前を「gnu-efi」にして、Cドライブの直下に移動させます。

data.cファイルを変更します。
C:gnu-efilibdata.cの
EFI_UNICODE_COLLATION_INTERFACE   LibStubUnicodeInterface = {
    LibStubStriCmp,
    LibStubMetaiMatch,
    LibStubStrLwrUpr,
    LibStubStrLwrUpr,
    NULL,   // FatToStr
    NULL,   // StrToFat
    NULL    // SupportedLanguages
};
を
EFI_UNICODE_COLLATION_INTERFACE   LibStubUnicodeInterface = {
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,   // FatToStr
    NULL,   // StrToFat
    NULL    // SupportedLanguages
};
に変えます。

//hello.c
#include 
#include 
 
EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
    EFI_STATUS Status;
    EFI_INPUT_KEY Key;
 
    /* Store the system table for future use in other functions */
    ST = SystemTable;
 
    /* Say hi */
    Status = ST->ConOut->OutputString(ST->ConOut, L"Hello World
"); // EFI Applications use Unicode and CRLF, a la Windows
    if (EFI_ERROR(Status))
        return Status;
 
    /* Now wait for a keystroke before continuing, otherwise your
       message will flash off the screen before you see it.
 
       First, we need to empty the console input buffer to flush
       out any keystrokes entered before this point */
    Status = ST->ConIn->Reset(ST->ConIn, FALSE);
    if (EFI_ERROR(Status))
        return Status;
 
    /* Now wait until a key becomes available.  This is a simple
       polling implementation.  You could try and use the WaitForKey
       event instead if you like */
    while ((Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &Key)) == EFI_NOT_READY) ;
 
    return Status;
}

7.バッチファイルの作成とBOOTX64.EFIの作成
build.cmdというファイルを作成し、
c:mingw64ingcc.exe -fpic -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -maccumulate-outgoing-args -Ic:gnu-efiinc -Ic:gnu-efiincx86_64 -Ic:gnu-efiincprotocol -c main.c -o main.o
c:mingw64ingcc.exe -fpic -ffreestanding -fno-stack-protector -fno-stack-check -fshort-wchar -mno-red-zone -maccumulate-outgoing-args -Ic:gnu-efiinc -Ic:gnu-efiincx86_64 -Ic:gnu-efiincprotocol -c c:gnu-efilibdata.c -o data.o 
c:mingw64inld.exe -nostdlib -shared -e efi_main main.o data.o -o BOOTX64.bin
c:mingw64inobjcopy.exe --target efi-app-x86_64 --subsystem=10 BOOTX64.bin BOOTX64.EFI
を書き、保存します。

build.cmdをクリックし、BOOTX64.EFIを作成します。


作りたいOSは、テキストのみで文法も操作も簡単なもの。
OSの名前は、Memory Castleに決めています。
少し頑張ってみます。
にほんブログ村 音楽ブログへにほんブログ村 にほんブログ村 音楽ブログ 作曲へにほんブログ村 にほんブログ村 哲学・思想ブログへにほんブログ村 にほんブログ村 哲学・思想ブログ 哲学へにほんブログ村 にほんブログ村 IT技術ブログへにほんブログ村 にほんブログ村 IT技術ブログ プログラム・プログラマーへにほんブログ村
Copyright (C) 2024 Mannersy.com click and mail.