祝 60kg台!!

69.9kg

おぉぉぉ!!!

遂に、このオーダーへ!!目指せ、65kg!!だな。

 

さて、ここ最近は十分に時間も取れていない事もあるが、

本読んで理解に苦しむフェーズばかり。。

ハードに近い話が多いので、結構、色々調べながらで時間がかかってる。。

本の中にも色々書いてある内容に加えて、下記Web下記のページも参考に

読み進める。

softwaretechnique.jp

まだ、いまいちよく分かっていないが、重要なのは

1. GDT/IDT(Global Descriptor Table/Interrupt Descriptor Table)

2. GDTR

3. IDTR

4. セグメントレジスタ

辺りの様だ。。

 

で、初めて気づいたが、このGDTってのはどうやらasmhead.nasの中にも

記載がある。。。

 

後、この辺りが自分としては、かなり頭がごちゃごちゃになっていたのだが、

セグメントレジスタの役割。(分かればシンプルなんだろうけど。。)

 

リアルモード: CS, DS, FS, ES, SSを使ってメモリアクセス

プロテクテッドモード: セグメントレジスタとGDTを使ってメモリアクセス

 

っていう違いがある。しかも、このプロテクテッドモードの動きがよく分からないで時間が掛かっていた。。。

 

まぁ、私の浅い理解は進み、当たり前の理解に徐々に近づいていってる気がする。。。

要は、セグメントレジスタが、GDT内にテーブルとして用意された各セグメントへ

のインデックスの役割をしている様で、そのテーブル内に設定されたGDT:*は64bitで

構成されており、その各ディスクリプタに対象セグメントのスタートアドレス、サイズ、

アクセス制限関係の設定等が入っているという事みたい。。。

(ここは、書く必要もないのだが、文章化する事で自分の頭を整理する理解も含まれる。。

 まぁ、備忘録的な日記なんで。。)

 

                                   GDT                                 Memory

        +---------+                     +----------------+ 

Seg-reg                   GDT: 0 ----------->   |   Segment: 0     |

  (index)                                                      +---------------+

         |                       GDT: 1------------>   |   Segment: 1

         |                           ‥                               |                        

         |                           ‥                              +---------------+

         |                         ‥                  

         |                                                           +---------------+

         +---------->  GDT: n  ----------->  |   Segment: n         

                                                                     +---------------+ 

                                                                      

後は、実際のプログラム上のアドレスが、このセグメント内のオフセットとして使われる事

で、アドレス変換が行われているという事らしい。。(ふむ。中々整理が難しい。。)

このGDTの先頭情報を取得する為に、GDTRにこのGDTを配置したセグメントディスクリプタテーブルの先頭アドレスとそのサイズ(リミット値)をLGDTコマンドにて48bitの形で渡す。

 

ここは、asmhead.nasの下にある部分を、ちょっとだけ手を加えた部分が

個人的には分かりやすかったので、参考までに載せておく。

(dsctbl.cで行われているものと同じ内容だと思うが、アセンブラの方が

 より直接的で、個人的には理解するのに役立った。。)

 

        ALIGNB  16, DB 0                        ; NASMでは警告が出るので修正

GDT0:

        TIMES   8 DB 0                          ; NASMでは警告が出るので修正

        DW      0xffff,0x0000,0x9200,0x00cf     ; 読み書き可能セグメント32bit

        DW      0xffff,0x0000,0x9a28,0x0047     ; 実行可能セグメント32bit(bootpack用)

        DW      0

.gdt_end:

 

GDTR0:

        DW      GDT0.gdt_end - GDT0 - 1 ; 上のSegment DT のリミット値(要するにサイズ)

        DD      GDT0    ; ディスクリプタテーブルのアドレス

 

        ALIGNB  16, DB 0        ; NASMでは警告が出るので修正

 

上記コードとは別の場所で、LDGTコマンドを実行する事でGDTRに

セグメントディスクリプタテーブルのベースアドレスとリミット値が設定され、

後は、セグメントレジスタ経由で各セグメントへアクセス可能となる。

 

        LGDT    [GDTR0]         ; 暫定GDTを設定

 

 まぁ、詳細は上にあげた参考にさせて頂いている先人様のページにある通りだが、

