読者です 読者をやめる 読者になる 読者になる

mrasu’s blog

読んだ物の内容など

30日でできる! OS自作入門 (1週目)

「入門 コンピュータ科学」が読み終わったので、

「30日でできるOS自作入門」を読み始めました。
30日でOSができるそうです!

アセンブラC言語がメインの低級層
高級言語ばかり触れていたので、完全な素人ですが、中学生でも理解できるよう
に書いているとのことなので、できるはず。

30日でできる! OS自作入門

30日でできる! OS自作入門


1日目

バイナリを書く

最初のOSはバイナリエディタで書く。
「意味が分かる必要はないので、とにかく書け」とのこと
気合で書いて、VirtualBoxにimgを読み込ませる。

Hello World

が表示された。が、ICMPとか一切ないので、シャットダウンしたいなら電源を切るにはマシンを落とすしかない

内容説明

CPUは0と1しか理解しないし、今読んでいるモノが文字か、音か、命令かを区別できない
から、バイナリエディタは最強。OSだって、画像だってかける(理論的には)

アセンブラ

筆者作(!)のアセンブラnaskというプログラムを使用する。
アセンブラは直でバイナリを書く命令があるので、気合があればそれで十分

FAT12フォーマットを使用するが、ブートセクタなどの名前は固定長なのでスペースで埋める必要があった。

2日目

レジスタ

  1. 8個のレジスタ(16ビット)
    AX,CX,DX,BX,SP,BP,SI,DI
  2. レジスタ(8ビット, 16ビットの前後半を分けたもの)
    AL,CL,DL,BL,AH,CH,DH,BH

Makefile

バッチファイルからの脱却。

3日目

ディスク読み込み(フロッピー)

エラーの場合はCFが1になって、AHにエラーコードが入る
フロッピーは80シリンダ18セクタ(1セクタ=512バイト)

例えば、10シリンダ8セクタ、両面を読みたいなら、順に

INT 0x13

を呼び出す

ブートストラップから別プログラムを呼び出すなら、

  1. imgにそのプログラムを書く
  2. ブートストラップでプログラムをメモリに読み込む
  3. ジャンプしてそのプログラムに処理を移す

ことが必要

Cをimgから実行できるようにするには

  1. c→gas (gccはgas[GNU assembler]を前提にしているのでそれ用に形式を整える)
  2. gas→nas (naskで読めるようにする)
  3. nas→obj (機械語のオブジェクトファイルを作る)
  4. obj→bim (オブジェクトファイルをくっつける)
  5. bim→hrb (hariboteOSが読める形式に変換する)
  6. sysファイルにする

4日目

ポインタ

ポインタは、メモリの番地をあらわすだけ

*i = i & 0x0f
= MOV [i],(i & 0x0f)

IN命令, OUT命令

  • 外部I/O装置からデータを受け取るのがIN
  • 外部I/O装置にデータを送信するのがOUT

EFLAGS

フラグが詰まった32ビットレジスタ
個別のフラグにアクセスできるものとできないものがある(キャリーフラグはアクセスできるが、割り込みフラグは直接アクセスできない)
ので、EFLAGSを全部読んで、ほしい場所だけ取得する

5日目

GDT, IDT

  • GDT: 各プログラムのメモリ開始位置を記録したテーブル。GDTの情報を記録したレジスタがGDTR
  • IDT: 割り込み命令の番号と実行関数を記録したテーブル

6日目

リファクタリング

cファイルの分割、Makefileの共通化(一般規則)、ヘッダファイル化

PIC

PIC[programmable interrupt controller]は割り込み信号を8種見て、一つでも割り込み信号が来たら、CPUにそれを伝える(CPUは1つしか聞けない)
マスター・スレイブの2段にできるので15種同時に管理できる

レジスタの種類

  1. IMR: 割り込みを受け付ける場所の指定
  2. ICW: 初期化用レジスタ

7日目

割り込み命令を逐次処理していると、割り込みのたびに時間がかかるので、バッファにためる
バッファは、配列の中を循環させる

マウスの割り込みは初期状態が無効になっているので、何もしないと制御回路とマウスはデータを送ってこない。
有効にする必要がある。
(VirtualBoxだと、マウスを有効にして初めて「マウスをキャプチャするには画面内でクリックしてください」というポップアップが出た)