NetBSD

NetBSD/i386のパケット受信フロー

まぁ予想通りというか、依然としてOpenBSDとかなりの部分が共通してますね。 ロック粒度と並列性ですが…割り込み以外でBig kernel lockは使わないのでOpenBSDのようにシステムコールでブロックしてしまってプロセスの並行実行を阻害したりはしないものの、サ…

UbuntuでNetBSD/evbmipsのクロスビルド

MenTOS revengeでmipselのクロス環境が必要になったので、binutils,gccをビルドしなきゃなーって思ったけどやりはじめたらめんどくさくなってきて、NetBSDのbuild.sh使った方が早かったのでこれを使うことにした。以下のコマンドは~/netbsdディレクトリ以下…

Ustream recorded movies of AsiaBSDCon 2010

Soon refined movies will uploaded to Youtube, until it, you can see movies here: Day 3 Room A http://www.ustream.tv/recorded/5395983 http://www.ustream.tv/recorded/5396256 http://www.ustream.tv/recorded/5397759 http://www.ustream.tv/record…

NetBSD 5.0: Overview and Benchmarks

http://www.feyrer.de/NetBSD/bx/blosxom.cgi/nb_20090430_0013.html http://www.feyrer.de/NetBSD/bx/blosxom.cgi/nb_20090430_0022.htmlうっかり見落としていたが、いつの間にかNetBSD 5.0がリリースされていてベンチマークも行われていた。 昨年からNetBS…

NetBSD-currentにおけるcurcpu() / curlwp()の仕組み

NetBSDではスレッドやCPUの管理の為にcurcpu()/curlwp()というマクロを定義しており、これによって現在のCPUに対するstruct cpu_infoを取得したり現在のスレッドに対するstruct lwpを取得したり出来るようになっている。 これがどのように実装されており、ど…

pmap SMP化でのIPI使用について

FreeBSD-current/mipsではpmap.cの特定処理についてsmp_rendezvous()を使って全CPUで整合が取れるような書き方がされていた。 が、NetBSD-currentをみる限り、powerpcにもi386にもそういう実装はされていない。 これはハードウェアアーキテクチャによる違い…

NetBSD-current/Linuxのpowerpc実装 - キャッシュまわり

NetBSDではcacheの同期にipiを使っていないのだろうか?と思い、powerpcのソースコードを眺めてみたが、それらしい所は見当たらなかった。以下はpowerpc/ibm4xx/cpu.cのキャッシュ操作部分と思われるコードだが、特にipiは使っていない: /* * These small r…

NetBSD-5.0BETA/macppcのSMP実装ーCPU初期化以外の部分について

読んでみたらi386より簡単そうだったので、こちらをもう少し読み進める事にする。SMP対応のコードってどんな所に散らばってるんだろうか?とMULTIPROCESSORでgrepしてみると、まぁ大体こんな感じである: bash-3.2$ grep MULTIPROCESSOR -r arch/powerpc arc…

NetBSD-5.0BETA/macppcのSMP実装を駆け足で#2

駆け足でみていったらやっぱり抜けが有ったので、引き続きmacppcについて眺めてみようと思う。 /* * Initialize cpu_info[0] */ INIT_CPUINFO(4,1,9,0) lis 3,__start@ha addi 3,3,__start@l mr 5,6 /* args string */ bl _C_LABEL(initppc) locore.Sのエン…

NetBSD-5.0BETA/macppcのSMP実装を駆け足で

i386のSMP実装がどうなっているのかではなく、一般的なSMP実装がどうなっているのかについて調べたいので、macppcも眺めてみる。 void cpuattach(parent, self, aux) struct device *parent, *self; void *aux; { struct cpu_info *ci; struct confargs *ca …

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を読むと…

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

forkされたプロセスがどう動くのか見てみる。コンテキストスイッチが起きると、mi_switch()が呼ばれる。 /* Pick new LWP to run. */ if (newl == NULL) { newl = nextlwp(ci, spc); } nextlwp()によってforkされたプロセスが次のプロセス(newl)に選ばれる…

MIPSでのシステムコール実装

MIPSにはsyscallというopcodeがあって、呼び出すとSyscallExceptionを起こす。 これを使ってシステムコールを実装出来る。NetBSDでは、v0にシステムコール番号を積み、通常の関数呼び出しと同じくa0-a3へ引数を積んで渡している模様。

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

ちょっとシステムコールへの理解が弱くてそもそもの動きをきちんと把握し切れてなかった(反省)。ここらへんでDebianな人が似たような所を解説していたりするが、LinuxでもBSDでも基本的に考え方は同じはずで、 forkして新しいプロセスを作る fork先プロセ…

NetBSDとFreeBSDのmutex実装の違い(2)

初期化以外はあまり違いが無いっぽい。FreeBSDでのmutexの開放: void mtx_destroy(struct mtx *mutex); NetBSDでのmutexの開放: void mutex_destroy(kmutex_t *mtx); FreeBSDでのmutexロック・アンロック: void mtx_lock(struct mtx *mutex); void mtx_un…

NetBSDとFreeBSDのmutex実装の違い(1)

FreeBSDでのmutexの初期化: jpman search errorを参照。 void mtx_init(struct mtx *mutex, const char *name, const char *type, int opts); mutexはmutex変数、nameは名前、typeは「ロックの順序をチェックするとき、ミューテックスを区別するために、証…

Hardware Checksum support on NetBSD-current(3)

dev/pci/if_wm.cとかを読んでると、 /* * Set up checksum info for this packet. */ if ((status & WRX_ST_IXSM) == 0) { if (status & WRX_ST_IPCS) { WM_EVCNT_INCR(&sc->sc_ev_rxipsum); m->m_pkthdr.csum_flags |= M_CSUM_IPv4; if (errors & WRX_ER_IP…

Hardware Checksum support on NetBSD-current(2)

ちょっと真面目に調べる事にした。前回書いたgem_attach()のコードで ifp->if_capabilities |= IFCAP_CSUM_TCPv4_Tx; というのがあったが、どんなフラグがあるのか、net/if.hを見てみよう: /* Capabilities that interfaces can advertise. */ #define IFCA…

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()を実行。 こっからカーネルが走り始める。

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

カーネル内での特定処理にかかる時間を測定で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のどこに書いてあるのかは良く分…

あれ??

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はそれなりにコードを読んだつもりだったが、割り込み時の…

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

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…