やはり自分の理解力の低さが悲しい。。。(時間かかり過ぎ。。)

 

 同様に、IDTも同様の感じの様ですな。。。

 

一先ず、なんとなく、GDT/IDT周りのこのが理解できてきた。。。

 

しかし、一緒に参考にしている下記の本も参照しながらで随分助かっているのだが、

こちらはこちらで全編アセンブラで記述されているという優れもの。。。

両作者共に素晴らしいですな。

こんな私にも、OS理解へのチャンスを与えてくれる本。

本当に素晴らしいです。。。(感謝しかありません。後は、継続する自分の意思のみ)

ただ、常人ではありませんな。。。

 

作って理解するOS  x86系コンピュータを動かす理論と実装

作って理解するOS x86系コンピュータを動かす理論と実装

  • 作者:林 高勲
  • 発売日: 2019/09/26
  • メディア: 単行本(ソフトカバー)
 

 

皆様へ感謝しつつ、引き続き頑張っていこうと思う今日この頃。。

 

続く。。

 

 

諦めた。。。

70.5kg

 

前回書いた際と同じだな。

あとちょっと。。

70kg切ったらお祝いしたいな。。

(まぁ、そんなに頑張ってるわけじゃないから行かないかな。。)

 

さて、色々やってみたけど標準ライブラリをそのまま使うのに、

中々上手く行かなく、時間が掛かり過ぎて進まないので諦めた。

という事で、先人様のありがたいものを、そのまま使う事に決定。

(最初から素直に使っていればとも思うが、ちょっとは頑張りたくて。。)

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

 

Makefileも合わせて、Go!!

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm asmhead.nas -o asmhead.bin -l asmhead.lst

gcc convHankakuTxt.c -o convHankakuTxt.bin

./convHankakuTxt.bin

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib -fno-builtin bootpack.c hankaku.c mysprintf.c

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o hankaku.o mysprintf.o

cat asmhead.bin bootpack.hrb > haribote.sys

mformat -f 1440 -C -B ipl10.bin -i haribote.img ::

mcopy -i haribote.img haribote.sys ::

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a

QEMU 5.0.0 monitor - type 'help' for more information

(qemu) 

f:id:kanazo3:20200618210754j:plain

ふむ。

久しぶりに進捗。

本にも書いてあるが、これでデバッグするのが楽になりそうだ。。

 

さぁ、ついにマウスじゃ!!

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm asmhead.nas -o asmhead.bin -l asmhead.lst

gcc convHankakuTxt.c -o convHankakuTxt

./convHankakuTxt

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib -fno-builtin bootpack.c hankaku.c mysprintf.c

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o hankaku.o mysprintf.o

cat asmhead.bin bootpack.hrb > haribote.sys

mformat -f 1440 -C -B ipl10.bin -i haribote.img ::

mcopy -i haribote.img haribote.sys ::

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a

QEMU 5.0.0 monitor - type 'help' for more information

(qemu) 

f:id:kanazo3:20200618221739j:plain

おぉぉぉ。。

マウス。。。

まだ動かないけど。。

先人の方々のお力を借りつつ本の通り進んでるだけなんで、

普通な事だけど、ちょっと嬉しい。

 

さぁ、いよいよ割り込み関係辺りかな。。

ここからは難易度が、更にあがっていく予感。。。

 

続く。。

 

 

なかなかできない。。

70.5kg.

 

うん。いい感じ。。

 

本読んでただ進めるだけなんだけど、いまいち進みが悪い。

っていうか、理解力が乏しい。。(涙)

 

文字列の出力関数の部分を徐々に読んで、若干個人的こんがらがっていてのを整理する事が出来た。

(自分で書いたりしてみたら、もっと大変なんだろうけど

 今はコードを読んで理解できればよし。。)

 

次に、sprintf使う為に、ヘッダファイルを読み込んでる。。

#include <stdio.h>

 

まぁ、普通C言語勉強したら必ずあるやつ。

で、Go!

 

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm asmhead.nas -o asmhead.bin -l asmhead.lst

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c hankaku.c

bootpack.c:1:10: 致命的エラー: stdio.h: No such file or directory

    1 | #include <stdio.h>

      |          ^~~~~~~~~

