x86

筑波大 Softlab Hackathlonに参加してきました

8/17〜8/19に富士Calmで開催された@oza_x86さん(id:big-eyed-hamster)主催の筑波大 Softlab Hackathlonに飛び入り参加して来ました。参加者: @oza_x86(id:big-eyed-hamster) @n_kane(id:kayn_koen) @go_vm @d_kami(id:d-kami) @syuu1228(id:syuu12…

AMD-V(SVM)についてちょっと勉強してみた まとめ

SVMはIntel VTと同じく、Guest OSを動作させるCPUの専用モードとモード切り替えの拡張命令を持つ。そのままCPUで実行するとマズい特権命令/レジスタアクセスはホスト側でインターセプトする。 また、ホスト/ゲスト間のコンテキストスイッチもCPUでやる(は…

低レイヤープログラミングの勉強を始めるのに良い本・Webサイト

若者から低レイヤープログラミングの勉強を始めるのに良い本・Webサイトが無いかと聞かれて即答しかねたので調べてみようと思う。 カーネルの内部構造など難しげな理論から入るのは避けて、中高生が始めるのに取っつきが良く手っ取り早そうな資料を集めてみ…

NetBSD-5.0BETA/i386のSMP実装#4

どこから2コア目以降が起動するのか分かった(と思う)。 NetBSD-5.0BETA/i386のSMP実装#1 - かーねる・う゛いえむにっきでちょっと触れたmpbios_scan()の中で、lapic_boot_init()を呼んでいる箇所がある: /* * looks like we've got a MP system. start se…

NetBSD-5.0BETA/i386のSMP実装#3

再びconfigure()を追ってみる。 cpu_configure()が行われた後、SMPに関係ありそうな部分を探していくと、以下のようなコードが見つかった: /* Boot the secondary processors. */ for (CPU_INFO_FOREACH(cii, ci)) { uvm_cpu_attach(ci); } mp_online = tru…

NetBSD-5.0BETA/i386のSMP実装#2

カーネルの主な初期化処理はsys/kern/init_main.cのmain()から始まるが、この中でconfigure()が呼ばれている場所がある: /* Configure the system hardware. This will enable interrupts. */ configure(); configure()はsys/kern/subr_autoconf.cにあり、…

NetBSD-5.0BETA/i386のSMP実装#1

NetBSD-5.0BETA/i386のSMP実装がどうなっているのかについて調べてみる。 ディレクトリ構成 sys/arch/i386がi386依存のコードで、sys/arch/x86がamd64/i386共通コードになっている模様。 SMPサポート時のアナウンス http://kerneltrap.org/node/443を読むと…

x86のユーザランド実装

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

FreeBSD 6.4のLinuxエミュレーションが動かんくなた

仕事のマシンでFreeBSD 6系を使ってるが、6.4に上げたらなんかLinuxエミュレーションがまともに動かなくなった気がする。 $ /compat/linux/bin/bash bash-3.00$ bash bash: fork: 無効な引数ですこんなんでますけどなにこれ。 Xのドライバにnvidiaのモジュー…

i8259Aの資料

x86

8259A.pdf Intel 8259 - Wikipedia http://community.osdev.info/index.php?(PIC)8259A パソコンのレガシィI/O活用大全 http://davmac.org/davpage/PIC.html 8086 Interrupt Mechanism 8259pic.pdf

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

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

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

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

IDTの初期化

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

FreeBSD 6.3の割り込み

どんな風になってるかちょっと読んでみた。 ふつーの割り込みのばやい apic_vector.sで定義されてる、ISR_VEC()が各割り込み処理の開始ポイントになってるはず。 まず、PUSH_FRAMEで #define PUSH_FRAME \ pushl $0 ; /* dummy error code */ \ pushl $0 ; /…

とは言っても

自分で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…

Omicron コンテキストスイッチ

x86

http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=%A5%B3%A5%F3%A5%C6%A5%AD... ここにTSSが何故使えないのかについての話が載っている。 が、イマイチピンとこない。 スレッドサポートがなくて遅いって事? 他の理由は何をいってるのかよく分からない。 何が…

Omicron ContOS

x86

http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=ContOS grubを使ったOSの開発例。

GRUB解析 続き

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

グローバルディスクリプタテーブル

x86

グローバルディスクリプタテーブルは、以下の用途に使われている: 全プログラム共通のセグメントの定義(グローバルセグメントディスクリ プタ) コールゲートの定義(ゲートディスクリプタ) TSSディスクリプタの定義 タスクゲートディスクリプタの定義 ロ…

システムコールの実装とsysenter命令

x86

システムコールは一般的には割り込みによって実現する。 x86の場合は、これに加えコールゲートやsysenter命令を使うなどの方法も存在する。 Solarisや古いFreeBSDではコールゲートを使っているようである。 sysenter命令についてはここのサイトが非常に参考…

疑問

x86

タスクゲートを用いた割り込みハンドラで、タスクスイッチと同時にcpu側で割り込み禁止を設定する方法があるか? →出来そう。 TSSにEFLAGS変数がある。 ここで予めフラグを外しとけば良さそう。

信州大学

x86

信州大学の授業の資料が参考になりそう。 http://kaiya.cs.shinshu-u.ac.jp/2005/os/ レベルを抑えて学部生にもわかるようにしつつ、一応x86固有な話とかしっかりやってそげ。 こういう授業ばかりだったら大学も楽しいんだけどねぇ。

BIOSへの割り込み

x86

BIOSの機能を使うには、通常INT15hを呼び出したりする訳だが、この場合、仮想86モードでの割り込みディスクリプタテーブルとか、リアルモードで0番地に存在するテーブルとかってどうなってんのかな? 15hのエントリだけ無視される? それとも適切な飛び先を…

コーリングコンベンション

x86

http://en.wikipedia.org/wiki/X86_calling_conventions ここにきちんとまとめてありました。 アーギュメントレジスタはないんですねぇ。

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

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

割り込み機構

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

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

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