サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
outland-karasu.hatenadiary.org
前回でページング機能を有効にすることまではできた。今回はこれを活用してメモリを管理する部分を考察する。因みに、まだ考察するだけ(汗)。 メモリ管理とは メモリ管理とは、ぶっちゃけ以下の2点に集約される。 必要とされるメモリを割り当て、使えるようにする。 使わなくなったメモリを回収し、別の場所でまたいつか使えるようにする。 これをいかに速く、無駄なく行うか。これがメモリ管理だ。 メモリの割り当て・回収について、C言語を使ったことのある人なら馴染みが深いと思う。つまりmalloc/free関数だ。メモリ管理を実装するとは、malloc/freeを自分で実装するという意味だ。だから、外から見えるインターフェイスとしては極めて単純なものだ。 しかしその中身は極めて複雑になる(汗)。メモリ管理について、いまだ人類が決定的な解決策を見出していないいくつかの問題があるのだった。(おおげさ) 断片化の問題
ページングのことを書こうかと思ったが、まずマシンに何MBのメモリが搭載されているのか分からないと始まらない。それに、実はメモリ領域にも使えるところと使えないところがある。そういった情報も必要だ。 今回は、ACPIのファンクションを使ってメモリの領域情報を得る方法について解説する。 今回のソース setup.s memorymap.d startup.d メモリ量を得るには メモリがいくつ搭載されているか調べるには、またまたBIOSファンクションを使わなければならない。BIOSファンクションを使わないで調べる方法もあるらしいけど私は良く知らない。 メモリ量を調べるBIOSファンクションにも何種類かある。まずint 12hというファンクションがある。これを使うとKB単位でメモリ量が分かる。ただ、16ビットの数値で返ってくるので最大で64K*1K=64Mバイトまでしか分からない。いまどき64MB
またしても再開……。 さて、D言語が普通に動かせるようになった。scope指定をすればクラス・オブジェクトも作れるようになった。 が、まだ動的なメモリ確保やオブジェクト作成ができない。もっと言えば、実行時にサイズが初めて確定するようなデータのメモリ領域を確保できない。 動的なメモリ確保を行うためには、メモリ領域を色々と管理しなければならない。どの領域がどのくらい空いているのか、あるいは使われているのか、常に把握しておく必要がある。 これから、とりあえずカーネル・モードでのメモリ管理について解説する。 ページングについて ページングとは、メモリ管理の方法の一つだ。 少し前にセグメンテーションというメモリを分割する機能のことを説明した。ページングも同じようにメモリを分割する。ただ、ページングではメモリを固定サイズのページに区切る。具体的に言うと4KBで区切る(実は4MBでも区切れたりするが割愛
D言語の関数を呼び出すことに成功した。これからどんどんD言語で機能を追加していく。 OSを作っている以上、外部デバイスをいじれないとつまらない。画面表示や何かに動いているという証が欲しい。今回は、割合制御が簡単なシリアル・ポートに文字列を出力させてみる。シリアル・ポートの出力ならqemuからも簡単に見られたりする。 今回のソース startup.d io.d IO関数の用意 シリアル・ポートはIOポートを叩くことによって制御する。IOポートはアセンブラの命令で叩くことができる。が、D言語の世界に既に移行してしまったので、できればD言語の関数でIOポートを叩けるようにしたい。今後もIOを操作する機会は多いだろうから、アセンブラ命令を単純にラップした関数を用意しておく。 実はD言語の標準ライブラリ(Phobos)には、IOポートを叩くための関数が用意されている。しかし、OSを作るに当たって標準
あの日 長い橋を渡っていた 知らない多くの人びとが 長い列を成し 想像上の 現実の 渦にさらわれて 帰り道を 歩いていた 続きを読む あまりにも寒いので布団に包まって「不完全性定理」の論文の概要を読んでいた。 まだ理解できたかどうか怪しいけどD言語でメモしてみる。 ちなみにこのD言語の世界では、引数も戻り値もstring縛りです。 続きを読む ゆがんだレンズで 店長のまぶたは融けて ビルに穿たれた 無数の暗い窓からは 一千億の眼がのぞくのさ ラジオの立てる 断定的な音波 ひどく硬質な文言たちに 店長は融かされていくのさ 誰も見たことのないような 目尻からこめかみへ伸びるしわ 空気をちぎるように 店長は声を発する 新聞はしばらく来んよ 飛行機がビルに突っ込んだ あっちはもう戦争だよ 戦争 暗闇は骨の味で 断定は亡霊の悲鳴 正義はいずれ 表現されねばならぬ 窓に穿たれた一千億の眼が 店長をのぞ
プロテクト・モードへの移行は起動処理の山場の一つだ。リアル・モードからプロテクト・モードに移って初めて32ビットのコードが動き、64KBの壁を破って4GBまでの全メモリにアクセスできるようになる。 x86系CPUでプロテクト・モードに移行するには、最低限セグメンテーションと割り込みディスクリプタテーブルを初期化する必要がある。だが、割り込みを禁止した状態ならばとりあえずセグメンテーションさえ設定すれば大丈夫だ。 今回は、プロテクト・モードにおけるセグメンテーションについて解説しようと思う。 プロテクト・モードにおけるセグメンテーション プロテクト・モードのセグメンテーションは、リアル・モードのそれと何が違うか。本当に違う。まったく違う。別物なんじゃないかと思うくらい違う。実際に別物だ。 リアル・モード時にはぶっちゃけ64KBの壁をどうにか超えるためのオフセットに過ぎなかった。ある意味後ろ向
あまりにも寒いので布団に包まって「不完全性定理」の論文の概要を読んでいた。 まだ理解できたかどうか怪しいけどD言語でメモしてみる。 ちなみにこのD言語の世界では、引数も戻り値もstring縛りです。
カーネルが一括ビルドできるようになった。これで変更を加えてもコマンド一発で最新版が作れる。 だけど、デバッグはどうするのだろうか。文字表示はできるけど、まだ数字やレジスタの値を表示させることはできない。暴走したか単に無限ループで止まっているのかも分からない。 今回は、qemu実行中にマシンの状態をモニタする方法についてやろうと思う。 コンソール画面に行く 前回までに書き上げたカーネルを実行すると以下のような表示になると思う。 この時にウィンドウをクリックし、カーソルが消えた状態にしてCTRL+ALT+2(数字の2)キーを押下すると、下記のようなコンソール画面に行ける。 コンソール画面ではスクリーンキャプチャやレジスタ内容のダンプ・実行状態の記憶など色々なことが行える。 元のOS画面に戻るにはCTRL+ALT+1を押下する。カーソルを再び表示させるにはCTRL+ALTを押す。 レジスタの内容
実は、今まで黙っていたが、起動時のIPLはディスク先頭の512バイト=1セクタしか読み込まれない。1セクタだけだからブートセクタなんて言うのだ。 言うのだ、なんて威張っても仕方ない。OSのカーネルがまさか512バイトに納まるわけはないので、残りの部分をディスクから読み込まなければならない。そのためにはまずカーネルのサイズを知り、そしてディスクからメモリの適切なアドレスへ読み込む必要がある。 カーネルをどこに置くか考える リアルモードの制限により、メモリは下位1MBまでしか使えない。しかも、連続してアクセスできるのは64KBまでだ。しかもその1MBの中には、いくつも予約されている領域が存在する。前回に出てきた割り込みハンドラテーブルもその一つだし、BIOSファンクションのコードがある場所やBIOS作業領域、VRAMにマップされている領域などなどがある。それらをかいくぐってカーネルが置ける場所
前回まで実際のソースコードを元に不器用に説明したけど、いい加減CPUの説明抜きで話を進めるのが非常に辛いと分かったので、必要最低限解説しておこうと思う。 メモリ・レジスタ関連 メモリ・レジスタ 一般的なCPUには全てメモリとレジスタがある。メモリは言うまでもなくデータやプログラムを置く記憶領域で、レジスタは以前説明したとおり作業用の「手」だ。メモリから取り出した値を持ったり、値を加工するために持ったりする。非常に小さく、ほとんど1〜4バイトしかない。また、計算や処理には使わない実行制御用の特殊なレジスタもたくさん存在する。 プログラムカウンタ CPUはメモリに置かれたプログラムのコードを順次実行していく。そのために、メモリ上のどの命令を現在実行しているのかを覚えていなければならない。CPUにはそのための専用のレジスタがあり、プログラムカウンタと呼ばれる。486やPentiumなどのいわゆる
このページを最初にブックマークしてみませんか?
『Outlandish Watch』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く