shiitake

x86のユーザランド実装

ようやくx86でもelfバイナリを読み込んで制御をうつし、システムコールを受け取って処理するという一連の流れが実装できた。(mipsでは既に動いている 但し、まだ仮想メモリは無く、elfバイナリのロードはヘッダに書いてある通りの場所に読み込んでしまう、と…

システムコールの実装

ローダはとりあえずこの間簡易的に実装したものを使うことにして、とっととシステムコールを実装してみた。システムコールのテーブルは、こんな感じに void *syscall_functions[SYSCALL_MAX] = { (void *)putchar, (void *)getchar, (void *)getattr, (void …

PC/ATの割り込みコントローラ

http://hira.main.jp/wiki/pukiwiki.php?init_8259A()/linux2.6 Linux のスリープ処理、タイマ処理の詳細を見る - naoyaのはてなダイアリー 割り込み OS-OMicron.org PC/ATの割り込みコントローラについて少々調べてみた。x86 CPUには外部割込みの入力ピンが…

ローダのテスト

ローダっぽいものを作ってみた。 きちんと関数定義するでもなく、ユーザランドへのメモリ割り当てはユーザランドプログラムとカーネルの双方で予め当たらないように定義(ユーザランドはコンパイル時にロード先アドレスをリンカスクリプトで設定)、カーネル…

ELFパーサ

とりあえずELFパーサの前段階としてFreeBSD上でELFヘッダをダンプするプログラムを書いている。このあたりが参考になる: ELF Format http://www.linux.or.jp/JM/html/LDP_man-pages/man5/elf.5.htmlヘッダ構造は複雑ではないからパーサはすぐ作れそうだが(…

ディスクドライバ・ファイルシステム

http://pub.ne.jp/wakapon/?cat_id=49945 d1153r17.pdf http://community.osdev.info/index.php?ATA この辺を参考に、i386版のディスクドライバを簡易実装してみた。 MIPS版はgxemulのtestmachine向けのものが既にあるのでこれを流用。 昔書いたFAT32実装と…

shiitakeでのユーザランド・システムコール実装

shiitakeでMIPSのシステムコールを受ける実装を試してみた。 でも、まだカーネル内関数をユーザモードでちょっと動かしてみただけ、というレベル。 やっぱりディスクとファイルシステムを実装してELFローダをつけるのが筋かなぁ。 しかし、仮想メモリを実装…

ユーザランドの実装方法

ファイルシステムもelfパーサも仮想メモリも無いカーネルでユーザランドをお手軽に書いてみる方法について考えている。 ユーザランド側で必要な初期化とシステムコールを一度発行するだけのプログラムをアセンブリで書き、HEXでダンプ カーネルのグローバル…

IDTの初期化

まぁ取り合えずIDTを初期化して割り込み有効にして割り込み受け取って画面に文字表示する位は出来た。 さて、こっから先はどうしようか。 #define IDT_SIZE 256 static descriptor_t idt[IDT_SIZE] = {{{0}}}; static inline void idt_load(descriptor_table…

とは言っても

自分でyield()した時は確かに汎用レジスタ保存しないで良いかもしれないが、実行途中で割り込んだ時は結局保存する必要があるんじゃぁ? でもって、タイマでカーネルプリエンプションとかやったりするんだったら、結局全スレッドの汎用レジスタを保存しとく…

x86 TSSを使わないコンテキスト切り替えについて

なんかTSSを使ったコンテキスト切り替えが思うように実装出来なかったので、ソフトウェアで実装してみた。私の常識はMIPSの常識なので、当然汎用レジスタをPCBに保存して・・・とか思ってたら、Intel x86ではこのタイミングで切り替えることは不要です。必要…

TSSを用いたコンテキスト切り替えについて

ltrですっとぶ件についてはポインタ演算のミスという事でカタがついたが、TSSを使ったコンテキスト切り替えの一般的な実装方法というものが良くわからない。不特定のプロセスへの動的なスケジューリング情報を元に次の切り替え先プロセスを決める時、1プロ…

ltrをやった瞬間にqemuがすっ飛んだ件について

shiitakeにて、空のTSSを作ってそれを指すTSSディスクリプタを作り、ltrで読み込んであげたら、読み込んだ瞬間に qemu: fatal: triple fault ですっとんだ。ltrって、最初のタスクスイッチ時にカレントTSSが無いとコンテキストの保存が出来ないからカレントT…

GRUB解析 続き

やっぱりどう調べてもTSSは設定されてない。 docs/kernel.cのmain()に unsigned tr; asm volatile ("str %0" : "=m"(tr)); printf("tr: %x\n", tr); と書いてTRレジスタをダンプして見たところ、結果は tr: 0 だった。どうも、プロテクトモードを走らせるだ…

コンテキスト切り替えの実装方法検討

現状では特にTSSが機能的に不足する事は考えにくい為、これをうまく利用したコンテキスト切り替えを考える。 利用方法としては、単にコンテキスト切り替えだけでなく、タスクゲートを利用した割り込みハンドラでの自動的なコンテキスト切り替えが考えられる。…

割り込み機構

割り込みはcliで禁止され、stiで許可される。 割り込みに対する処理はIDTで定義される。 構造はグローバルディスクリプタテーブルに類似しており、割り込みゲート、トラップゲート、タスクゲートの三種類のゲートディスクリプタが割り込み番号順に並べられる…

TSSの構造、タスク管理機構

以下、タスク管理機構のまとめ。 一つのタスクに対し、一つのTSSとTSSディスクリプタを定義する。 TSSはメモリの任意の場所に設定され、TSSディスクリプタはディスクリプタテーブルの上に設定される。 TSSはレジスタ保存部、OS用領域、IO許可マップの三部か…