ちょっとClaude 使った進め方を変えてみた。。
結局、また空いちまった。。
75.4kg..
痩せたい。。
最近、少しだけ走り始めたのだが、やはり効果は出ない。。
まぁ、飲んでるし食べてるからな。。
さて、ちょっと空いてしまっている間に少し考え方を変えてみた。
そもそもこんなにAIが進んでるし便利になったのだから、この専門家に
本の内容をダイレクトに教えてもらう形の方が良くないか?と思いまして。。
こんな感じでClaudeにお願いしてみた。

すると。。。

まじか。。。
そして。。

こんなの出てきた。。
信じられない。。
という訳で、Claude codeをvscode上で make run 実行

なんか、ちょっとWarningは出ましたが。。

でた。。
う〜ん。。。Great!!!
なんか、新しい学習の仕方を身につけた感じがする。。。
後は、ipl.asmのコメントを読みながら理解。これをClaudeと対話しながらやれば進められる。。
なんてすごい。。。まじ、先生だ。。。
このコメント内容を読むのだが、折角だし、markdown形式で出してもらおう。
ipl.asm 解説
― OS自作入門 Day 01 ―
ipl.asm(ブートセクタ)の各部分を 初心者向けに 丁寧に解説します。
全体像:ipl.asm の構成
ORG 0x7c00 ← ①アドレス指定 start: JMP entry NOP [BPBヘッダ] ← ②ディスク情報 entry: [セグメント初期化] ← ③準備 [画面モード設定] ← ④画面設定 [文字表示ループ] ← ⑤表示 fin: HLT ← ⑥停止 msg: DB "Hello..." ← ⑦文字列データ TIMES ... DB 0 ← ⑧ゼロ埋め DW 0xaa55 ← ⑨ブートシグネチャ
- ポイント:全体でちょうど 512バイト。それがブートセクタのルール。
- 流れ:電源ON → BIOS → ブートセクタ読込 →
0x7C00に配置 → 実行開始
① ブートセクタとは?
- BIOS:電源を入れると最初に動くプログラム。ハードウェアを初期化して…
- 読込:ディスクの 先頭512バイト をメモリの
0x7C00番地に読み込む - 実行:
0x7C00番地に ジャンプして実行 する - なぜ 0x7C00?:1981年のIBM PCが決めたお約束。今も変わらず使われている。
メモリのイメージ(上が高アドレス) ┌──────────────────┐ 高アドレス │ │ │ OS (not yet) │ │ │ ├──────────────────┤ 0x7E00 (上端) │ Boot Sector │ <- ipl.asm │ (512 bytes) │ 0x7C00 ~ 0x7DFF ├──────────────────┤ 0x7C00 (開始アドレス) │ Stack │ <- SP=0x7C00 から │ (grows down) │ 下向きに伸びる └──────────────────┘ 0x0000 低アドレス
① ORG 0x7c00 ― アドレスの基点を宣言
ORG 0x7c00
- 意味:「このプログラムはメモリの
0x7C00番地から始まる」と アセンブラ(翻訳プログラム)に教える 命令 - なぜ必要?:プログラム内でラベル(
msgなど)のアドレスを計算するとき、「どこを基点にするか」が決まっていないと計算がズレる。 - 例:
msgが先頭から50バイト目にある場合、ORGが0x7C00→ 実際のアドレスは0x7C00 + 50 = 0x7C32
エントリポイント ― JMP と NOP
start: JMP entry ; 実際の処理(entry)まで飛ぶ NOP ; 何もしない(1バイトのパディング)
- JMP entry:BIOSが
0x7C00から実行を始めるとまずここに来る。すぐ下にはBPBヘッダ(データ)があるので、実際の処理まで飛ばす 必要がある。 - NOP:No Operation =「何もしない」命令。FAT12の仕様でBPBの直前に 3バイト 必要(JMP=2バイト + NOP=1バイト)。
- イメージ:本で言えば「目次 → 本文へジャンプ」するようなもの。
② BPB ― ディスクの仕様書(前半)
BIOS Parameter Block:フロッピーディスクの構造をOSに伝えるデータ領域
| 命令 | 値 | 意味 |
|---|---|---|
DB "HARIBOTE" |
8文字 | フォーマットしたOSの名前(何でもよい) |
DW 512 |
512 | 1セクタのバイト数(フロッピーは常に512) |
DB 1 |
1 | 1クラスタ = 何セクタか(最小単位) |
DW 1 |
1 | 予約セクタ数(ブートセクタ自身の1セクタ) |
DB 2 |
2 | FATの個数(バックアップ用に2つ) |
注意:この領域は 命令ではなくデータ。JMPで飛び越えるのはこのため。値を変えるとOSがディスクを読めなくなる。
② BPB ― ディスクの仕様書(後半)
| 命令 | 値 | 意味 |
|---|---|---|
DW 224 |
224 | ルートに置けるファイル数の上限 |
DW 2880 |
2880 | 総セクタ数(512 × 2880 = 1.44MB) |
DB 0xf0 |
0xF0 | メディア種別(0xF0 = 3.5インチFD) |
DW 9 |
9 | FATあたりのセクタ数 |
DW 18 |
18 | トラック1周あたりのセクタ数 |
DW 2 |
2 | ヘッド数(ディスクの表と裏) |
DB 0, 0, 0x29 |
— | ドライブ番号・予約・拡張シグネチャ |
DB "HARIBOTEOS " |
11文字 | ボリュームラベル(ディスクの名前) |
DB "FAT12 " |
8文字 | ファイルシステム種別 |
余談:DB / DW / DD とは?
| 命令 | 正式名 | サイズ | 例 |
|---|---|---|---|
DB |
Define Byte | 1バイト(8bit) | DB 0xf0 → 1バイト書く |
DW |
Define Word | 2バイト(16bit) | DW 512 → 2バイト書く |
DD |
Define Dword | 4バイト(32bit) | DD 0 → 4バイト書く |
- イメージ:バイナリファイルに 特定の値のバイト列を直接書き込む 命令。変数宣言ではなく「この場所にこの値を置く」という感じ。
- 例:
DB "HARIBOTE"は文字列を1文字ずつ ASCII コードで8バイト書き込む
③ セグメントレジスタの初期化
entry: MOV AX, 0 ; AX ← 0 MOV SS, AX ; スタックセグメント ← 0 MOV SP, 0x7c00 ; スタックポインタ ← 0x7C00 MOV DS, AX ; データセグメント ← 0 MOV ES, AX ; エクストラセグメント ← 0
- MOV A, B:「BをAに代入」する命令。
MOV AX, 0→ AX = 0 - なぜ全部0に?:起動直後はレジスタの値が不定。0で統一して予測しやすい状態にする。
- スタックとは?:一時的にデータを積む場所。上(高アドレス)から下に伸びるので
SP = 0x7C00を天井にしている。 - なぜ AX 経由?:SS に直接 0 を入れる命令がない。AXに入れてからSSへコピー。
④ 画面をテキストモードに設定
MOV AH, 0x00 ; ファンクション番号 = 0x00(ビデオモード設定) MOV AL, 0x03 ; モード番号 = 0x03(80列×25行 カラーテキスト) INT 0x10 ; BIOS ビデオサービスを呼び出す
- INT 0x10 とは?:BIOSが提供する 画面操作サービス。
INT= Interrupt(割り込み)。BIOSに「お願い!」と頼む命令。 - AH / AL:AXレジスタ(16bit)の上半分が AH(High)、下半分が AL(Low)。BIOSはこれで「何をしたいか」を受け取る。
- モード 0x03:文字を80列 × 25行で表示できる定番のテキストモード。1文字 = 1マスで画面に並ぶ。
⑤ 文字列を1文字ずつ表示するループ
MOV SI, msg print_loop: MOV AL, [SI] CMP AL, 0 JE fin MOV AH, 0x0e MOV BX, 15 INT 0x10 INC SI JMP print_loop
- SI:文字列の 現在位置 を指すポインタ。
MOV SI, msgで先頭にセット。 - [SI]:「SIが 指す場所の値」。Cでいう
*ptrと同じ考え方。 - CMP / JE:CMP = 比較(結果をフラグに記録)、JE = 等しければジャンプ
- INC SI:SIを1増やして次の文字へ進める。
⑤ ループの動き(図解)
msg の内容(メモリ上):
アドレス: [0x7C?0] [0x7C?1] [0x7C?2] ... [0x7C??]
値(文字): 'H' 'e' 'l' ... 0x00
↑ここで終了(ヌル文字)
ループの流れ:
1回目: SI → 'H' を読む → BIOSで 'H' 表示 → SI++
2回目: SI → 'e' を読む → BIOSで 'e' 表示 → SI++
...
最後: SI → 0x00 を読む → fin へジャンプして終了
msg の定義
msg: DB "Hello, Haribote OS!", 0x0d, 0x0a DB "This is Day 01 boot sector.", 0x0d, 0x0a, 0 ; 0x0d=CR(復帰) 0x0a=LF(改行) 0=終端
⑥ CPU を止める
fin: HLT ; CPU を停止(省電力で割り込み待ち) JMP fin ; 割り込みで起きてしまうので、またfinへ戻す
- HLT とは?:Halt(停止)命令。CPUを省電力の待機状態にする。文字を表示し終わったらもうすることがないので停止させる。
- なぜループ?:HLT はタイマーなどの 割り込み で起こされることがある。起きても
JMP finでまた HLT に戻る。 - イメージ:「仕事終わり!寝よう → ちょっと起こされた → また寝よう」の無限ループ
⑧⑨ 512バイトに合わせてブートシグネチャを付ける
TIMES 510 - ($ - $$) DB 0 ; 残りをゼロ埋め DW 0xaa55 ; ブートシグネチャ
- TIMES:「同じ命令をN回繰り返す」命令。
$=現在位置 /$$=セクション先頭。510-($ - $$)= 510バイトに足りない分だけDB 0を並べる。 - 0xAA55:ブートシグネチャ(魔法の2バイト)。最後2バイトが
55 AAでないとBIOSは「ブートセクタじゃない!」と判断して起動しない。
510バイト(ゼロ埋め) + 2バイト(0xAA55) = 512バイト ✓
余談:リトルエンディアンとは?
DW 0xAA55 の実際のバイト列:メモリ上には 55 AA の順で格納される(逆順!)
| 方式 | 0xAA55 の格納順 | 採用CPU |
|---|---|---|
| リトルエンディアン | 55 → AA(下位バイトが先) | x86(Intelなど) |
| ビッグエンディアン | AA → 55(上位バイトが先) | SPARC、ネットワーク等 |
- なぜ逆?:x86 CPUはリトルエンディアン方式を採用しているため。BIOSも同じルールで読むので、結果的に正しく認識される。
まとめ ①〜⑤
| # | 部分 | 役割 |
|---|---|---|
| ① | ORG 0x7c00 |
「0x7C00 から始まる」とアセンブラに伝える |
| ② | JMP / NOP |
BPBデータを飛び越えて実際の処理へジャンプ |
| ③ | BPBヘッダ | フロッピーの仕様情報(FAT12が必要とする固定データ) |
| ④ | セグメント初期化 | レジスタを 0 にして予測可能な状態にする |
| ⑤ | INT 0x10 (AH=0) |
BIOSに頼んで画面をテキストモードにする |
まとめ ⑥〜⑨
| # | 部分 | 役割 |
|---|---|---|
| ⑥ | print_loop | 文字列を1文字ずつ BIOS で表示する |
| ⑦ | HLT |
仕事終わり。CPUを省電力停止状態にする |
| ⑧ | TIMES ... DB 0 |
残りをゼロ埋めして510バイトにする |
| ⑨ | DW 0xAA55 |
ブートシグネチャ。「私がブートセクタ」とBIOSに伝える |
結果:起動すると画面に "Hello, Haribote OS!" が表示される!
お疲れさまでした!
たった 512バイト のプログラムが、PCを起動させる出発点。 ここから少しずつOSを育てていきます。
Day 02 へ続く →
っていう、markdown記述の説明ファイルが作成された。。すげぇ。。。 ということで今後は、この感じで進めていきたいと思います。。
おやすみ
無理したく無いけど、できる時にはちょっとでも。。。
76.5kg...
ふむ。早く70.0kgとかになりたいな。。。
最近は、ジムで走る事を始めた。
今年のやりたい事リストの一つとして(一応、毎年色々書いているけど続いていないやつ。。)やめる事を一つ設定してみた。
それは、アニメを家で見る事。アニメを見たければジムに行くべしという縛りを自らに
課してみた。
一先ず、このお陰で少しはジムに行くようになっている。。
頑張って痩せる自分を夢見て頑張りたいと思います。
3日目 32ビットモード突入とC言語導入らしい。。
(過去にもやったはずだが、何も覚えていない。。orz..)
さて、Claude codeさん。教えて!っていう事で、やってみたら下記の感じ。。