コンパイルを停止しました。

make[2]: *** [bootpack.hrb] Error 1

make[1]: *** [img] Error 2

make: *** [run] Error 2

 

あかんやん!!!(Orz...)

 

先人ページをみたら、ここもご自身で作ってる。

でも、何故だろう。。

標準関数を本のようにそのまま使えないのだろうか。。

 

また、調べるか。。

(分からなかったら、先人に従おう。。方針で!)

 

続く。

 

ノロノロと。。。

71.0kg

 

糖質ダイエット(without お酒(糖質オフ))と朝の散歩は続けているが、

そんな簡単に結果は出てこないよな。

でも、なんとなく糖質が恋しくなくなってきた感じがする。。

 

今日は体重報告だけ。。。(涙)

理解が遅い。。

71.3kg

 

まぁ、変わらないな。

 

で、いよいよFont部分なのだが、本読んでるとフォントのファイルを

コンパイルしたり、そのツールの話が書いてある。

自分の環境は、下記の先人の方の環境を使わせて頂いたものなので、

見てみると、コメントがある。

『30日でできる!OS自作入門』を macOS Catalina で実行する - Qiita

 

---------------上記ページから抜粋----------------

著者作成の makefont.exeの代わりに、

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

のページの「フォントファイルのリンクについて」を使わせて頂いた。これを convHankakuTxt.cとして作成し、これを用いて hankaku.txtを変換する。

--------------------ここまで----------------------

ありがとう先人の皆様。

 

Makefile内を少しだけ

----ここは先人様の通り追加------

# convHankakuTxt.c は標準ライブラリが必要なので、macOS標準のgccを使う

convHankakuTxt : convHankakuTxt.c

        gcc convHankakuTxt.c -o convHankakuTxt

 

hankaku.c : hankaku.txt convHankakuTxt

        ./convHankakuTxt

--------------------------------

----------ここは自分の環境に合わせて修正----------------

bootpack.hrb : bootpack.c hrb.ld hankaku.c naskfunc.o Makefile       # リンク,コンパイル

        x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c hankaku.c

        x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o hankaku.o

--------------------------------------------------------

(これも、ホントは分けずにできるんだろうな。。。)

 

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm asmhead.nas -o asmhead.bin -l asmhead.lst

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c hankaku.c

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o hankaku.o

cat asmhead.bin bootpack.hrb > haribote.sys

mformat -f 1440 -C -B ipl10.bin -i haribote.img ::

mcopy -i haribote.img haribote.sys ::

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a

QEMU 5.0.0 monitor - type 'help' for more information

(qemu)

f:id:kanazo3:20200610085338j:plain

 

続く。

 

 

 

いいかげんさがねぇ。。。

70.7kg

 

ふむ。

油断は禁物!

 

という事で、怪しい場所は分かった。

要するに、asmheadでメモリに書いておいた値がおかしい為、

C言語側で使うとおかしくなる。って事。

 

で、恥ずかしく思いっきり間違えたものを書いてた。

(修正しておいた。)

 

0x0ff4: 0x0d00 (0x000d)=  3328 (14)→  ???(X方向の解像度で、320つまり0x0140のはず)

 

そう、ここ!

何故このアドレスだけ値が壊れている。。。

 

bootpack.cで、読めているのか?は当然、メモリの値が読めているだろうけど念の為確認。

 

   short *tst_binfo_scrnx, *tst_binfo_scrny;

 

   tst_binfo_scrnx = (short *) 0x1004;

   tst_binfo_scrny = (short *) 0x1006;

   *tst_binfo_scrnx = *binfo_scrnx;

   *tst_binfo_scrny = *binfo_scrny;

 

(qemu) xp/100xh 0x0ff0

0000000000000ff0: 0x000a 0x0008 0x000d 0x00c8 0x0000 0x000a 0x0000 0x0000

0000000000001000: 0x0000 0x0000 0x000d 0x00c8 0x0000 0x0000 0x0000 0x0000

0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001030: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

あたり前だが、c言語は意図通り。

やっぱり、asmheadの中身。

なんでこのアドレスだけ。。

 

