HariboteOS

23日目 malloc

なんかすっかりフェードアウト気味…。 今回はmalloc。以下の方針で mallocの実装はここにある単純アロケータをまるっと使用。 上のmalloc実装に必要なsbrk(2)を実装。 実際のメモリ確保はページフォルトが起きた時点でおこなう。 ページフォルトハンドラで確…

番外編 その2 アプリのページング

前回に続きページング。今度はコンソールからのアプリ実行時にページング設定を切り替えてみる。 今回の方針は以下のとおり。 0x00000000から4MB分をリニアアドレス==物理アドレスとする。 アプリのエントリポイントはLinuxにならって0x08048000とする。 ア…

番外編 簡単なページング

なんとなくページングを試しみたくなったので、おためしとして以下の方針で実装してみることにする。 物理メモリ全てをリニアアドレス == 物理アドレスとなるように登録。 ページフレームサイズは4MB。 ページフォルトハンドラは実装しない なおOS自作本には…

21日目

アプリ用ということでアクセス権に0x60を足したりセグメント番号に3をORしたりしているが、どうもOS自作本ではここらへんは"おまじない"として解説はしてない様子。 この2つの"おまじない"は両方とも特権レベルに関係している。 アクセス権に0x60を足すのは…

解決

文字が表示されない問題の原因判明。結論からいうとリンカースクリプトの記述ミス。 bootpack.lsに.rodataの配置アドレスを書いてないのがダメだった。正しいbootpack.lsはこう OUTPUT_FORMAT("binary") /* We want raw binary image */ /* Define memory la…

文字がでなくなった…

突然文字がでなくなってしまった。 いろいろ原因を探ってみたが、どうやら先日アップデートしたgcc-4.1がまずいらしい。 というのもgcc-4.0でコンパイルしたものは問題なく動作している。ちなみにバージョンはこう gcc version 4.1.2 20060613 (prerelease) …

19日目

19日目はtypeコマンドやアプリケーションの実行がテーマ。そのためにはファイル内容を取得する関数を作らねば。 以下がその関数。iノードポインタを受け取ってファイル内容を先頭からsizeバイトbufに書きこみ書き込んだバイト数を返す。 static int ext2_loa…

18日目 その2

まずは前回作成したext2イメージ(root_fs)をFDイメージに書き込み。Makefileを以下のとおり編集。 ${TARGET}.bin: ${IPL} ${ASMHEAD} ${BOOTPACK} root_fs ← root_fs追加 dd if=/dev/zero of=$@ bs=512 count=2880 &> /dev/null dd if=${IPL} of=$@ conv=not…

18日目 その1

あまり書くことがなかったので、前回の5日目からいっきに飛んで18日目dirコマンド。 OS自作本の中ではFDをFAT12でフォーマットしてbootpackのイメージとかはそこにファイルとして保存してたので、dirコマンドではFDイメージを素直にFAT12と解釈して読み込む…

5日目 その3

ひさびさのHariboteOS。 今回はGDTとIDTの初期化だけど、特にここで書くようなことはないなぁ。 ちょっと目を引いたのはload_gdtr(load_idtr)がスタック上にgdtr(idtr)を作ってそれを読み込んでいたことかな。 ちなみにgasで書くとこう。 .globl load_gdtr /…

5日目 その2

今回は変数の値の表示です。 OS自作本で使っているコンパイラ(GO)にはおまけでsprintfがついてますが、gccにはそんなものはない(はず)です。で、どうするかというとGOからパクってきます。(オープンソース万歳ですな) ソースは以下のURLにあります。 http://…

5日目 その1

今日は文字列を表示するところ(harib02f)まで。 問題になるのはhankaku.txtの扱いです。 makefont.exeが使えないので、rubyでC配列を出力させてそれを利用します。 hankaku.txtからC配列を出力させるhankaku.rbはこんな感じ #!/usr/bin/ruby fio = open(ARGV…

4日目

ここらへんから開発は主にCでおこなうようになっていくのでここで説明することは減っていきます。 4日目についてはbootpack.cなどはOS自作本とまったく同じでOK 異なるのはnaskfunc.nasに対応するasmfunc.Sを作ったくらいです。

3日目 その4

前回までで32ビットモードには到達したので あとはHariMainの起動して3日目は終了です。 キリがいいので3日目終了ぶんまでのソースを掲載しときます。 以下細かいはなし。 HariMain中のhlt命令はインラインアセンブラasm("hlt")で済ませました。(OS自作本の…

3日目 その3

32ビットモードへの道 その2前回はbootpack用のリンカースクリプトを書きましたが、今回はオリジナルのHariboteOSがそこらへんをどう処理しているかという話。ちなみに32ビットモードへの移行についてはOS自作本の8日目に書いてあるのですが、データセクショ…

3日目 その2

32ビットモードへの移行 その1 asmhead.Sを書きますがOS自作本のasmhead.nasとほとんど同じです。 違うのはbootpackの転送元アドレスです。 asmhead.nasではファイルの最後にbootpackラベルがありbootpack.hrbがそのラベルの直後に連結されるので転送元アド…

3日目 その1

FDから読み込む部分は特に問題ないとおもいます。 (といいつつ自分は当初セグメントの設定がいい加減だったために大層苦労しましたが…) 次にharibote.S(haribote.nasに相当)を書きます。 .file "haribote.S" .code16gcc .text main: // 画面のモードを切り替…

2日目 その2

前回halloos.Sを作りましたが、OS自作本に掲載されているhelloos.nasとはセグメントの設定などが異なっています。 今回はこれをOS自作本にあわせます。 以下修正したhelloos.Sの先頭部分です。 .file "helloos.S" .code16gcc .section .rodata msg1: .string…

2日目

とりあえずhelloos.nasに相当するhelloos.Sを作成。 最初なんで全部掲載しときます。 #define INIT_SEG 0x07c0 .file "helloos.S" .code16gcc .section .rodata msg1: .string "hello,world" .text ljmp $INIT_SEG, $main main: cli movw $INIT_SEG, %ax mov…

4月の終わりにこんな本買いました。 30日でできる! OS自作入門 本の中でアセンブラには筆者謹製のnaskを使用してますが、 せっかくLinux上で開発するのでそこらへんをGNUツールでまかなってみます。 以下参考資料とか はじめて読む486―32ビットコンピュータ…