30 日でできる OS 自作入門
- Ubuntu-20.04 on WSL2 on Windows10
img のビルドは Ubuntu-20.04 上で、img の起動は Windows10 から行う。
-
nasm
- インストール
$ sudo apt instal nasm - バージョン
$ nasm --version NASM version 2.14.02
- インストール
-
mtools
- インストール
$ sudo apt instal mtools - バージョン
$ mtools --version mtools (GNU mtools) 4.0.24 configured with the following options: enable-xdf disable-vold disable-new-vold disable-debug enable-raw-term
- インストール
-
gcc
- バージョン
$ gcc --version gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- バージョン
- QEMU
エミュレーター。ビルドした img ファイルを実行するために使う。
- img 起動スクリプト
Ubuntu 上でビルドした img ファイルを QEMU を使って起動する bat ファイル。"C:\Program Files\qemu\qemu-system-i386.exe" -soundhw pcspk -m 32M -fda "\\wsl$\Ubuntu-20.04\home\takumi\work\os30days\haribote.img"
「30 日でできる OS 自作入門」を進めるにあたって以下サイトを参考にさせていただきました。 本当にありがとうございました。
- 30 日でできる!OS 自作入門(記事一覧)[Ubuntu16.04/NASM]
- Ubuntu で OS 自作入門 1 日目
- 『OS 自作入門』を読んでみた。(その 6) - いものやま。
- 『30 日でできる!OS 自作入門』のメモ
- papamitra (HariboteOS カテゴリ)
- はりぼて OS を NASM・GCC で動かす(Mac OSX)
- 30 日でできる!OS 自作入門 on macOS
- 「30 日でできる! OS 自作入門」を Mac 向けに環境構築する
- サラリーマンがハッカーを真剣に目指す (「OS 自作」タグ)
- FPGA 開発日記 (OS 自作の記事)
- TSUGULOG Home (TSUGULOG Home タグ)
- VESA - os-wiki
- 【 mformat 】 MS-DOS フォーマットを行う
- Mtools 4.0.20: drive letters - GNU.org
- リンカスクリプトの書き方
- objdump - オブジェクトファイルの情報を表示する
- size - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
- NASM Document
- C: 静的ライブラリと共有ライブラリについて
各節でやったことのメモ
-
値がすべて 0 の 1,474,560 byte のサイズを作る
$ head -c 1474560 /dev/zero > helloos.img -
書籍に従って 0 以外の値を編集する
VS Code の Hex Editor 拡張機能を使用した。 -
コマンドプロンプトから以下コマンドを実施し、img ファイルを起動する。
> "C:\Program Files\qemu\qemu-system-i386.exe" \\wsl$\Ubuntu-20.04\PATH_TO_IMG_FILE\helloos.img
- warning が出たけどひとまず無視
WARNING: Image format was not specified for '\\wsl$\Ubuntu-20.04\home\takumi\tmp\os30days\helloos.img' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions.
- warning が出たけどひとまず無視
メモなし。
- 著者作の nask ではなく一般的な nasm を使用する。
- 書籍記載の
helloos.nasではなくhelloos.asmという名前で作る(今後 .nas ファイルは .asm として作っていく) - nasm コマンドで img ファイルを作る
$ nasm helloos.asm -o helloos.img
- warning が出たけどひとまず無視する
helloos.asm:9: warning: uninitialized space declared in .text section: zeroing [-w+other] helloos.asm:17: warning: uninitialized space declared in .text section: zeroing [-w+other] helloos.asm:20: warning: uninitialized space declared in .text section: zeroing [-w+other] helloos.asm:22: warning: uninitialized space declared in .text section: zeroing [-w+other]
- warning が出たけどひとまず無視する
-
書籍に従い
helloos.asmを書き直す(projects/01_day/helloos2/helloos.nasを参照する) -
nasm コマンドでアセンブル
$ nasm helloos.asm -o helloos.img
- エラーとなる
これは、nask と nasm の仕様差異によるものらしい。
helloos.asm:41: error: attempt to reserve non-constant quantity of BSS space
RESB 0x1fe-$は「現在位置から 0x1fe バイトまでを 0 で埋める」という指示だが、nasm で$は「式を含む行の先頭位置」を表し、$$は「現在のセクションの先頭位置」を表す。 よって、$-$$は「現在のセクションの先頭からどのくらい進んでいるか」を意味する。 ちなみにRESBはReserve Byteという意味 - エラー箇所を nasm 仕様に合わせて修正する
- RESB 0x1fe-$ + RESB 0x1fe-($-$$)
- エラーとなる
-
再アセンブル
$ nasm helloos.asm -o helloos.img
エラーが消え、helloos.img が生成できた。
先と同じ warning が出たがひとまず気にしない。test.asm:24: warning: uninitialized space declared in .text section: zeroing [-w+other] test.asm:41: warning: uninitialized space declared in .text section: zeroing [-w+other] test.asm:48: warning: uninitialized space declared in .text section: zeroing [-w+other] test.asm:50: warning: uninitialized space declared in .text section: zeroing [-w+other]
【参考】
わたしは VS Code を使って開発をしました。
- 書籍に従って
helloos.asmを修正する(projects/02_day/helloos3/helloos.nasを参照する)
- 書籍に従って
ipl.asmを作成する(projects/02_day/helloos4/ipl.nasを参照する) - 以下コマンドで
ipl.asmからipl.binとipl.lstを生成する$ nasm ipl.asm -o ipl.bin -l ipl.lst
- 以下コマンドで img ファイルを生成する
各オプションの意味は以下の通り。
$ mformat -f 1440 -C -B ipl.bin -i helloos.img ::よくある mformat コマンドの使用例は、-f : ファイルサイズ (1440 KB) -C : MS-DOSファイルシステムのimageファイルを作成する -B : 使用するブートセクタ -i : イメージファイル :: : -i オプションを使うときに使うドライブ指定文字$ mformat :aで、「:a」部分は「a ドライブ」とを意味する。「-i」オプションを使う場合は、ドライブ指定文字として「:」を使うため、表記が「::」となる。
【参考】
-
書籍を参考に Makefile を作成する
IMGFILE=helloos.img all : $(IMGFILE) ipl.bin : ipl.asm nasm $^ -o $@ -l ipl.lst $(IMGFILE) : ipl.bin mformat -f 1440 -C -B $^ -i $@ :: # -f : ファイルサイズ (1440 KB) # -C : MS-DOSファイルシステムのimageファイルを作成する # -B : 使用するブートセクタ # -i : イメージファイル # :: : -i オプションを使うときに使うドライブ指定文字 # image ファイルの起動は Windows から行うため、Makefile に run は用意していない clean : rm $(IMGFILE) ipl.bin ipl.lst
- 書籍に従って
ipl.asmを修正する(projects/03_day/harib00a/ipl.nasを参照する) - 生成する image ファイルを
haribote.imgに変更(Makefileの修正)- IMGFILE=helloos.img + IMGFILE=haribote.img
- 書籍に従って
ipl.asmを修正する(projects/03_day/harib00b/ipl.nasを参照する)
- 書籍に従って
ipl.asmを修正する(projects/03_day/harib00c/ipl.nasを参照する)
- 書籍に従って
ipl.asmを修正する(projects/03_day/harib00d/ipl.nasを参照する)
-
書籍に従って
haribote.asmを修正する(projects/03_day/harib00e/haribote.nasを参照する) -
haribote.asmアセンブルしてharibote.sysを生成する$ nasm haribote.asm -o haribote.sys -l haribote.lst
-
ipl.binをブートセクタ、haribote.imgを生成する$ mformat -f 1440 -C -B ipl.bin -i haribote.img :: -
haribote.sysをharibote.imgに書き込む$ mcopy haribote.sys -i harinbote.img :: -
Makefileを修正するIMGFILE=haribote.img all : $(IMGFILE) ipl.bin : ipl.asm nasm $^ -o $@ -l ipl.lst + haribote.sys : haribote.asm + nasm $^ -o $@ -l haribote.lst - $(IMGFILE) : ipl.bin + $(IMGFILE) : ipl.bin haribote.sys - mformat -f 1440 -C -B $^ -i $@ :: + mformat -f 1440 -C -B ipl.bin -i $@ :: # -f : ファイルサイズ (1440 KB) # -C : MS-DOSファイルシステムのimageファイルを作成する # -B : 使用するブートセクタ # -i : イメージファイル # :: : -i オプションを使うときに使うドライブ指定文字 + mcopy haribote.sys -i $@ :: # image ファイルの起動は Windows から行うため、Makefile に run は用意していない clean : - rm $(IMGFILE) ipl.bin ipl.lst + rm $(IMGFILE) ipl.bin ipl.lst haribote.sys haribote.lst
【参考】
- 書籍に従って
ipl.asmを修正する(projects/03_day/harib00f/ipl.nasを参照する) - 書籍に従って
haribote.asmを修正する(projects/03_day/harib00f/haribote.nasを参照する)
- 書籍に従って
haribote.asmを修正する(projects/03_day/harib00g/haribote.nasを参照する) ipl.asmをipl10.asmにリネームする- 書籍に従って
ipl.asmを修正する(projects/03_day/harib00g/ipl10.nasを参照する) Makefileを修正する
iplの部分をipl10に直しておく。
- 書籍に従って
haribote.asmを修正する(projects/03_day/harib00h/haribote.nasを参照する)
-
haribote.asmをasmhead.asmにリネームする -
書籍に従って
asmhead.asmを修正する(projects/03_day/harib00i/asmhead.nasを参照する) -
asmhead.asmからasmhead.binを生成する$ nasm asmhead.asm -o asmhead.bin -l asmhead.lst -
書籍に従って
bootpack.cを作成する(projects/03_day/harib00i/bootpack.cを参照する) -
bootpack.cを 機械語に変換する
bootpack.cを機械語のファイルbootpack.binに変換するため、以下コマンドを使う。$ gcc -m32 -fno-pic -nostdlib -T hrb.ld bootpack.c -o bootpack.bin
各オプションの意味は次の通り。
-m32 : 32bit 環境向けにコンパイルする -fno-pic : 位置に依存しないコードを生成しない(pic : position independent code) -nostdlib : リンク時に標準ライブラリを使わない -T hrb.ld : リンカスクリプト `hrb.ld` を使用する -o : 出力ファイル -
asmhead.binとbootpack.binからharibote.sysを生成する$ cat asmhead.bin bootpack.bin > haribote.sys -
Makefileを修正するIMGFILE=haribote.img IPLFILE=ipl10.asm all : $(IMGFILE) ipl10.bin : $(IPLFILE) nasm $^ -o $@ -l ipl10.lst - haribote.sys : haribote.asm - nasm $^ -o $@ -l haribote.lst + asmhead.bin : asmhead.asm + nasm $^ -o $@ -l asmhead.lst + + bootpack.bin : bootpack.c + gcc -m32 -fno-pic -nostdlib -T hrb.ld $^ -o $@ + + haribote.sys : asmhead.bin bootpack.bin + cat $^ > $@ $(IMGFILE) : ipl10.bin haribote.sys mformat -f 1440 -B ipl10.bin -C -i $@ :: mcopy haribote.sys -i $@ :: # 1440[KB] (= 512 * 2880 byte) # C: to install on MS-DOS file system # image ファイルの起動は Windows から行うため、Makefile に run は用意していない clean : - rm $(IMGFILE) ipl10.bin ipl10.lst haribote.sys haribote.lst + rm $(IMGFILE) \ + ipl10.bin ipl10.lst \ + asmhead.bin asmhead.lst \ + bootpack.bin \ + haribote.sys
【参考】
-
書籍に従って
nasmfunk.asmを修正する(projects/03_day/harib00j/naskfunk.nasを参照する)
ただし nasm を使っているため、下記のように記述する。; nasmfunc ; TAB=4 BITS 32 ; 32ビットモード用の機械語を作らせる ; オブジェクトファイルのための情報 GLOBAL io_hlt ; このプログラムに含まれる関数名 ; 以下は実際の関数 SECTION .text io_hlt: ; void io_hlt(void) HLT RET -
nasmfunc.asmから オブジェクトファイルnasmfunc.oを生成する$ nasm -f elf32 nasmfunc.asm -o nasmfunc.o -l nasmfunc.lst各オプションの意味は次の通り。
-f elf32 : 出力ファイルのフォーマットを指定する。"elf32" は「ELF32 (i386) オブジェクトファイルを指す。 -
bootpack.cからbootpack.oを生成する$ gcc -c -m32 -fno-pic -nostdlib -o bootpack.o bootpack.c -
bootpack.oとnasmfunc.oリンクbootpack.binを生成
ld コマンドを用いてリンクする。$ ld -m elf_i386 -e HariMain -o bootpack.bin -T hrb.ld bootpack.o nasmfunc.o各オプションの意味は次の通り。
-m elf_i386 : elf_i386 形式を指定 -e : プログラムの実行開始位置であるエントリポイントの指定 -
Makefileを修正するIMGFILE=haribote.img IPLFILE=ipl10.asm all : $(IMGFILE) ipl10.bin : $(IPLFILE) nasm $^ -o $@ -l ipl10.lst asmhead.bin : asmhead.asm nasm $^ -o $@ -l asmhead.lst - bootpack.bin : bootpack.c - gcc -m32 -fno-pic -nostdlib -T hrb.ld $^ -o $@ + bootpack.o : bootpack.c + gcc -c -m32 -fno-pic -nostdlib -o $@ $^ + nasmfunc.o : nasmfunc.asm + nasm -f elf32 $^ -o $@ -l nasmfunc.lst) + bootpack.bin : bootpack.o nasmfunc.o + ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $^ haribote.sys : asmhead.bin bootpack.bin cat $^ > $@ $(IMGFILE) : ipl10.bin haribote.sys mformat -f 1440 -B ipl10.bin -C -i $@ :: mcopy haribote.sys -i $@ :: # 1440[KB] (= 512 * 2880 byte) # C: to install on MS-DOS file system # image ファイルの起動は Windows から行うため、Makefile に run は用意していない clean : rm $(IMGFILE) \ - ipl10.bin ipl10.lst \ - asmhead.bin asmhead.lst \ + ipl10.bin ipl10.lst \ + asmhead.bin asmhead.lst \ + bootpack.o \ + nasmfunc.o nasmfunc.lst bootpack.bin \ haribote.sys
【参考】
- 書籍に従って
nasmfunk.asmを修正する(projects/04_day/harib01a/naskfunk.nasを参照する) - 書籍に従って
bootpack.cを修正する(projects/04_day/harib01a/bootpack.cを参照する)
ただし、io_hlt()呼出しのループ処理を while 文に変更した。
- 書籍に従って
bootpack.cを修正する(projects/04_day/harib01b/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/04_day/harib01c/bootpack.cを参照する) - 書籍に従って
nasmfunk.asmを修正する(projects/04_day/harib01c/naskfunk.nasを参照する)
- 書籍に従って
bootpack.cを修正する(projects/04_day/harib01d/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/04_day/harib01e/bootpack.cを参照する)
-
書籍に従って
bootpack.cを修正する(projects/04_day/harib01f/bootpack.cを参照する) -
書籍に従って
nasmfunc.asmを修正する(projects/04_day/harib01f/naskfunk.nasを参照する) -
エラー発生
make したところ ld コマンドでエラーが発生した。$ ld -m elf_i386 -e HariMain -o bootpack.bin -T hrb.ld bootpack.o nasmfunc.o ld: section .note.gnu.property LMA [00000000000001a0,00000000000001bb] overlaps section .data LMA [00000000000001a0,00000000000001cf] make: *** [Makefile:20: bootpack.bin] Error 1.note.gnu.propertyセクションと.dataセクションの配置場所が重なっているということと思われる(LMA : Load Memory Address : プログラムをロードされるときに参照されるアドレス)。 ここで.note.gnu.propertyとは何か確認してみる。$ objdump -s bootpack.o bootpack.o: file format elf32-i386 Contents of section .text: 0000 f30f1efb 5589e583 ec18e8fc ffffffc7 ....U........... 0010 45f00000 0a00c745 f4000000 00eb188b E......E........ 0020 45f489c1 8b55f48b 45f001d0 83e10f89 E....U..E....... 0030 ca881083 45f40181 7df4feff 00007edf ....E...}.....~. 0040 e8fcffff ffebf9f3 0f1efb55 89e583ec ...........U.... 0050 0883ec04 68000000 006a0f6a 00e8fcff ....h....j.j.... 0060 ffff83c4 1090c9c3 f30f1efb 5589e583 ............U... 0070 ec18e8fc ffffff89 45f0e8fc ffffff83 ........E....... 0080 ec08ff75 0868c803 0000e8fc ffffff83 ...u.h.......... 0090 c4108b45 088945f4 eb658b45 100fb600 ...E..E..e.E.... 00a0 c0e8020f b6c083ec 085068c9 030000e8 .........Ph..... 00b0 fcffffff 83c4108b 451083c0 010fb600 ........E....... 00c0 c0e8020f b6c083ec 085068c9 030000e8 .........Ph..... 00d0 fcffffff 83c4108b 451083c0 020fb600 ........E....... 00e0 c0e8020f b6c083ec 085068c9 030000e8 .........Ph..... 00f0 fcffffff 83c41083 45100383 45f4018b ........E...E... 0100 45f43b45 0c7e9383 ec0cff75 f0e8fcff E.;E.~.....u.... 0110 ffff83c4 1090c9c3 ........ Contents of section .data: 0000 000000ff 000000ff 00ffff00 0000ffff ................ 0010 00ff00ff ffffffff c6c6c684 00000084 ................ 0020 00848400 00008484 00840084 84848484 ................ Contents of section .comment: 0000 00474343 3a202855 62756e74 7520392e .GCC: (Ubuntu 9. 0010 332e302d 31307562 756e7475 32292039 3.0-10ubuntu2) 9 0020 2e332e30 00 .3.0. Contents of section .note.gnu.property: 0000 04000000 0c000000 05000000 474e5500 ............GNU. 0010 020000c0 04000000 03000000 ............ Contents of section .eh_frame: 0000 14000000 00000000 017a5200 017c0801 .........zR..|.. 0010 1b0c0404 88010000 18000000 1c000000 ................ 0020 00000000 47000000 00450e08 8502420d ....G....E....B. 0030 05000000 1c000000 38000000 47000000 ........8...G... 0040 21000000 00450e08 8502420d 0559c50c !....E....B..Y.. 0050 04040000 1c000000 58000000 68000000 ........X...h... 0060 b0000000 00450e08 8502420d 0502a8c5 .....E....B..... 0070 0c040400 .....note.gnu.propertyセクションはbootpack.cのコードと関係なさそうなので、gcc コマンドがbootpack.o生成時に 自動で作ったセクションと思われる。 実処理に影響ないと思うのでリンク対象から外すことにする。
(根本的な解決ではないと思うが、とりあえずこの方法を取って先に進む)- リンカスクリプト
hrb.ldの修正
.note.gnu.propertyセクションをリンク対象から外すように修正する。- /DISCARD/ : { *(.eh_frame) } + /DISCARD/ : { + *(.note.gnu.property) + *(.eh_frame) + }
- 再度 make する
無事、haribote.imgが生成でき、色の変わった縞模様が表示できた。
- リンカスクリプト
【参考】
- 書籍に従って
bootpack.cを修正する(projects/04_day/harib01g/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/04_day/harib01h/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02a/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02b/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02c/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02d/bootpack.cを参照する)
-
書籍に従って
bootpack.cを修正する(projects/05_day/harib02e/bootpack.cを参照する) -
フォントデータ
hankaku.txtを C 言語の 16 進数の配列に変換してhankaku.cとして出力する
例えば、..***... // 0011 1000 .*...*.. // 0100 0100から、
char hankaku[2] = { 0x38, 0x44, };
に変換する。
hankaku.txtからhankaku.cを生成するシェルスクリプトconvHankaku.shを作成した。 -
hankaku.cをビルドに組み込むようにMakefileを修正する+ hankaku.o : hankaku.c + gcc -c -m32 -fno-pic -nostdlib -o $@ $^ nasmfunc.o : nasmfunc.asm nasm -f elf32 $^ -o $@ -l $(@:.o=.lst) - bootpack.bin : bootpack.o nasmfunc.o + bootpack.bin : bootpack.o hankaku.o nasmfunc.o ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $^
clean : rm $(IMGFILE) \ ipl10.bin ipl10.lst \ asmhead.bin asmhead.lst \ bootpack.o \ + hankaku.o \ nasmfunc.o nasmfunc.lst \ bootpack.bin \ haribote.sys
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02f/bootpack.cを参照する)
-
書籍に従って
bootpack.cを修正する(projects/05_day/harib02g/bootpack.cを参照する) -
ビルドをするが、sprintf が未定義とエラーが出る
ld: bootpack.o: in function `HariMain': bootpack.c:(.text+0xcc): undefined reference to `sprintf' make: *** [Makefile:28: bootpack.bin] Error 1-
sprintf のリンクを試みる(この方法ではダメだった)
ld コマンドでリンクするファイルに sprintf が定義されていないので、sprintf が定義されているライブラリを追記してみる。 32bit 用のライブラリを使うためにgcc-multilibをインストール。$ sudo apt-get install gcc-multilib
そして、
Makefileを以下のように修正。/usr/lib32のlibg.aを使ってみる。bootpack.bin : bootpack.o hankaku.o nasmfunc.o - ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $^ + ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $^ -static -L/usr/lib32 -lc
make してみるが、大量のエラーが発生。
おそらく、コンパイル時に `-nostdlib` オプションを付けているために、標準の各種マクロ等々が未定義だと言っていると思われる。 これら1つ1つを解決していくのはちょっと大変なので別の方法を考える。エラー詳細
ld: section .text.__x86.get_pc_thunk.bx LMA [0000000000058e65,0000000000058e68] overlaps section .data LMA [0000000000058e65,0000000000075514] ld: /usr/lib32/libc.a(iofclose.o):(.data.rel.local.DW.ref.__gcc_personality_v0[DW.ref.__gcc_personality_v0]+0x0): undefined reference to `__gcc_personality_v0' ld: /usr/lib32/libc.a(iovsprintf.o): in function `_IO_str_chk_overflow': (.text+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(iovsprintf.o): in function `__vsprintf_internal': (.text+0x2f): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o): in function `save_for_backup': (.text+0xb): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o): in function `flush_cleanup': (.text+0x22c): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o): in function `_IO_un_link.part.0': (.text+0x309): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o):(.text+0x60d): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow ld: /usr/lib32/libc.a(dl-misc.o): in function `_dl_strtoul': (.text+0x7f0): undefined reference to `__udivdi3' ld: /usr/lib32/libc.a(dl-tls.o): in function `allocate_dtv': (.text+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `oom': (.text+0x48): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `_dl_next_tls_modid': (.text+0x7b): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `_dl_count_modids': (.text+0x18a): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `_dl_get_tls_static_info': (.text+0x1fa): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o):(.text+0x22f): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow ld: /usr/lib32/libc.a(printf_fp.o): in function `__printf_fp_l': (.text+0x4c6): undefined reference to `__unordtf2' ld: (.text+0x52a): undefined reference to `__unordtf2' ld: (.text+0x575): undefined reference to `__letf2' ld: /usr/lib32/libc.a(printf_fp.o): in function `___printf_fp': (.text+0x2c1a): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-printf.o): in function `__register_printf_specifier': (.text+0x12): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(printf_fphex.o): in function `__printf_fphex': (.text+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: (.text+0xfc): undefined reference to `__unordtf2' ld: (.text+0x15c): undefined reference to `__unordtf2' ld: (.text+0x1aa): undefined reference to `__letf2' ld: /usr/lib32/libc.a(reg-modifier.o): in function `__register_printf_modifier': (.text+0xf): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-modifier.o): in function `__handle_registered_modifier_mb': (.text+0x1ca): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-modifier.o): in function `__handle_registered_modifier_wc': (.text+0x2ba): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-type.o): in function `__register_printf_type': (.text+0xe): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(vfwprintf-internal.o): in function `group_number': (.text+0x8d): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(vfwprintf-internal.o):(.text+0x1a1): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow ld: /usr/lib32/libc.a(iofclose.o): in function `_IO_new_fclose.cold': (.text.unlikely+0x36): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(iofflush.o): in function `_IO_fflush.cold': (.text.unlikely+0x35): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(iofputs.o): in function `_IO_fputs.cold': (.text.unlikely+0x35): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(iofwrite.o): in function `_IO_fwrite.cold': (.text.unlikely+0x34): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(wfileops.o): in function `_IO_wfile_underflow.cold': (.text.unlikely+0x34): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(fileops.o):(.text.unlikely+0x34): more undefined references to `_Unwind_Resume' follow ld: /usr/lib32/libc.a(strcasecmp_l-ssse3.o): in function `__strcasecmp_ssse3': (.text.ssse3+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(strcasecmp_l-ssse3.o): in function `__strcasecmp_l_ssse3': (.text.ssse3+0x52): undefined reference to `_GLOBAL_OFFSET_TABLE_' takumi@takumi-daiv:~/work/os30days (master)$ make ld -m elf_i386 -e HariMain -o bootpack.bin -T hrb.ld bootpack.o hankaku.o nasmfunc.o -static -L/usr/lib32 -lc ld: section .text.__x86.get_pc_thunk.bx LMA [0000000000058e65,0000000000058e68] overlaps section .data LMA [0000000000058e65,0000000000075514] ld: /usr/lib32/libc.a(iofclose.o):(.data.rel.local.DW.ref.__gcc_personality_v0[DW.ref.__gcc_personality_v0]+0x0): undefined reference to `__gcc_personality_v0' ld: /usr/lib32/libc.a(iovsprintf.o): in function `_IO_str_chk_overflow': (.text+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(iovsprintf.o): in function `__vsprintf_internal': (.text+0x2f): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o): in function `save_for_backup': (.text+0xb): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o): in function `flush_cleanup': (.text+0x22c): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o): in function `_IO_un_link.part.0': (.text+0x309): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(genops.o):(.text+0x60d): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow ld: /usr/lib32/libc.a(dl-misc.o): in function `_dl_strtoul': (.text+0x7f0): undefined reference to `__udivdi3' ld: /usr/lib32/libc.a(dl-tls.o): in function `allocate_dtv': (.text+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `oom': (.text+0x48): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `_dl_next_tls_modid': (.text+0x7b): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `_dl_count_modids': (.text+0x18a): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o): in function `_dl_get_tls_static_info': (.text+0x1fa): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(dl-tls.o):(.text+0x22f): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow ld: /usr/lib32/libc.a(printf_fp.o): in function `__printf_fp_l': (.text+0x4c6): undefined reference to `__unordtf2' ld: (.text+0x52a): undefined reference to `__unordtf2' ld: (.text+0x575): undefined reference to `__letf2' ld: /usr/lib32/libc.a(printf_fp.o): in function `___printf_fp': (.text+0x2c1a): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-printf.o): in function `__register_printf_specifier': (.text+0x12): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(printf_fphex.o): in function `__printf_fphex': (.text+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: (.text+0xfc): undefined reference to `__unordtf2' ld: (.text+0x15c): undefined reference to `__unordtf2' ld: (.text+0x1aa): undefined reference to `__letf2' ld: /usr/lib32/libc.a(reg-modifier.o): in function `__register_printf_modifier': (.text+0xf): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-modifier.o): in function `__handle_registered_modifier_mb': (.text+0x1ca): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-modifier.o): in function `__handle_registered_modifier_wc': (.text+0x2ba): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(reg-type.o): in function `__register_printf_type': (.text+0xe): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(vfwprintf-internal.o): in function `group_number': (.text+0x8d): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(vfwprintf-internal.o):(.text+0x1a1): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow ld: /usr/lib32/libc.a(iofclose.o): in function `_IO_new_fclose.cold': (.text.unlikely+0x36): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(iofflush.o): in function `_IO_fflush.cold': (.text.unlikely+0x35): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(iofputs.o): in function `_IO_fputs.cold': (.text.unlikely+0x35): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(iofwrite.o): in function `_IO_fwrite.cold': (.text.unlikely+0x34): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(wfileops.o): in function `_IO_wfile_underflow.cold': (.text.unlikely+0x34): undefined reference to `_Unwind_Resume' ld: /usr/lib32/libc.a(fileops.o):(.text.unlikely+0x34): more undefined references to `_Unwind_Resume' follow ld: /usr/lib32/libc.a(strcasecmp_l-ssse3.o): in function `__strcasecmp_ssse3': (.text.ssse3+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(strcasecmp_l-ssse3.o): in function `__strcasecmp_l_ssse3': (.text.ssse3+0x52): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(strcasecmp_l-sse4.o): in function `__strcasecmp_sse4_2': (.text.sse4.2+0xc): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(strcasecmp_l-sse4.o): in function `__strcasecmp_l_sse4_2': (.text.sse4.2+0x52): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(strcspn-c.o): in function `__strcspn_sse42': (.text.sse4.2+0xf): undefined reference to `_GLOBAL_OFFSET_TABLE_' ld: /usr/lib32/libc.a(strspn-c.o):(.text.sse4.2+0x13): more undefined references to `_GLOBAL_OFFSET_TABLE_' follow make: *** [Makefile:28: bootpack.bin] Error 1 -
sprintf のライブラリを作成する(この方法で上手くいった)
付属の CD-ROM に sprintf のソースコード一式があることがわかった。 ならばこのソースコードから静的ライブラリを作り、リンクすれば良いはず。- ライブラリを作る用のサブディレクトリ
golibcを作成$ mkdir golibc` - 静的ライブラリ
libgolibc.aを作る
作り方はgolibcディレクトリ内の README.md を参照のこと。
- ライブラリを作る用のサブディレクトリ
-
-
libgolibc.aを使うようにMakefileを修正IMGFILE=haribote.img IPLFILE=ipl10.asm + GOLIBCPATH=./golibc- bootpack.bin : bootpack.o hankaku.o nasmfunc.o - ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $^ + bootpack.bin : bootpack.o hankaku.o nasmfunc.o $(GOLIBCPATH)/libgolibc.a + ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $^ -static -L$(GOLIBCPATH) -lgolibc
-
bootpack.cを修正
標準ライブラリは使用していないので#include <stdio.h>を削除し、sprintf のプロトタイプ宣言を追記する。- #include <stdio.h>void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s); + int sprintf(char *s, const char *format, ...); -
再度ビルドする
ビルド成功し、書籍の通りの画面が表示された。
【参考】
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02h/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/05_day/harib02i/bootpack.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/05_day/harib02i/naskfunc.nasを参照する)
- 書籍に従って
bootpack.c分割し、graphic.cとdsctbl.cを作成する(projects/06_day/harib02a/を参照する) - 分割したソースファイルをビルドするように
Makefileを修正する。
-
書籍を参考に
Makefileを修正する
.c から .o を生成する命令をパターンルールを使って書き直した。- bootpack.o : bootpack.c - gcc -c -m32 -fno-pic -nostdlib -o $@ $^ - - graphic.o : graphic.c - gcc -c -m32 -fno-pic -nostdlib -o $@ $^ - - dsctbl.o : dsctbl.c - gcc -c -m32 -fno-pic -nostdlib -o $@ $^ - - hankaku.o : hankaku.c - gcc -c -m32 -fno-pic -nostdlib -o $@ $^ + %.o : %.c + gcc -c -m32 -fno-pic -nostdlib -o $@ $<
- 書籍に従って
bootpack.hを作成する(projects/06_day/harib03c/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/06_day/harib03c/bootpack.cを参照する) - 書籍に従って
graphic.cを修正する(projects/06_day/harib03c/graphic.cを参照する) - 書籍に従って
dsctbl.cを修正する(projects/06_day/harib03c/dsctbl.cを参照する)
メモなし。
- 書籍に従って
int.cを作成する(projects/06_day/harib03d/int.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/06_day/harib03d/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/06_day/harib03d/bootpack.cを参照する) int.cをビルドできるようにMakefileを修正する。
- 書籍に従って
int.cを修正する(projects/06_day/harib03e/int.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/06_day/harib03e/naskfunc.nasを参照する) - 書籍に従って
bootpack.hを修正する(projects/06_day/harib03e/bootpack.hを参照する) - 書籍に従って
dsctbl.cを修正する(projects/06_day/harib03e/dsctbl.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/06_day/harib03e/bootpack.cを参照する)
- 書籍に従って
int.cを修正する(projects/07_day/harib04a/int.cを参照する) bootpack.hにio_in8()のプロトタイプ宣言を追記する。golibc.hを新規作成し、sprintf()のプロトタイプ宣言を記載する。bootpack.cからsprintf()のプロトタイプ宣言を削除し、golibc.hの include 文を追記する。int.cにgolibc.hの include 文を追記する。
- 書籍に従って
int.cを修正する(projects/07_day/harib04b/int.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/07_day/harib04b/bootpack.cを参照する) bootpack.hを以下の通り修正する。io_stihlt()のプロトタイプ宣言を追記する。struct KEYBUFの定義を追記する。
- 書籍に従って
int.cを修正する(projects/07_day/harib04c/int.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/07_day/harib04c/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/07_day/harib04c/bootpack.hを参照する)
- 書籍に従って
int.cを修正する(projects/07_day/harib04d/int.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/07_day/harib04d/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/07_day/harib04d/bootpack.hを参照する)
- 書籍に従って
fifo.cを作成する(projects/07_day/harib04e/fifo.cを参照する) - 書籍に従って
int.cを修正する(projects/07_day/harib04e/int.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/07_day/harib04e/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/07_day/harib04e/bootpack.hを参照する)
- 書籍に従って
bootpack.cを修正する(projects/07_day/harib04e/bootpack.cを参照する)
- 書籍に従って
int.cを修正する(projects/07_day/harib04g/int.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/07_day/harib04g/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/08_day/harib05a/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/08_day/harib05b/bootpack.cを参照する)
-
書籍に従って
bootpack.cを修正する(projects/08_day/harib05c/bootpack.cを参照する)/* マウスの1バイト目を待っている段階 */ if ( (dat & 0xc8) == 0x08 )
mouse_decode()の 1 バイト目チェックをしているこの if 文は、 1 バイト目が次の仕様となっていることに起因する。- 下位 4 ビット : クリックの情報を表し、取り得る値は 8 ~ F。
つまり 4 ビット目は常に 1 となっている。 - 上位 4 ビット : 移動の情報を表し、取る得る値は 0 ~ 3。
つまり 7,8 ビット目は常に 0 となっている。
よって、この if 文では、「7,8 ビット目は 0 である」かつ「4 ビット目が 1 である」ことをチェックしている。
- 下位 4 ビット : クリックの情報を表し、取り得る値は 8 ~ F。
-
マイナス記号と数値の間に空白が入る
なぜかマイナス符号の位置が固定されていて、mdec.x, mdec.y が負のときに符号と数字の間に空白が入るのが気になる。
表示内容に問題はないのでとりあえず先に進む。
- 書籍に従って
bootpack.cを修正する(projects/08_day/harib05d/bootpack.cを参照する)
メモなし。
- 書籍に従って
bootpack.cを修正する(projects/09_day/harib06a/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/09_day/harib06a/bootpack.hを参照する) - 書籍に従って
int.cを修正する(projects/09_day/harib06a/int.cを参照する) - 書籍に従って
keyboard.cを作成する(projects/09_day/harib06a/keyboard.cを参照する) - 書籍に従って
mouse.cを作成する(projects/09_day/harib06a/mouse.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/09_day/harib06b/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/09_day/harib06b/bootpack.hを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/09_day/harib06b/naskfunc.nasを参照する) - haribote.img を実行した結果、書籍と異なり"memory 128MB" と表示された。
書籍によると"32MB"というのは qemu の設定のよるとのこと。 qemu コマンドのオプション を見てみると、128MB がデフォルト値とわかった。img 起動スクリプトを以下の通り書き換えたところ、"32MB"と表示された。-m [size=]megs[,slots=n,maxmem=size] Sets guest startup RAM size to megs megabytes. Default is 128 MiB. (以下略)書籍の "32MB じゃなくて 3072MB だって?" になっていないが、書籍とは環境が異なるので気にしないでおく。- "C:\Program Files\qemu\qemu-system-i386.exe" -fda "\\wsl$\Ubuntu-20.04\PATH_TO_IMG\haribote.img" + "C:\Program Files\qemu\qemu-system-i386.exe" -fda -m 32M \\wsl$\Ubuntu-20.04\PATH_TO_IMG\haribote.img"
- 書籍に従って
bootpack.cを修正する(projects/09_day/harib06c/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/09_day/harib06c/bootpack.hを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/09_day/harib06c/naskfunc.nasを参照する)
- 書籍に従って
bootpack.cを修正する(projects/09_day/harib06d/bootpack.cを参照する)
HariMain()中の 2 回 memman_free()している箇所は、それぞれ 0x9e000(632KB) と memtotal(32MB) - 0x400000(4MB) = 28MB 分の解放なので、合わせて 632KB + 28MB(=28,672KB) = 29,304KB となる。
- 書籍に従って
bootpack.cを修正する(projects/10_day/harib07a/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/10_day/harib07a/bootpack.hを参照する) - 書籍に従って
memory.cを作成する(projects/10_day/harib07a/memory.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/10_day/harib07b/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/10_day/harib07b/bootpack.hを参照する) - 書籍に従って
sheet.cを作成する(projects/10_day/harib07b/sheet.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/10_day/harib07c/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/10_day/harib07c/bootpack.hを参照する) - 書籍に従って
sheet.cを修正する(projects/10_day/harib07c/sheet.cを参照する)
- 書籍に従って
sheet.cを修正する(projects/10_day/harib07d/sheet.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/11_day/harib08a/bootpack.cを参照する)
(マウスが画面外に出ると誤動作する状態)
- 書籍に従って
sheet.cを修正する(projects/11_day/harib08b/sheet.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/11_day/harib08c/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/11_day/harib08c/bootpack.hを参照する) - 書籍に従って
sheet.cを修正する(projects/11_day/harib08c/sheet.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/11_day/harib08d/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/11_day/harib08e/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/11_day/harib08f/bootpack.cを参照する)
- 書籍に従って
sheet.cを修正する(projects/11_day/harib08g/sheet.cを参照する)- 書籍と実装差異があったので合わせて修正
- 書籍に従って
bootpack.hを修正する(projects/11_day/harib08h/bootpack.hを参照する) - 書籍に従って
sheet.cを修正する(projects/11_day/harib08h/sheet.cを参照する)
- 書籍に従って
timer.cを作成する(projects/12_day/harib09a/timer.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/12_day/harib09a/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/12_day/harib09a/bootpack.hを参照する) - 書籍に従って
dsctbl.cを修正する(projects/12_day/harib09a/dsctbl.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/12_day/harib09a/naskfunk.nasを参照する)
- 書籍に従って
timer.cを修正する(projects/12_day/harib09b/timer.cを修正する) - 書籍に従って
bootpack.cを修正する(projects/12_day/harib09b/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/12_day/harib09b/bootpack.hを参照する)
- 書籍に従って
timer.cを修正する(projects/12_day/harib09c/timer.cを修正する) - 書籍に従って
bootpack.cを修正する(projects/12_day/harib09c/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/12_day/harib09c/bootpack.hを参照する)
- 書籍に従って
timer.cを修正する(projects/12_day/harib09d/timer.cを修正する) - 書籍に従って
bootpack.cを修正する(projects/12_day/harib09d/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/12_day/harib09d/bootpack.hを参照する)
- 書籍に従って
timer.cを修正する(projects/12_day/harib09e/timer.cを修正する)
- 書籍に従って
timer.cを修正する(projects/12_day/harib09f/timer.cを修正する) - 書籍に従って
bootpack.hを修正する(projects/12_day/harib09f/bootpack.hを参照する)
- 書籍に従って
timer.cを修正する(projects/12_day/harib09g/timer.cを修正する) - 書籍に従って
bootpack.hを修正する(projects/12_day/harib09g/bootpack.hを参照する)
- 書籍に従って
bootpack.cを修正する(projects/13_day/harib10a/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/13_day/harib10b/bootpack.cを参照する)
-
harib10c
-
書籍に従って
bootpack.cを修正する(projects/13_day/harib10c/bootpack.cを参照する) -
count++の後にsheet_refresh()を追記する(引数は、ここに元々書かれていたputfonts8_asc_sht()の引数に従っている)
この処理を入れなかった場合に、OS の動作がすごく遅くなった (マウスがほとんど動かない、点滅カーソル・3 秒・10 秒の表示がされない など)
原因は分かっていないが、IC/PIT もしくは CPU クロック数に原因があると推測
と書かれている ページ があった。
while (1) { count++; + /* ダミーのリフレッシュ処理 */ + sheet_refresh(sht_win, 40, 28, 40 + 10 * 8, 28 + 16); io_cli();-
測定結果(QEMU) : 平均値 211440
結構なばらつきがあるが、環境要因と思うため気にしない。N 回目 count 値 1 219636 2 192873 3 223634 4 222305 5 198756
-
-
-
harib10d (harib10c + harib09d の timer.c と bootpack.h)
-
測定結果(QEMU) : 平均値 213123
N 回目 count 値 1 217481 2 192920 3 220429 4 220199 5 214589
-
-
harib10e (harib10c + harib09e の timer.c と bootpack.h)
-
測定結果(QEMU) : 平均値 220916
N 回目 count 値 1 224573 2 223295 3 216160 4 221558 5 218998
-
-
harib10f (harib10c + harib09f の timer.c と bootpack.h)
-
測定結果(QEMU) : 平均値 199679
N 回目 count 値 1 197998 2 223111 3 222290 4 156962 5 198037
-
QEMU 上で測定したためばらつきが大きく、性能が上がったとは言えない測定結果となった。
【参考】
- 書籍に従って
bootpack.hを修正する(projects/13_day/harib10g/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/13_day/harib10g/bootpack.cを参照する) - 書籍に従って
fifo.cを修正する(projects/13_day/harib10g/fifo.cを参照する) - 書籍に従って
keyboard.cを修正する(projects/13_day/harib10g/keyboard.cを参照する) - 書籍に従って
mouse.cを修正する(projects/13_day/harib10g/mouse.cを参照する) - 書籍に従って
timer.cを修正する(projects/13_day/harib10g/timer.cを参照する)
測定結果(QEMU) : 平均値 214835
| N 回目 | count 値 |
|---|---|
| 1 | 217260 |
| 2 | 219412 |
| 3 | 218822 |
| 4 | 200946 |
| 5 | 217737 |
- 書籍に従って
bootpack.hを修正する(projects/13_day/harib10h/bootpack.hを参照する) - 書籍に従って
timer.cを修正する(projects/13_day/harib10h/timer.cを参照する)
- 書籍に従って
bootpack.hを修正する(projects/13_day/harib10i/bootpack.hを参照する) - 書籍に従って
timer.cを修正する(projects/13_day/harib10i/timer.cを参照する)
割愛
- 書籍に従って
asmhead.asmを修正する(projects/14_day/harib11d/asmhead.nasを参照する)- グラフィックバッファの開始番地変更
グラフィックバッファの開始番地を0xe0000000としたら、画面が真っ黒になった。 「30 日でできる! OS 自作入門」を Mac 向けに環境構築する を参考に 開始番地を0xfd000000としたら、画面が表示された。
(640x480 のグラフィックを使うときのバッファの開始番地が書籍の環境と違ったのだろう・・・程度の理解。なぜ 0xfd000000 かは確認できていない。)
- グラフィックバッファの開始番地変更
【参考】
- 書籍に従って
asmhead.asmを修正する(projects/14_day/harib11e/asmhead.nasを参照する)- グラフィックバッファの開始番地確認
HariMain()でbinfo-vramの値を画面に出力したところ、0xfd000000となっていることが確認できた。
- グラフィックバッファの開始番地確認
- 書籍に従って
bootpack.cを修正する(projects/14_day/harib11f/bootpack.cを参照する) - harib10c で入れていたダミーのリフレッシュ処理を削除する
- 書籍に従って
bootpack.cを修正する(projects/14_day/harib11g/bootpack.cを参照する)
書籍に書いてある"「@」等のキーを押すと「W」が表示されて・・・" の現象は起きなかった(「@」を押すと「@」が表示された)
- 書籍に従って
bootpack.cを修正する(projects/14_day/harib11h/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/14_day/harib11i/bootpack.cを参照する)
- 書籍に従って
nasmfunc.asmを修正する(projects/15_day/harib12a/naskfunc.nasを参照する) - 書籍に従って
bootpack.hを修正する(projects/15_day/harib12a/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/15_day/harib12a/bootpack.cを参照する)
- 書籍に従って
nasmfunc.asmを修正する(projects/15_day/harib12b/naskfunc.nasを参照する) - 書籍に従って
bootpack.hを修正する(projects/15_day/harib12b/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/15_day/harib12b/bootpack.cを参照する)
- 書籍に従って
nasmfunc.asmを修正する(projects/15_day/harib12c/naskfunc.nasを参照する) - 書籍に従って
bootpack.hを修正する(projects/15_day/harib12c/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/15_day/harib12c/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/15_day/harib12d/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/15_day/harib12e/bootpack.cを参照する)task_b_main()にダミーのリフレッシュ処理を追加。
while(1) { count++; putfonts8_asc_sht(sht_back, 0, 144, COL8_FFFFFF, COL8_008484, " ", 1); /* ダミーのリフレッシュ処理 */ io_cli(); if (fifo32_status(&fifo) == 0) { io_sti(); }
fifo32_status()が 0 のときにio_stihlt()を呼ぶ場合は問題ないが、io_sti()だとカウンタ等が描画されなくなる。 この場合は上記のようにダミーのリフレッシュ処理を入れることで解決。
(harib10c の減少と同じなのかな?)
- 書籍に従って
bootpack.cを修正する(projects/15_day/harib12f/bootpack.cを参照する)
- 書籍に従って
mtask.cを新規作成する(projects/15_day/harib12g/mtask.cを参照する) - 書籍に従って
timer.cを修正する(projects/15_day/harib12g/timer.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/15_day/harib12g/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/15_day/harib12g/bootpack.cを参照する)
- 書籍に従って
mtask.cを修正する(projects/16_day/harib13a/mtask.cを参照する) - 書籍に従って
timer.cを修正する(projects/16_day/harib13a/timer.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/16_day/harib13a/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/16_day/harib13a/bootpack.cを参照する)
- 書籍に従って
bootpack.hを修正する(projects/16_day/harib13b/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/16_day/harib13b/bootpack.cを参照する) - 書籍に従って
mtask.cを修正する(projects/16_day/harib13b/mtask.cを参照する) - 書籍に従って
fifo.cを修正する(projects/16_day/harib13b/fifo.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/16_day/harib13c/bootpack.cを参照する) - マウスの動きがカクカクして遅くなったが、 harib13e 修正されるようなのでここでは気にしない。
(harib10c での現象と同じものと思われる。)
- 書籍に従って
bootpack.hを修正する(projects/16_day/harib13d/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/16_day/harib13d/bootpack.cを参照する) - 書籍に従って
mtask.cを修正する(projects/16_day/harib13d/mtask.cを参照する) - 書籍に従って
fifo.cを修正する(projects/16_day/harib13d/fifo.cを参照する)
- 書籍に従って
bootpack.hを修正する(projects/16_day/harib13e/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/16_day/harib13e/bootpack.cを参照する) - 書籍に従って
mtask.cを修正する(projects/16_day/harib13e/mtask.cを参照する) - 書籍に従って
fifo.cを修正する(projects/16_day/harib13e/fifo.cを参照する) - マウスの動きカクカクが解消されずだが、harib10c で参照したページに
言及されていた。
ダミーのリフレッシュとして task_b_main() の for 文で毎回、空白文字を描く処理を追加 (カウンタ値はとても小さくなった)while(1) { count++; + putfonts8_asc_sht(sht_win_b, 24, 28, COL8_000000, COL8_C6C6C6, " ", 1); io_cli();
【参考】
- 書籍に従って
mtask.cを修正する(projects/17_day/harib14a/mtask.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/17_day/harib14a/bootpack.cを参照する)
- 書籍に従って
bootpack.hを修正する(projects/17_day/harib14b/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/17_day/harib14b/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/17_day/harib14c/bootpack.cを参照する)
- 書籍に従って
bootpack.hを修正する(projects/17_day/harib14d/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/17_day/harib14d/bootpack.cを参照する)
- 書籍に従って
bootpack.hを修正する(projects/17_day/harib14e/bootpack.hを参照する) - 書籍に従って
bootpack.cを修正する(projects/17_day/harib14e/bootpack.cを参照する) - 右 Shift キーが効いていないようだ。左 Shift キーでは記号が打てるが、右 Shift キーでは記号が打てない。
右 Shift キー押下時の
fifo32_get(&fifo)の値を確認したが、何も表示されなかった(右 Shift はデータが来ていない?)
(左 Shift で記号打てるのでいったん気にしない)
- 書籍に従って
bootpack.cを修正する(projects/17_day/harib14f/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/17_day/harib14g/bootpack.cを参照する) - 使っている環境のせいなのか、CapsLock/NumLock/ScrollLock のキーコードが書籍の記載と一致していないため、 プログラムは書いたものの正しく動作しているかわからない。
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15a/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15b/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15c/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15d/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15e/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15f/bootpack.cを参照する) golibc.hにstrcmp()のプロトタイプ宣言を記載する。
- 書籍に従って
bootpack.cを修正する(projects/18_day/harib15g/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/18_day/harib15g/bootpack.hを参照する) - 書籍を参考に
Makefileを修正する(projects/18_day/harib15g/bootpack.cを参考にする)
dir コマンドのファイル名出力のため、haribote.imgにipl10.asm,Makefileを含めるように修正。$(IMGFILE) : ipl10.bin haribote.sys mformat -f 1440 -B ipl10.bin -C -i $@ :: mcopy haribote.sys -i $@ :: + mcopy ipl10.asm -i $@ :: + mcopy Makefile -i $@ ::
- 書籍に従って
bootpack.cを修正する(projects/19_day/harib16a/bootpack.cを参照する)
-
書籍に従って
bootpack.cを修正する(projects/19_day/harib16b/bootpack.cを参照する) -
golibc.hを修正するstrncmp()のプロトタイプ宣言を記載する。size_t型定義を使うためにstddef.hを include する。
+ #include <stddef.h> int sprintf(char *s, const char *format, ...); int strcmp (const char *d, const char *s); + int strncmp (char *d, const char *s, size_t sz);
-
ファイル出力後に 1 行ズラすように追加修正
出力ファイルの最終行に空行がない場合に、プロンプト表示がファイル最終行と同じ行に表示されるため。else { putfonts8_asc_sht(sheet, cursor_x, cursor_y, COL8_FFFFFF, COL8_000000, s, 1); cursor_x += 8; if (cursor_x == 8 + 240) /* 右端まで来たので改行 */ { cursor_x = 8; cursor_y = cons_newline(cursor_y, sheet); } } } + cursor_y = cons_newline(cursor_y, sheet); /* ファイルの出力が終わったらプロンプト表示の前に1行ずらす */ } else { /* ファイルが見つからなかった場合 */
- 書籍に従って
bootpack.cを修正する(projects/19_day/harib16c/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/19_day/harib16d/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/19_day/harib16d/bootpack.hを参照する) - 書籍に従って
window.cを新規作成する(projects/19_day/harib16d/window.cを参照する) - 書籍に従って
file.cを新規作成する(projects/19_day/harib16d/file.cを参照する) - 書籍に従って
console.cを新規作成する(projects/19_day/harib16d/console.cを参照する)
- 書籍に従って
console.cを修正する(projects/19_day/harib16e/console.cを参照する) - 書籍に従って
hlt.asmを新規作成する(projects/19_day/harib16d/hlt.nasを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/20_day/harib17a/console.cを参照する) - 書籍に従って
file.cを修正する(projects/20_day/harib17a/file.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/20_day/harib17a/bootpack.hを参照する)
- 書籍に従って
hlt.asmを修正する(projects/20_day/harib17b/hlt.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/20_day/harib17b/naskfunc.nasを参照する) - 書籍に従って
console.cを修正する(projects/20_day/harib17b/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/20_day/harib17b/bootpack.hを参照する)
- 書籍に従って
hlt.asmを修正する(projects/20_day/harib17c/hlt.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/20_day/harib17c/naskfunc.nasを参照する) Makefileを修正する
bootpack.bin生成時にマップファイルも生成するようにオプションを追加する。hlt.asmに書く asm_cons_putchar のアドレスはbootpack.mapを見て確認する。bootpack.bin : $(OBJS) $(GOLIBCPATH)/libgolibc.a - ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $(OBJS) -static -L$(GOLIBCPATH) -lgolibc + ld -m elf_i386 -e HariMain -o $@ -T hrb.ld $(OBJS) -static -L$(GOLIBCPATH) -lgolibc -Map bootpack.map
- 書籍に従って
hlt.asmを修正する(projects/20_day/harib17d/hlt.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/20_day/harib17d/naskfunc.nasを参照する) - 書籍に従って
console.cを修正する(projects/20_day/harib17d/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/20_day/harib17d/bootpack.hを参照する)
- 書籍に従って
dsctbl.cを修正する(projects/20_day/harib17e/dsctbl.cを参照する) - 書籍に従って
hlt.asmを修正する(projects/20_day/harib17e/hlt.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/20_day/harib17e/naskfunc.nasを参照する)
- 書籍に従って
console.cを修正する(projects/20_day/harib17f/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/20_day/harib17f/bootpack.hを参照する) - 書籍に従って
hlt.asmをhello.asmにリネームする
伴って、Makefileを修正する
- 書籍に従って
hello.asmを修正する(projects/20_day/harib17g/hello.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/20_day/harib17g/naskfunc.nasを参照する)
- 書籍に従って
console.cを修正する(projects/20_day/harib17h/console.cを参照する) - 書籍に従って
dsctbl.cを修正する(projects/20_day/harib17h/dsctbl.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/20_day/harib17h/bootpack.hを参照する) - 書籍に従って
hello.asmを修正する(projects/20_day/harib17h/hello.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/20_day/harib17h/naskfunc.nasを参照する) - 書籍に従って
hello2.asmを新規作成する(projects/20_day/harib17h/hello2.nasを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/21_day/harib18a/console.cを参照する)
- 書籍に従って
console.cを修正する(projects/21_day/harib18b/console.cを参照する) - 書籍に従って
a_nasm.asmを新規作成する(projects/21_day/harib18b/a_nask.nasを参照する) - 書籍に従って
a.cを新規作成する(projects/21_day/harib18b/a.cを参照する) - 書籍に従って
hello3.cを新規作成する(projects/21_day/harib18b/hello3.cを参照する) - アプリケーション用のリンカスクリプト
app.ldを作成する
このページの "アプリケーション用リンカスクリプト" を作成する。app.ldは ld コマンドで a.hrb, hello3.hrb を生成するときに使用する。 - アプリ関連のファイルを app ディレクトリ内に移動する
Makefileを修正する
【参考】
- 書籍に従って
crack1.cを新規作成する(projects/21_day/harib18c/crack1.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/21_day/harib18d/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/21_day/harib18d/bootpack.hを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/21_day/harib18d/naskfunc.nasを参照する)
start_app の最後の POPAD を POPD と書き間違えていたことに気づかず、しばらくハマった(上手くいかない原因の 8 ~ 9 割が書き間違いだなあ)。 書き間違えた状態で haribote.img を生成し、 各種コマンドを実行すると以下のような挙動になった。 (退避したレジスタの値を正しく復元できていないはずだから、挙動が変になるのは納得)- hello コマンド : 画面の色が変化(ネガポジ反転みたいになる)
- hello2 コマンド : ウィンドウ・コンソール内の表示が初期状態に戻りフリーズ
- hello3 コマンド : ウィンドウ・コンソール内の表示が初期状態に戻りフリーズ
- a コマンド : "A" と表示されるが、すぐにウィンドウ・コンソール内の表示が初期状態に戻りフリーズ
- crack1 コマンド : ウィンドウ・コンソール内の表示が初期状態に戻りフリーズ
- 書籍に従って
console.cを修正する(projects/21_day/harib18e/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/21_day/harib18e/bootpack.hを参照する) - 書籍に従って
dsctbl.cを修正する(projects/21_day/harib18e/dsctbl.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/21_day/harib18e/naskfunc.nasを参照する)
- 書籍に従って
crack2.cを新規作成する(projects/21_day/harib18f/crack2.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/21_day/harib18g/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/21_day/harib18g/bootpack.hを参照する) - 書籍に従って
dsctbl.cを修正する(projects/21_day/harib18g/dsctbl.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/21_day/harib18g/naskfunc.nasを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/21_day/harib18g/a_nask.nasを参照する) - 書籍に従って
hello.asmを修正する(projects/21_day/harib18g/hello.nasを参照する) - 書籍に従って
hello2.asmを修正する(projects/21_day/harib18g/hello2.nasを参照する) - 書籍に従って
a.cを修正する(projects/21_day/harib18g/a.cを参照する) - 書籍に従って
hello3.cを修正する(projects/21_day/harib18g/hello3.cを参照する) - 書籍に従って
crack1.cを修正する(projects/21_day/harib18g/crack1.cを参照する) - 書籍に従って
crack2.asmを修正する(projects/21_day/harib18g/hello2.nasを参照する)
- 書籍に従って
console.cを修正する(projects/22_day/harib19a/console.cを参照する) - 書籍に従って
crack3.asmを新規作成する(projects/22_day/harib19a/crack3.nasを参照する) - 書籍に従って
crack4.asmを新規作成する(projects/22_day/harib19a/crack4.nasを参照する) - 書籍に従って
crack5.asmを新規作成する(projects/22_day/harib19a/crack5.nasを参照する) - 書籍に従って
crack6.asmを新規作成する(projects/22_day/harib19a/crack6.nasを参照する) Makefileを修正する
- 書籍に従って
bootpack.hを修正する(projects/22_day/harib19b/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/22_day/harib19b/console.cを参照する) - 書籍に従って
dsctbl.cを修正する(projects/22_day/harib19b/dsctbl.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/22_day/harib19b/naskfunc.nasを参照する) - 書籍に従って
bug1.cを新規作成する(projects/22_day/harib19b/bug1.cを参照する) - crack1 ~ crack6 のファイルを削除する
Makefileを修正する
- 書籍に従って
bootpack.cを修正する(projects/22_day/harib19c/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/22_day/harib19c/bootpack.hを参照する) - 書籍に従って
mtask.cを修正する(projects/22_day/harib19c/mtask.cを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/22_day/harib19c/naskfunc.nasを参照する) - 書籍に従って
bug2.cを新規作成する(projects/22_day/harib19c/bug2.cを参照する) - 書籍に従って
bug3.cを新規作成する(projects/22_day/harib19c/bug3.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/22_day/harib19d/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/22_day/harib19d/a_nask.nasを参照する) - 書籍に従って
hello4.cを新規作成する(projects/22_day/harib19c/hello4.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/22_day/harib19e/console.cを参照する) - 書籍に従って
hello5.asmを新規作成する(projects/22_day/harib19e/hello5.nasを参照する) Makefileを修正する
- 書籍に従って
bootpack.cを修正する(projects/22_day/harib19f/bootpack.cを参照する) - 書籍に従って
console.cを修正する(projects/22_day/harib19f/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/22_day/harib19f/a_nask.nasを参照する) - 書籍に従って
winhelo.cを新規作成する(projects/22_day/harib19f/winhelo.cを参照する)
- 書籍に従って
console.cを修正する(projects/22_day/harib19g/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/22_day/harib19g/a_nask.nasを参照する) - 書籍に従って
winhelo2.cを新規作成する(projects/22_day/harib19g/winhelo2.cを参照する) - bug1 ~ bug3 のファイルを削除する
Makefileを修正する
- 書籍に従って
console.cを修正する(projects/23_day/harib20a/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/23_day/harib20a/a_nask.nasを参照する) - 書籍に従って
winhelo3.cを新規作成する(projects/23_day/harib20a/winhelo3.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/23_day/harib20b/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/23_day/harib20b/a_nask.nasを参照する) - 書籍に従って
star1.cを新規作成する(projects/23_day/harib20b/star1.cを参照する) - 書籍に従って
stars.cを新規作成する(projects/23_day/harib20b/stars.cを参照する) golibc.aに rand 関数を含めて再生成Makefileを修正する
- 書籍に従って
console.cを修正する(projects/23_day/harib20c/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/23_day/harib20c/a_nask.nasを参照する) - 書籍に従って
stars2.cを新規作成する(projects/23_day/harib20c/stars2.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/23_day/harib20d/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/23_day/harib20d/bootpack.hを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/23_day/harib20d/a_nask.nasを参照する) - 書籍に従って
lines.cを新規作成する(projects/23_day/harib20d/lines.cを参照する) Makefileを修正する
- 書籍に従って
console.cを修正する(projects/23_day/harib20e/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/23_day/harib20e/a_nask.nasを参照する) - 書籍に従って
lines.cを修正する(projects/23_day/harib20e/lines.cを参照する)
- 書籍に従って
console.cを修正する(projects/23_day/harib20f/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/23_day/harib20f/bootpack.hを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/23_day/harib20f/a_nask.nasを参照する) - 書籍に従って
lines.cを修正する(projects/23_day/harib20f/lines.cを参照する)
- 書籍に従って
walk.cを新規作成する(projects/23_day/harib20g/walk.cを参照する) Makefileを修正する
- 書籍に従って
sheet.cを修正する(projects/23_day/harib20h/sheet.cを参照する) - 書籍に従って
console.cを修正する(projects/23_day/harib20h/console.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/23_day/harib20h/bootpack.hを参照する)
- 書籍に従って
bootpack.cを修正する(projects/24_day/harib21a/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/24_day/harib21b/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/24_day/harib21c/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/24_day/harib21d/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/24_day/harib21e/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/24_day/harib21e/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/24_day/harib21e/console.cを参照する) - 書籍に従って
window.cを修正する(projects/24_day/harib21e/window.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/24_day/harib21f/bootpack.cを参照する)
-
書籍に従って
console.cを修正する(projects/24_day/harib21g/console.cを参照する) -
書籍に従って
a_nasm.asmを修正する(projects/24_day/harib21g/a_nask.nasを参照する) -
書籍に従って
noodle.cを新規作成する(projects/24_day/harib21g/noodle.cを参照する) -
Makefileを修正する -
app.ldを修正する
ld コマンドでnoodle.hrbを生成しようとしたところ、下記エラーが発生した。ld -m elf_i386 -e HariMain -o noodle.hrb -T app.ld noodle.o a_nasm.o -static -L../golibc -lgolibc -Map noodle.map ld: section .data VMA [0000000000000400,0000000000000434] overlaps section .text VMA [0000000000000030,00000000000009da].data セクションが .text セクションに重なっているとのこと(.data セクションは 0x400 から開始となっているが、.text セクションが 0x9da まで来ている)。
noodle.hrbのメモリマップ(ld コマンド時にnoodle.mapとして生成)は以下の通り。.text 0x0000000000000030 0x9ab *(.text) .text 0x0000000000000030 0x11c noodle.o 0x0000000000000030 HariMain (中略) .text 0x00000000000002ee 0x2d ../golibc/libgolibc.a(sprintf.o) 0x00000000000002ee sprintf .text 0x000000000000031b 0x4f4 ../golibc/libgolibc.a(vsprintf.o) 0x0000000000000369 vsprintf .text 0x000000000000080f 0x28 ../golibc/libgolibc.a(strlen.o) 0x000000000000080f strlen .text 0x0000000000000837 0x1a4 ../golibc/libgolibc.a(strtoul0.o) 0x0000000000000883 strtoul0 (golibcのプログラムで 0x400 を大幅に超えてしまっている) (.data セクションは 0x400 から開始しようとしている↓) .data 0x0000000000000400 0x35 load address 0x00000000000009db *(.data) .data 0x0000000000000400 0x0 noodle.o .data 0x0000000000000400 0x0 ../golibc/libgolibc.a(sprintf.o) .data 0x0000000000000400 0x20 ../golibc/libgolibc.a(vsprintf.o) .data 0x0000000000000420 0x0 ../golibc/libgolibc.a(strlen.o) .data 0x0000000000000420 0x0 ../golibc/libgolibc.a(strtoul0.o).text セクションが 0x9da まできているため、 .data セクション開始が 0x1000 となるように
app.ldを書き換えてエラー回避した。
- 書籍に従って
bootpack.hを修正する(projects/24_day/harib21h/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/24_day/harib21h/console.cを参照する) - 書籍に従って
timer.cを修正する(projects/24_day/harib21h/timer.cを参照する)
- 書籍に従って
console.cを修正する(projects/25_day/harib22a/console.cを参照する) - 書籍に従って
a_nasm.asmを修正する(projects/25_day/harib22a/a_nask.nasを参照する) - 書籍に従って
beepdown.cを新規作成する(projects/25_day/harib22a/beepdown.cを参照する)
- 書籍に従って
graphic.cを修正する(projects/25_day/harib22b/graphic.cを参照する) - 書籍に従って
color.cを新規作成する(projects/25_day/harib22b/color.cを参照する)
- 書籍に従って
color2.cを新規作成する(projects/25_day/harib22c/color2.cを参照する)
- 書籍に従って
console.cを修正する(projects/25_day/harib22d/console.cを参照する)
-
書籍に従って
bootpack.cを修正する(projects/25_day/harib22e/bootpack.cを参照する) -
画面は表示されるが、一般保護例外(0x0D)が発生し、フリーズ状態になる(マウス・キーボードが効かない)
結論を言うと、mtask.cの下記箇所を書き間違えていた。void task_remove(struct TASK *task) { (中略) /* ずらし */ for (; i < tl->running; i++) { - tl->tasks[i] = tl->tasks[i + i]; + tl->tasks[i] = tl->tasks[i + 1]; } return; }一般保護例外発生時に inthandler0d() に渡された値
esp[11] (EIP)およびesp[14] (ESP)の値は以下のようになっていた。esp[11] (EIP) : 0x5803 esp[14] (EIP) : 0x1AC7bootpack.mapの該当箇所は以下の通り。0x0000000000001ace task_switch .text 0x0000000000001ba1 0x276 dsctbl.o (中略) 0x0000000000005803 farjmpこれにより、
- farjmp しようとして例外が発生していること
- task_switch 処理中にあったこと
がわかった。 task_switch 時に不正な場所にアクセスしてしまった模様。
上記の書き間違いと合わせると、task のずらし処理が正しく動いていなかったために、不正な task 情報を使って task_switch を行い、一般保護例外(0x0D)が発生したと思われる。
- 書籍に従って
bootpack.hを修正する(projects/25_day/harib22f/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/25_day/harib22f/console.cを参照する) - 書籍では言及がないが、以下ファイルにも差分があったため修正する。
- 書籍に従って
asmhead.asmを修正する(projects/25_day/harib22f/asmhead.nasを参照する) - 書籍に従って
bootpack.cを修正する(projects/25_day/harib22f/bootpack.cを参照する) - 書籍に従って
dsctbl.cを修正する(projects/25_day/harib22f/dsctbl.cを参照する) - 書籍に従って
file.cを修正する(projects/25_day/harib22f/file.cを参照する) - 書籍に従って
int.cを修正する(projects/25_day/harib22f/int.cを参照する) - 書籍に従って
ipl10.asmを修正する(projects/25_day/harib22f/asmhead.nasを参照する) - 書籍に従って
nasmfunc.asmを修正する(projects/25_day/harib22f/naskfunc.nasを参照する)
- 書籍に従って
- 書籍に従って
console.cを修正する(projects/25_day/harib22g/console.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/25_day/harib22h/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/25_day/harib22i/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/25_day/harib22j/bootpack.cを参照する) - 書籍に従って
console.cを修正する(projects/25_day/harib22j/console.cを参照する)
- 書籍に従って
sheet.cを修正する(projects/26_day/harib23a/sheet.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23b/bootpack.cを参照する) - 書籍に従って
console.cを修正する(projects/26_day/harib23b/console.cを参照する) - 書籍に従って
sheet.cを修正する(projects/26_day/harib23b/sheet.cを参照する)
- 書籍に従って
sheet.cを修正する(projects/26_day/harib23c/sheet.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23d/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23e/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23f/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23g/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/26_day/harib23g/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/26_day/harib23g/console.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23h/bootpack.cを参照する) - 書籍に従って
console.cを修正する(projects/26_day/harib23h/console.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23i/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/26_day/harib23i/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/26_day/harib23i/console.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/26_day/harib23j/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/26_day/harib23j/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/26_day/harib23j/console.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/27_day/harib24a/bootpack.cを参照する)
- 書籍に従って
bootpack.cを修正する(projects/27_day/harib24b/bootpack.cを参照する) - 書籍に従って
console.cを修正する(projects/27_day/harib24b/console.cを参照する)
- 書籍に従って
crack7.asmを新規作成する(projects/27_day/harib24c/crack7.asmを参照する) Makefileを修正する
- 書籍に従って
bootpack.hを修正する(projects/27_day/harib24d/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/27_day/harib24d/console.cを参照する) - 書籍に従って
mtask.cを修正する(projects/27_day/harib24d/mtask.cを参照する)
a_nasm.asm内の API を個別のファイルに分割し、apilib ディレクトリに移動- 書籍の環境とは違う(obj2bim)を使っていないのでアプリのサイズ削減はしない
- apilib 内の API から 静的ライブラリ
libapilib.aを生成するように修正
(当初 libapplib.a としていたが、二十八日目に libapilib.a にリネーム)
- haribote OS のソースファイルを haribote ディレクトリに移動
- 書籍に従って
winhelo.cを修正する(projects/27_day/harib24g/winhelo/winhelo.cを参照する) - 書籍に従って
winhelo2.cを修正する(projects/27_day/harib24g/winhelo2/winhelo2.cを参照する) - 書籍に従って
winhelo3.cを修正する(projects/27_day/harib24g/winhelo3/winhelo3.cを参照する) - 書籍に従って
star1.cを修正する(projects/27_day/harib24g/star1/star1.cを参照する) - 書籍に従って
stars.cを修正する(projects/27_day/harib24g/stars/stars.cを参照する) - 書籍に従って
star2.cを修正する(projects/27_day/harib24g/star2/star2.cを参照する)
- 書籍に従って
sosu.cを新規作成する(projects/28_day/harib25a/sosu.cを参照する) - 書籍に従って
sosu2.cを新規作成する(projects/28_day/harib25a/sosu2.cを参照する) - 書籍に従って
sosu3.cを新規作成する(projects/28_day/harib25a/sosu3.cを参照する) Makefileを修正する
-
書籍に従って
alloca.asmを新規作成する(projects/28_day/harib25b/apilib/alloca.nasを参照する)
alloca 関数は一応作ったが、実際は使っていない。 c ファイルをコンパイルする際に-nostdlibオプションを指定しているため alloca 関数は呼ばれないと思われる。 アプリ用のスタックサイズを十分量用意しておく必要があるため、アプリ用リンカスクリプトapp.ldのスタック初期値を修正する。.head 0x0 : { LONG(128 * 1024) /* 0 : stack+.data+heap の大きさ(4KBの倍数) */ LONG(0x69726148) /* 4 : シグネチャ "Hari" */ LONG(0) /* 8 : mmarea の大きさ(4KBの倍数) */ - LONG(0x1000) /* 12 : スタック初期値&.data転送先 */ + LONG(0x2c00) /* 12 : スタック初期値&.data転送先 */ LONG(SIZEOF(.data)) /* 16 : .dataサイズ */ LONG(LOADADDR(.data)) /* 20 : .dataの初期値列のファイル位置 */ LONG(0xE9000000) /* 24 : 0xE9000000 */ LONG(HariMain - 0x20) /* 28 : エントリアドレス - 0x20 */ LONG(24 * 1024) /* 32 : heap領域(malloc領域)開始アドレス */ } .text : { *(.text) } - .data 0x1000 : AT ( ADDR(.text) + SIZEOF(.text) ) { + .data 0x2c00 : AT ( ADDR(.text) + SIZEOF(.text) ) { *(.data) *(.rodata*) *(.bss) } -
書籍に従って
winhelo.cを修正する(projects/28_day/harib25b/winhelo/winhelo.cを参照する) -
書籍に従って
winhelo2.cを修正する(projects/28_day/harib25b/winhelo2/winhelo2.cを参照する) -
harib27f の後に修正
app.ld,Makefileを修正し、アプリ毎にスタックサイズを指定するように変更。 スタックサイズは ld コマンドの--defsymオプションを使用した。 また、指定するスタックサイズは各アプリの Makefile に指定されているSTACKの値を参考に指定した。
【参考】
- 書籍に従って
api_fopen.asmを新規作成する(projects/28_day/harib25c/apilib/api021.nasを参照する) - 書籍に従って
api_fclose.asmを新規作成する(projects/28_day/harib25c/apilib/api022.nasを参照する) - 書籍に従って
api_fseek.asmを新規作成する(projects/28_day/harib25c/apilib/api023.nasを参照する) - 書籍に従って
api_fsize.asmを新規作成する(projects/28_day/harib25c/apilib/api024.nasを参照する) - 書籍に従って
api_fread.asmを新規作成する(projects/28_day/harib25c/apilib/api025.nasを参照する) - 書籍に従って
apilib.hを修正する(projects/28_day/harib25c/apilib.hを参照する) - 書籍に従って
typeipl.cを修正する(projects/28_day/harib25c/typeipl/typeipl.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/28_day/harib25c/haribote/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/28_day/harib25c/haribote/console.cを参照する) Makefileを修正する
- 書籍に従って
api_cmdline.asmを新規作成する(projects/28_day/harib25d/apilib/api026.nasを参照する) - 書籍に従って
apilib.hを修正する(projects/28_day/harib25d/apilib.hを参照する) - 書籍に従って
type.cを新規作成する(projects/28_day/harib25d/type/type.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/28_day/harib25d/haribote/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/28_day/harib25d/haribote/console.cを参照する) Makefileを修正する
- 書籍に従って
iroha.cを新規作成する(projects/28_day/harib25e/iroha/iroha.cを参照する) - 書籍に従って
bootpack.cを修正する(projects/28_day/harib25e/haribote/bootpack.cを参照する) - 書籍に従って
bootpack.hを修正する(projects/28_day/harib25e/haribote/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/28_day/harib25e/haribote/console.cを参照する) - 書籍に従って
graphic.cを修正する(projects/28_day/harib25e/haribote/graphic.cを参照する) UTF-8 で作成しているため、 iroha コマンドは文字化け表示となるが無視しておく。
フォントのデータを char で扱っていたために正しく計算ができていなかった。 unsigned char に修正し、 iroha コマンドで半角カタカナが表示されることを確認した( harib25g の後に対応した)。
【参考】
- 書籍に従って
bootpack.hを修正する(projects/28_day/harib25f/haribote/bootpack.hを参照する) - 書籍に従って
console.cを修正する(projects/28_day/harib25f/haribote/console.cを参照する) - 書籍に従って
graphic.cを修正する(projects/28_day/harib25f/haribote/graphic.cを参照する)
- 書籍に従って
api_getlang.asmを新規作成する(projects/28_day/harib25g/apilib/api027.nasを参照する) - 書籍に従って
apilib.hを修正する(projects/28_day/harib25g/apilib.hを参照する) - 書籍に従って
chklang.cを新規作成する(projects/28_day/harib25e/chklang/chklang.cを参照する) - 書籍に従って
console.cを修正する(projects/28_day/harib25g/haribote/console.cを参照する) - 書籍に従って
graphic.cを修正する(projects/28_day/harib25g/haribote/graphic.cを参照する) - 書籍に従って
ipl20.asmを新規作成する(projects/28_day/harib25g/haribote/ipl20.asmを参照する)
(ipl10.asmを修正し、リネーム) Makefileを修正するeuc.txtと同様のjis.txtを作成した。
- 書籍に従って
window.cを修正する(projects/29_day/harib26a/haribote/window.cを参照する)
- longjmp(), setjmp() 関数がないため
tek.cをコンパイルできない。
ファイル圧縮については必須ではないため、tek.c等を導入せずに進める。
【参考】
- 必要になったら作成することにする。
- 書籍に従って
notrec.cを新規作成する(projects/29_day/harib26c/notrec/notrec.cを参照する)
透明色を 100 で指定する(255 で指定すると黒く表示された。原因は追っていない。) typeipl.cを削除する。Makefileを修正する- harib27f の後に修正
- バッファ関連の変数の型を書籍に合わせて修正した。
- HariMain() : buf_back, buf_mouse
- sheet_refreshmap() : buf, sid, map
- sheet_refreshsub() : buf, vram, map, sid
- 関数の引数の型を書籍に合わせて修正した。
- boxfill8()
- shtctl_init()
- sheet_setbuf()
- make_window8
- make_wtitle8()
- 構造体メンバの型を書籍に合わせて修正した。
- SHEET.buf
- SHTCTL.vram, SHTCTL.map
- 書籍に合わせて透明色を 255 指定に修正した。 (修正前は、char, unsigned char の違いで 255 が上手く指定できていなかったと思われる)
- バッファ関連の変数の型を書籍に合わせて修正した。
- 書籍に従って
bball.cを新規作成する(projects/29_day/harib26d/bball/bball.cを参照する) - 書籍に従って
console.cを修正する(projects/29_day/harib26d/haribote/console.cを参照する) Makefileを修正する
- 書籍に従って
invader.cを新規作成する(projects/29_day/harib26d/invader/invader.cを参照する) -
golibc.hにstrlen()のプロトタイプ宣言を記載する。
Makefileを修正する
- 書籍に従って
calc.cを新規作成する(projects/30_day/harib27a/calc/calc.cを参照する) -
golibc.hにstrtol()のプロトタイプ宣言を記載する。
Makefileを修正する
- 書籍に従って
tview.cを新規作成する(projects/30_day/harib27b/tview/tview.cを参照する) Makefileを修正するtview のウィンドウを動かすと背景の特定の場所がウィンドウの色で塗られてしまう。シートの更新処理に何か問題があるのかもしれない。
アプリのスタックサイズ不足によるものだった。アプリ毎にスタックサイズを指定するように修正した(harib25b 参照)
- 書籍に従って
mmlplay.cを新規作成する(projects/30_day/harib27c/mmlplay/mmlplay.cを参照する) - mml データは圧縮していない生データを使用した。
Makefileを修正する- img 起動スクリプトにオプション
-soundhw pcspkを追加し、QEMU から音が出るようにした。- "C:\Program Files\qemu\qemu-system-i386.exe" -m 32M -fda \\wsl$\Ubuntu-20.04\PATH_TO_IMG\haribote.img" + "C:\Program Files\qemu\qemu-system-i386.exe" -soundhw pcspk -m 32M -fda \\wsl$\Ubuntu-20.04\PATH_TO_IMG\haribote.img"
【参考】
-
書籍に従って
gview.cを新規作成する(projects/30_day/harib27d/gview/gview.cを参照する) -
書籍に従って
jpeg.cを新規作成する(projects/30_day/harib27d/gview/jpeg.cを参照する) -
CD-ROM 付属の
bmp.asmを流用する。
ただし、以下の修正を加える。[BITS 32]を削除- 関数 _info_BMP を info_BMP に修正
- 関数 _decode0_BMP を decode0_BMP に修正
- .do4.1 ラベルにコロンが抜けているため
:追記
-
非圧縮の画像データ
fujisan_.jpg,night_.bmpをそれぞれfujisan.jpg,night.bmpとして使用。 -
Makefileを修正する -
gview のウィンドウを動かすと背景の特定の場所の色が変になる。harib27b と同じような原因で、シートの更新処理に何か問題があるのかもしれない。
アプリのスタックサイズ不足によるものだった。アプリ毎にスタックサイズを指定するように修正した(harib25b 参照)
【参考】
- 書籍に従って
invader.cを修正する(projects/30_day/harib27e/invader/invader.cを参照する) - tek 圧縮等はしていないため、9 シリンダに収める修正はしない。
- メモなし。