;     MOV       BYTE [VMODE],8  ; 画面モードをメモする(C言語が参照する)

      MOV       WORD [VMODE],8  ; 画面モードをメモする(C言語が参照する)

      MOV       WORD [SCRNX],320

      MOV       WORD [SCRNY],200

      MOV       DWORD [VRAM],0x000a0000

 

ここも、以前のデバッグ時によく分からず、色々試行錯誤している際に

残った残骸だと思うがアドレス的には問題なさそうであるが、念の為、

アクセスをBYTEもWORDも試したが問題なし。

 

さて、何故、0x0ff4だけ。。。

 

ん???

もしかして、以前コードの進行具合のチェッカーを入れたような。。。

 

MOV             WORD [0x0ff4], 0x000d   ; 進み具合テスト2

いた。。。。。。。😭

 

これかよ。。。。

 

という事で、チェッカーを削除(他にもない事は確認)

 

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm asmhead.nas -o asmhead.bin -l asmhead.lst

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o

cat asmhead.bin bootpack.hrb > haribote.sys

mformat -f 1440 -C -B ipl10.bin -i haribote.img ::

mcopy -i haribote.img haribote.sys ::

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a

QEMU 5.0.0 monitor - type 'help' for more information

(qemu) xp/100xh 0x0ff0

0000000000000ff0: 0x000a 0x0008 0x0140 0x00c8 0x0000 0x000a 0x0000 0x0000

0000000000001000: 0x0000 0x0000 0x0140 0x00c8 0x0000 0x0000 0x0000 0x0000

0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001030: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

 

f:id:kanazo3:20200609073857j:plain

おかえり。。。

 

さて、またここから始めよう。

ほんっと、進まねぇ。。

でも、ゆっくり進めば良いか。。。

 

ちなみに、そのまま読み進め、

f:id:kanazo3:20200609074648j:plain

 

まぁ、当然と言えば当然だが、ここまで二日。。(涙)

 

ゆっくり続けよう。。

 

続く。

 

 

 

 

今週も。

71.1kg

 

週末は少し歩いた。(ほんとに少しだけど。。)

お米も食べなかった。(毎日の2分間腹筋だけやらなかった。)

でも、これか。。

様子見じゃ。。

 

で、いきなりだが

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm asmhead.nas -o asmhead.bin -l asmhead.lst

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o

cat asmhead.bin bootpack.hrb > haribote.sys

mformat -f 1440 -C -B ipl10.bin -i haribote.img ::

mcopy -i haribote.img haribote.sys ::

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a

QEMU 5.0.0 monitor - type 'help' for more information

(qemu) 

 

f:id:kanazo3:20200608080410j:plain

は?

もぉ。。。。

月曜の朝から、なんなの。。。

本は構造体の説明だが、それに伴い、コードが少し変更されている。

でも、それって何か難しい事してるんだっけ。。。。

bootpack.cのコードを見てみると、要するに違いはasmhead.nasでメモリ上へ

書いた情報ををC言語側から使う状態に変更している。

これが原因???

まさか。。。

つまり。。。。

そこに戻るのか。。。(Orz....  一気に不安が。。。)

 

とりあえず、4日目の最後のものと、5日の最初のものと実行した際のasmhead.nas

書いた情報を確認。

(qemu) xp/100xh 0x0ff0

0000000000000ff0: 0x000a 0x0008 0x000d 0x00c8 0x0000 0x000a 0x0000 0x0000

0000000000001000: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001030: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0x0ff0: 0x0a = 10 → OK.

0x0ff1: 0x00 =   0 → 多分、OK.

0x0ff2: 0x08 =  8 →  OK.

0x0ff4: 0x0d00 (0x000d)=  3328 (14)→  ???(X方向の解像度で、320つまり0x0140のはず)

0x0ff6: 0xc800 (0x00c8)=  51200 (200)→ ???(Y方向の解像度で、200つまり0xc8のはず → OK

0x0ff8: 0x000a0000 ???? → OK

という事で、これが原因でしょう。

asmhead.nasを確認。

ん???

MOV       WORD [VMODE],8  ; 画面モードをメモする(C言語が参照する)

なんだこれ。。。

これで良いのか??

今までの格闘中に、意図せずして書き換えていたのかな。。。

時間切れ。

 

続く。。。