2008-10-20から1日間の記事一覧

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>…