う〜ん。。マジすごいっす。。。
5年程前に読んだ時には、こんな簡単じゃなかった気がする。。(覚えてないけど。)
Claude codeって凄いな。。
全く分からないけど進められてしまう。。。
まぁ、いつもこの手の本は、読んでてコードが環境依存もあって本に書いてあるように動かないっていう所で挫折しがちなのだが、今回は行ける予感。。。
さて、次は harib00bで実行してみたら、なんと現在のMac環境では32bit実行できないからっていう感じのエラーが出たら、なんと対策を考えてる。。。

直してる。。。


動いた。。。

確認までしてくれた。。。
う〜ん。。マジ凄いっす。。。
なんか、Claude code先生って感じです。。。
今日は寝ます。。
おやすみ。
なんとか。。。
なんと、77.9kg...
ヤベェ。。マジでヤベェ。。
これはホントに痩せないと、このまま膨らむ。。
さて、2日目を進めようと思うけど、実は本の中身ちゃんと読んでいないから
改めて1〜2日目部分の本を読んでみた。(まぁ、ふむふむ。。昔読んだのちょっと思い出した。。。)
で、前と違うのは、Claude codeが付いている。
画面にはこんな記述がある。(頼もしい。。)



う〜ん。。。
正直、これ、普通ならガチでハマりそう所を一発で解決。。。
これはすごい。。。
ちゃんと本が読み進められる。。
という事で、このまま今日は二日目を最後まで読み終えることができた。
おやすみなさい。。
いやぁ〜。。 久しぶり過ぎる。。。
なんと、5年以上ぶりに帰ってきた。。
一応、体重見ておこうかな。。
がぁ〜ん。。。
75.9kg...
5年前よりも、6kgぐらい増えてる。。。(涙)
この5年間色々あったからな。。。って事にしておこう。。
最近、マラソンに参加する可能性が出てきて、ちょっとジムに通って少しずつ
走り始めたので、そこで痩せる事をを祈る。。
でも、5年前のように糖質ダイエット的な事は全くやっていないので、
増え続けているのかも。。
でも、こうやって具体的に体重自分で見ていくと意識して減らせるかも。。
頑張ろう。。。
さて、随分と年も取りましたが、昨今のAI流行りの流れに乗って私もちょっと触って
見たいと思いまして、Claude codeを使って、途中で終わってしまったOS自作入門を
今の環境でやり直してみようと思う。
ちなみに、この環境。。(古過ぎる。。)

