明けまして

12月31日からOS自作本の3日目のソースファイルをGAS(Gnu Assembler)を用いて書いてやろうと試みていたけれど、ようやく32bit プロテクトモードに突入 && 32bitバイナリを動作確認したよ!

なぜこんなに時間がかかっていたかというと、

  1. GASで絶対ジャンプする方法がわからなかった(12月30日:コメント頂きましたとおりすがりさん、ありがとうございました!)
  2. HDDとしてマウントしていたのにも関わらず、シリンダやヘッダの指定方法をFloppyのものと同様に指定していた (1日〜2日)
  3. 風邪をひいてしまった(2日〜)
  4. memcpy がバグだらけだった (5日〜6日)
  5. qemuモニタの存在を知って色々遊んでいた(5日〜6日)
  6. GASでのセグメントジャンプの方法を勘違いしていた(5日〜6日)

と、色々な理由があったりする(^ー^;
まぁ、行き詰まった分、勉強にはなった。それと、qemuモニタのレジスタダンプ機能と、メモリダンプ機能がすごいのに気がついて、途中から使いまくっていた。せっかくなので、後でまとめようかと思う。

お買い物

つくばに戻る(略して帰筑!)途中、ヨドバシアキバでお買い物してきた。
まずは Binary Hack。

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

ちょっと前にelfバイナリについて軽く調べたけれど、そのあたりのことについてかなりまとまっているようだ。OS自作本を進めるにあたっても使えそうなので購入。

次は Write Great Code vol.2。

Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く

Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く

これ、ちょっと立ち読みしたけれど、なんで今まで手が伸びなかったんだろう、っていうくらい良い本。お目当てはアセンブリの章とコンパイラが吐き出すアセンブリコードを検証する章。

忘れてはならん

先月終了したインターンシップでやりのこした仕事があるので、そいつを今週中に終わらせる。

30日でできる!OS自作入門を Linux & GAS で行う (2日目)

というわけで、どうみても前の更新から5日以上たっているけれども2日目の説明を(笑
2日目で行うことは、

  1. 1日目で .byte、.word、.intでバイナリ直打ちしていた箇所をプログラムに置き換える
  2. リンカスクリプトを書く。
  3. Makefileアセンブルとディスクイメージ作成を自動化する

という3点である。1は、OS自作本を見ればなんとなくできてしまうだろう。また、3についても、 Linux 上でプログラム経験がある方であれば、あまり難しくないだろう。問題は2である。ユーザランドプログラムを書く用途でgccを使っていると、自分でリンカスクリプトを書く機会はなかなかない。せっかくなので、これを機にリンカスクリプトを書いてみよう(ToDo:説明増やす。今は寝る)。

  1 OUTPUT_FORMAT(binary)
  2 
  3 OUTPUT_ARCH(i386)
  4 
  5 SECTIONS {
  6 . = 0x7c00;
  7 .text : { *(.text) }
  8 }
  9 

このリンカスクリプトを使ってバイナリを生成するには、 -T オプションを使う。

 ld (入力オブジェクトファイル名) -T (リンカスクリプト) -o (出力するバイナリ)

うまくいくと、1日目と変わらない起動画面が出てくる。

というわけで、詳細についてはソースコードとOS自作本を見て頑張ってほしい。君ならできるはず!
ソースコードはこちら

続きを読む