2008-01-01から1年間の記事一覧

FreeBSDとNetBSDの初期化シーケンスの違い

FreeBSDもNetBSDも元を辿れば同じものから派生してるんだから、コードもさぞかし似ているんだろう。 とか思って、初期化シーケンスを見ていたら、見た目がかなり違っていてビビッた。NetBSDでは先ほど書いた通り、kern/init_main.cのmain()から機種非依存な…

NetBSD-current /sbin/initが起動されるまで(1)

main()で一通りの初期化が終わって/sbin/initを起動する準備が整ったら、start_init()がfork()される: if (fork1(l, 0, SIGCHLD, NULL, 0, start_init, NULL, NULL, &initproc)) panic("fork init"); start_init()の流れを順に見ていく。 /* * Now in proce…

NetBSD-current/evbmips(MALTA) でmain()が呼ばれるまで

arch/mips/mips/locore.S kernel_text()がエントリーポイントで、 arch/evbmips/malta/machdep.c mach_init()を呼んでアーキテクチャ独自の初期化コードを走らせて、 kern/init_main.c main()を実行。 こっからカーネルが走り始める。

「ラスプーチンと呼ばれた男 佐藤優の地球を斬る」が終わってしまった

SankeiBiz(サンケイビズ):総合経済情報サイト ネットで佐藤優の連載が読める数少ない(唯一?)場所だったのに。残念。

カーネル内での特定処理にかかる時間を測定の続き

カーネル内での特定処理にかかる時間を測定でmbufにmeasure_timeを突っ込んでパケット処理にかかる時間を調べるというやり方を書いたが、同じ事をNetBSD-currentでやるとカーネルがふっとぶ。 mbufの扱い方が変わってるからだろーけど、、、mbuf自体をきちん…

Hardware Checksum support on NetBSD-current

ハードウェアで補助されたチェックサム計算 FreeBSDのmanを読んだらこんなん乗ってたので、NetBSDではどうよ?と思ったら、3.0のアナウンスに gem(4) and hme(4) now have hardware checksum support. とか書いてあった。 manのどこに書いてあるのかは良く分…

コンロよりも上手に作れる! 電子レンジ超活用法

コンロよりも上手に作れる! 電子レンジ超活用法 | ライフハッカー[日本版] えっと、日本の怠惰な主婦達なら誰でも知ってそうな気がするのは私の気のせいか、、、 フードコラムニストですよね?新聞社の。 ていうか今までレンジって何に使ってたんですか?…

FreeBSD 6.3の割り込み

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

とは言っても

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

あれ??

NetBSD-currentの割り込み - かーねる・う゛いえむにっき で引用したKernIntrのコードだが、 /* * Save the relevant kernel registers onto the stack. * We don't need to save s0 - s8, sp and gp because * the compiler does it for us. */ とか言って$…

NetBSD-currentの割り込み

FreeBSD 6.3の割り込み - かーねる・う゛いえむにっき で割り込み時のコンテキストがスタックに退避されてるー、って書いたけど、これはx86に限らず一般的にこうなってるもののようだ。 NetBSD/mipsはそれなりにコードを読んだつもりだったが、割り込み時の…

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

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

ちょっちビックリしたこと

NetBSD 1.6のカーネル内のコードでdouble hoge = 1.23456;みたいな事を書いたら、「doubleなんてワシ知らんし」ってgccに怒られた。そんな事出来たのか。

カーネル内での特定処理にかかる時間を測定

NetBSD 1.6でカーネル内での特定処理にかかる時間を測定しようと思ったのだが、そういう仕組みは入ってなさそうだったので、Quick & Dirtyに書いてみた。 コード #define MEASURE_TIMES 10000 typedef struct { int id; int time; unsigned start[MEASURE_TI…

スラブアロケータ

スラブアロケータ - Linuxカーネルメモ Linux スラブ・アロケーターの徹底調査 メモリ領域管理機構 (1) Buddy system

Fast forwardなどのベンチマーク

http://www.tancsa.com/blast.htmlFreeBSDやNetBSDでの色々な条件下でのスループットベンチマークが行われていて、fastfwd時の結果も載っている。 見た限り、つかっててもつかってなくてもそんなに差はない。

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

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

FreeBSD 7.0 ip_fastforwardの仕組み

大雑把な流れは以下の通り:デバイスドライバからether_input()が呼ばれる。 条件毎に必要な処理を行い、ether_demux()を呼ぶ。 ether_demux()でプロトコル毎の処理を行う。 IPの場合はip_fastforward()を呼び、返り値が0ならnetisr_dispatch()を実行する。 …

NetBSD-current ip_flowの仕組み

1度目のパケット ether_input()からipflow_fastforward()が実行されるが、一度も学習されていないフローはどこに送れば良いのか分からない為、 if ((ipf = ipflow_lookup(ip)) == NULL) return 0; でreturn 0でether_input()に戻り、schednetisr(NETISR_IP)…

NetBSD-current calloutの実装

これもnetisrのようにsoftintのラッパーのような構造になっている。 流れは以下の通り:callout_init_cpu()からsoftint_establish()が呼ばれ、callout_softclock()がsoftintのハンドラとして登録されるhardclock()より1tick毎にcallout_hardclock()が呼ばれ…

NetBSD-current ip_flowのまとめ

要するに、pf/ipfが有効だとip_flowは無効になっちゃうので、一般的なルータとしては何の役にも立たない。 だから、FreeBSDではとっとと捨てられてip_fastforwardに代わったのだと思われる。

NetBSD-current ipfの場合

ip_flowに関する調査の続き。一方、ipfの場合は以下のような所にhookが有る模様: dist/ipf/netinet/ip_fil_netbsd.c: error = pfil_add_hook((void *)fr_check_wrapper, NULL, dist/ipf/netinet/ip_fil_netbsd.c- PFIL_IN|PFIL_OUT, ph_inet); -- dist/ipf/…

NetBSD-current pfil_hooksとpf

ip_flowに関する調査の続き。pfil_hooksは複数のフィルタフレームワークを切り替えて使う為の機構だと思われる。pfil_add_hook()/pfil_remove_hook()でフック関数を追加・削除、 pfil_run_hooks()でプロトコルスタック内からフック関数群を実行する。フック…

NetBSD-current netisrの実装

ip_flowに関しての調査の続き。netisrの初期化は、softint_init()の中の以下の部分で行われる: #define DONETISR(n, f) \ softint_netisrs[(n)] = softint_establish(SOFTINT_NET|SOFTINT_MPSAFE,\ (void (*)(void *))(f), NULL) #include <net/netisr_dispatch.h> かなり変則的な</net/netisr_dispatch.h>…

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命令についてはここのサイトが非常に参考…