法楽日記

デジタル散策記&マインド探訪記

freebsd11

FreeBSD 11.1R: Receive Side Scaling (RSS)

最近の NIC (Network Interface Controller) は、送信キュー、受信キューとも複数個づつ持っているそうです。そしてマルチコア CPU 環境では、キューを CPU ごとに割り当てて、送受信処理に伴う割り込みを、担当の CPU に対してのみ送るようになっているそう…

FreeBSD 11.1R: uma_zalloc() と malloc()

C プログラミングにおいて、ユーザ空間で作業用メモリが必要な場合は、(1) 自動変数として宣言してユーザスタック領域に割り当ててもらうか、(2) malloc() を呼び出して割り当ててもらう、のどちらかが一般的だと思います。 一方、カーネル空間で作業用メモ…

FreeBSD 11.1R: TAILQ

FreeBSD 11.1R では、カーネル内で構造体の動的なチェーンを扱うときには TAILQ_xxx() マクロが利用されることが多いです。TAILQ_xxx() は、構造体どうしで一対多の親子関係があって、子が動的に追加されたり削除されたりする場合に、とても便利なマクロです…

FreeBSD 11.1R: prison_check_af()

socreate() の中で prison_check_af() という関数が呼び出されています。これは、socket() システムコールの引数で指定された family が現在の jail 環境の中で利用可能かどうかを調べるためです。 prison_check_af() は、引数で指定された ucred 構造体の環…

FreeBSD 11.1R: カーネル内での socket 関連システムコールの関数呼び出し関係

FreeBSD 11.1R では、ユーザ空間で socket 関連のシステムコールが呼び出されると、カーネル空間では sys_xxx() → kern_xxx() → soxxx() → pru_xxx() の順に関数が呼び出されます。記憶の整理のため、対応表を書き出しておきます。 sys_xxx() → kern_xxx() →…

FreeBSD 11.1R: 通信 domain の検索

FreeBSD 11.1R のカーネルでは、各通信 domain に関する情報はチェーン状に繋がれた domain 構造体で管理されています。domain 構造体は sys/sys/domain.h で宣言されています。 チェーンの先頭は domain 構造体へのポインタ domains で、sys/kern/uipc_doma…

FreeBSD 11.1R: 通信 domain の初期化

FreeBSD 11.1R で各通信 domain を定義するマクロ DOMAIN_SET() と VNET_DOMAIN_SET() は、マクロ SYSINIT() を利用しています。 SYSINIT() は、カーネル起動時に初期化が必要な subsystem を登録するためのマクロです。SYSINIT() で定義された sysinit 構造…

FreeBSD 11.1R: 通信 domain の定義

システムコール socket() は、第1引数で通信 domain を指定します。 FreeBSD 11.1R のカーネルでは、各通信 domain に関する情報は domain 構造体で管理されています。各 domain 構造体は、カーネル起動時にチェーン状に繋がれます。チェーンの先頭は、sys/k…

FreeBSD 11.1R: getsockaddr()

FreeBSD 11.1R では、sockaddr 構造体を引数に持つシステムコールには bind(), bindat(), connect(), connectat(), sendto() があります。また、sendmsg() は引数の msghdr 構造体を通して sockaddr 構造体が指定される場合があります。 これらのシステムコ…

FreeBSD 11.1R: kern_xxx() と getsock_cap()

FreeBSD 11.1R の sys/kern/uipc_syscalls.c では kern_xxx() がいくつか定義されていますが、そのうちの kern_socket() と kern_socketpair() 以外の関数では、システムコール xxx() の引数で指定された file descriptor に対応する file 構造体を入手する…

FreeBSD 11.1R: kern_socket() と falloc()

FreeBSD 11.1R の kern_socket() と kern_socketpair() は、file 構造体と file descriptor を allocate してもらうために falloc() を呼び出しています。 falloc() は sys/sys/filedesc.h で定義されているマクロ関数で、falloc_caps() の呼び出しに置換さ…

FreeBSD 11.1R: SOCK_NONBLOCK と SOCK_CLOEXEC

FreeBSD 11.1R では、socket() と socketpair() の第2引数 type でフラグを渡すことができるようになています。また新たなシステムコール accept4() の第4引数 flags でも同じようにフラグを渡すことができるようになっています。 かつては、socket() と soc…

FreeBSD 11.1R: システムコール呼び出し記録

FreeBSD 11.1R では、ユーザ空間でシステムコール xxx() が呼び出されると、回り回ってカーネル空間では kern_xxx() という関数が呼び出されます。 kern_xxx() では、先頭付近で AUDIT_ARG_yyy() というマクロ関数が呼び出されています。これはセキュリティ…

FreeBSD 11.1R: システムコールのカーネル側の入口関数

FreeBSD 11.1R では、ユーザ空間でシステムコール xxx() が呼び出されると、カーネル空間にある sys_xxx() が呼び出されます。カーネル空間にある sys_xxx() は、必要に応じて引数をチェックしたりユーザ空間からデータをコピーしたりした後、kern_xxx() を…

FreeBSD 11.1R: ソースコードの入手方法

git を用いる場合は、下記の方法でソースコードが閲覧できるようになります。 $ git clone https://github.com/freebsd/freebsd.git $ cd freebsd $ git checkout release/11.1.0 今日は git clone に約35分かかりました。(環境依存だと思います) 容量は、…