ここで、改めて環境作り直して動かしてたいと思います。
当時と違うのは、Claude codeっていう相棒が今回はついている。
さて、やってみる。
まずは、当時の自分の記事を見直してみると過去の偉人の情報を使っている。
でも、最初から死亡している。。。(涙)
なんか、俺って何も進歩していないんだな。。。結局、ダメなやつはダメってことなのか。。。
で、今回、同じく最初からやってみるんだが、そもそも qemuやらnasmとかが無い。。
なので、このインストールからスタートだが。。。
最初からエラー連発。。。(涙)
ということで、早速、Claude codeを使って、こういう状況解決から頼ってみよう。。
Webで調べたところ、Cursorっていうエディターで作業するのが便利そうなので、インストールして使ってみた。
で、AIさんに何も考えずに質問した所。

ということで、言われるがままにqemuのインストールしようとしたら、オプションがダメだの、何かのパスがないだの、エラーだらけですが、毎回、Claude codeが色々考えて、提案されたものを薦めていたら、なんとインストール完了!!
(これは、マジでビビった。。。多分、ここで自分だけなら、また死亡していただろう。)
で、今回もひとまず、qemuでフロッピー起動。。

よかった。。。
このまま、進められそうだ。。(今の所、Claude codeが作ってくれた環境が壊れたりはしていないんだと思う。。)
じゃ、進めるぜ。
p.s ちなみに、実は、Claude codeを動かそうとしてみたが、元々のHDDの環境下では
遅すぎて動かず、外付けSSDを購入し、そこにMac OSをインストールして起動し、
そこに自分の環境を移して実行中。。便利な世の中になりました。。。
あいちまった。。
69.9kg
体重はぼちぼち。
でも、全く出来ていなかった。。
もう10日以上も手をつけられなkったので、忘れちまった。。(涙)
完全テレワークな生活から、ちょくちょく会社へ出社するという生活に切り替える
リズムにまだ完全に慣れていないが、この生活のリズムに組み込まなくては。
さて、思い出す所からスタートだが、とにかく続ける事にモチベーションを持とうと思う。
しかし、メモリ計算部分の本を読んでいて思うのだが、こういうHEXでの計算の
感覚って、やっていないと忘れてしまう。。(もしかして、自分だけかもしれないが。。)
感覚的に扱える様にならないと色々と面倒に感じてしまう。。
でも、毎回計算し直したりしないと感覚が戻らないし。。
ゆっくりやり直するしかないか。。。
続く。。
ゆっくりと。。
70.6kg
まぁ、そうね。。
時間にも寄るからね。。ちゃんと定点観測しないとホントの状態は分からないよね。。
さて、なんとかメモリ管理のコードも読んでおおよそ理解する事ができたと思う。。
よくお世話になっている過去のページにある記載も参考にしつつ、とにかくコードと
ニラめっこの末、なんとか理解できた様な気になっている。。
http://bttb.s1.valueserver.jp/wordpress/blog/2018/01/08/malloc、freeの原理-os自作入門9日目-【linux】/
ただ、このページ読んでたら、この様なすごい先人の方も、この部分までに2ヶ月
ぐらい掛かってたとの記述が。。。
こんな凄い方も、やはり時間はかかるんだな。。。って思い、
自分も負けずに頑張ろう!って気になりました。
続く。
なんと!!
69.4kg
おぉぉぉ!!!
いいねぇ〜!!
この調子で行きたい。油断は禁物!目指せ、65kg!!
しかし。。。
メモリの管理コードがよく解らない。。。(涙)
頭良くなりたい。。。
じっくり考えるしかない。。。
(基本がなってないんだろうな。。)
続く。