非情報系インフラエンジニアの情報系お勉強

OS自作、ネットワーク、セキュリティの備忘録

OS自作入門 5日目/30日(文字出力)

OS自作入門 5日目/30日(文字出力)

1.はじめに

5日目では、文字の出力を行う。躓きどころは下記の2点

  1. フォントの作成
  2. sprintf

フォントの作成についても、著者オリジナル実行ファイルを使用せずに、作成する。

sprintfについては、ソースファイルをそのまま実行するとエラーになるため、sprintfの代わりの関数を作成する。

2.harib02e

スクリーンへ文字の出力を行う。

harib02eでも著者のオリジナル実行ファイルが使用されているので、自作本とは異なる方法でimgファイルを作成する。

自作本でのimgファイルの作成手順

  1. フォントtextファイルから、makefont.exe(著者オリジナル)でbinファイルを作成
  2. bin2obj.exe(著者オリジナル)でbinファイルからobjファイルを作成
  3. 他のオブジェクトファイルと合体させ、bimファイルを作成(以降は、前回説明した流れと同じ)
  4. bimファイルからhrbファイルを作成
  5. bimファイルとbinファイルからsysファイルを作成
  6. sysファイルとブートローダ部のbinファイルからimgファイルを作成

著者オリジナルのファイルを使用しない、imgファイルを作成手順

  1. フォントtextファイルを、フォントcファイルに変換
  2. 作成したフォントcファイルと他のファイルをリンクさせ、bootpackのhrbファイルを作成(以降は、前回説明した流れと同じ)
  3. hrbファイルとbinファイルからsysファイルを作成
  4. sysファイルとブートローダ部のbinファイルからimgファイルを作成

最初の手順1. フォントtextファイルを、フォントcファイルに変換は、CD内のhankaku.txtを使用する。textファイルからcファイルの変換については、下記サイトを参考にプログラムを新規に作成。

GDT(グローバルディスクリプタテーブル) | OS自作入門 5日目-1 【Linux】 | サラリーマンがハッカーを真剣に目指す

今回のMakefileは、次の通り

IMG=haribote.img
IPL=ipl.bin
IASM=ipl.asm
HD=asmhaed.bin
HASM=asmhead.asm
FASM=asmfunc.asm
FOB=asmfunc.o
BT=bootpack.c
BHRB=bootpack.hrb
LD=har.ld
HSYS=haribote.sys
MFONT=makefont.c #【今回追加】
OFONT=font.o #【今回追加】
FONT=font.c #【今回追加】

#--- 【今回追加始まり】フォントの作成
$(OFONT) : $(MFONT)
    gcc $(MFONT) -o $(OFONT)

$(FONT) : $(OFONT)
    ./$(OFONT)
#--- 【今回追加終わり】

#--- イメージファイルの作成
$(IPL) : $(IASM)
    nasm $(IASM) -o $(IPL)

$(HD) : $(HASM)
    nasm $(HASM) -o $(HD)

$(FOB) : $(FASM)
    nasm -g -f elf $(FASM) -o $(FOB)

$(BHRB) : $(BT) $(LD) $(FOB) $(FONT) #【今回修正】
    gcc -march=i486 -m32 -fno-pic -nostdlib -T $(LD) -g $(BT) $(FONT) $(FOB) -o $(BHRB)

$(HSYS) : $(HD) $(BHRB)
    cat $(HD) $(BHRB) > $(HSYS)

$(IMG) : $(IPL) $(HSYS)
    mformat -f 1440 -C -B $(IPL) -i $(IMG) ::
    mcopy $(HSYS) -i $(IMG) ::

img :
    make $(IMG)

dump :
    hexdump -C $(IMG)

clean :
    rm -f *.lst *.bin *.sys *.img *.hrb *.o

3.harib02g

変数の内容を表示する。

変更箇所は下記の通り。

bootpack.c

変更前 変更後 説明
#include<stdio.h> 削除
extern void orisprintf(char str, char fmt, ...); 新たにorisprintfのソースファイルを作成したので、変数定義箇所に追記

orisprintf.c

sprintfが使用できないため、代わりにorisprintf関数を作成
下記サイトを参考、関数名は適当に変更

sprintfを実装する | OS自作入門 5日目-2 【Linux】 | サラリーマンがハッカーを真剣に目指す

Makefileは下記の通り

IMG=haribote.img
IPL=ipl.bin
IASM=ipl.asm
HD=asmhaed.bin
HASM=asmhead.asm
FASM=asmfunc.asm
FOB=asmfunc.o
BT=bootpack.c
BHRB=bootpack.hrb
LD=har.ld
HSYS=haribote.sys
MFONT=makefont.c
OFONT=font.o
FONT=font.c
CSPR=orisprintf.c

#--- フォントの作成
$(OFONT) : $(MFONT)
    gcc $(MFONT) -o $(OFONT)

$(FONT) : $(OFONT)
    ./$(OFONT)

#--- イメージファイルの作成
$(IPL) : $(IASM)
    nasm $(IASM) -o $(IPL)

$(HD) : $(HASM)
    nasm $(HASM) -o $(HD)

$(FOB) : $(FASM)
    nasm -g -f elf $(FASM) -o $(FOB)

$(BHRB) : $(BT) $(LD) $(FOB) $(FONT) $(CSPR)
    gcc -march=i486 -m32 -fno-pic -nostdlib -T $(LD) -g $(BT) $(FONT) $(FOB) $(CSPR) -o $(BHRB)

$(HSYS) : $(HD) $(BHRB)
    cat $(HD) $(BHRB) > $(HSYS)

$(IMG) : $(IPL) $(HSYS)
    mformat -f 1440 -C -B $(IPL) -i $(IMG) ::
    mcopy $(HSYS) -i $(IMG) ::

img :
    make $(IMG)

dump :
    hexdump -C $(IMG)

clean :
    rm -f *.lst *.bin *.sys *.img *.hrb *.o $(OFONT) $(FONT) $(OSPR)

4.harib02h

関数の追加等があるが、特に躓くところはなく、今までの修正内容の通りで問題なし