FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

「30日でできる!OS自作入門」を読み始めた (21日目. OSを守る)

30日でできる! OS自作入門

30日でできる! OS自作入門

30日でできる!21日目はOSを守る。目的がなんだかわからなくなってきたが、要するにアプリケーションを呼び出した後にどのように処理をするか、ということなのだが、APIを処理するための割り込みを用意してそこをすべて通過させるようにする。

最初結構手こずったが、最終的にはちゃんと動かすことができた。

f:id:msyksphinz:20180425235957p:plain

bim2hrbを使わない分、アセンブラを使うプログラムはHariMainラベルを追加したり、ちょっと改造する必要があるな。

hello2.hrb: hello2.nas 
    nasm -felf32 $^ -o tmp.o -l $@.lst
    ld -m elf_i386 -e HariMain -n -Thrb.ld -static -o $@ tmp.o

crack2.hrb: crack2.nas
    nasm -felf32 $^ -o tmp.o -l $^.lst
    ld -m elf_i386 -e HariMain -n -Thrb.ld -static -o $@ tmp.o
[BITS    32]
      GLOBAL    HariMain
      
HariMain:   ; ラベルを挿入したり。
    mov     edx,2
    mov     ebx, msg
    int     0x40
    mov     edx, 4
    int     0x40

msg:
    db      "hello", 0

hrb.ld は以下のように設定した。

  • hrb.ld
OUTPUT_FORMAT("binary");

SECTIONS
{
    .head 0x0 : {
        LONG(49 * 64 * 1024)  /*  0 : stack+.data+heap の大きさ(4KBの倍数) */
        LONG(0x69726148)      /*  4 : シグネチャ "Hari" */
        LONG(0)               /*  8 : mmarea の大きさ(4KBの倍数) */
        LONG(0x310000)        /* 12 : スタック初期値&.data転送先 */
        LONG(SIZEOF(.data))   /* 16 : .dataサイズ */
        LONG(LOADADDR(.data)) /* 20 : .dataの初期値列のファイル位置 */
        LONG(0xE9000000)      /* 24 : 0xE9000000 */
        LONG(HariMain - 0x20) /* 28 : エントリアドレス - 0x20 */
        LONG(0)               /* 32 : heap領域(malloc領域)開始アドレス */
    }

    .text : { *(.text) }

    .data 0x310000 : AT ( ADDR(.text) + SIZEOF(.text) ) {
        *(.data)
        *(.rodata*)
        *(.bss)
    }

    /DISCARD/ : { *(.eh_frame) }

}