LoginSignup
6
4

More than 5 years have passed since last update.

BSD本の1st/2nd Editionに対応するFreeBSDカーネルソースを取得する

Posted at

BSD本の1st/2nd Editionに対応するFreeBSDカーネルソースを取得する

FreeBSDカーネル内部を解説するBSDカーネルの設計と実装-FreeBSD詳解-という本があり、その本を皆で読み合わせるBSDカーネルの設計と実装 読書会が定期的に開催されています(次回は4/5(日)に開催されます)。

この本(通称「BSD本」)なのですが、昨年に改訂版(2nd Edition)が出版されており、先の読書会と同じ4月(4/9;木)に開催される第36回 FreeBSD勉強会では、この改訂版の読書会が行われるようです。

今回は備忘録と勉強会参加準備を兼ねて、BSD本の1st/2nd Editionに対応するFreeBSDカーネルソースの取得方法をまとめてみました。

対応するFreeBSDカーネルバージョン

書籍と対応するFreeBSDのカーネルバージョンは以下となっています。

BSD本 FreeBSDバージョン
1st Edition FreeBSD-5.2-RELEASE
2nd Edition FreeBSD-11.0-CURRENT

BSD本の2nd Editionでは"This book is about the internal structure of the FreeBSD 11 kernel"と記載されて(P.xxiiiの"Material Covered in this Book")いますが、現段階のFreeBSD 11はCURRENTという位置づけになっています。

必要なパッケージ

FreeBSDカーネルソースコードはSubversionで管理されているので、事前に必要なパッケージをインストールします。FreeBSD 11の環境では以下のコマンドを実行します。

# sudo pkg install subversion

カーネルソースコードの取得

以下の手順でカーネルソースを取得します。この例では一般ユーザの$HOME/local/src以下にチェックアウトしています。

$ mkdir -p $HOME/local/src
$ cd $HOME/local/src
$ svn checkout https://svn0.us-west.FreeBSD.org/base/release/5.2.0/sys/ ./5.2R/sys
$ svn checkout https://svn0.us-west.FreeBSD.org/base/head/sys/ ./CURRENT/sys

これでBSD本の1st Edition(FreeBSD-5.2-RELEASE)と2nd Edition(FreeBSD-11.0-CURRENT)のソースコードが手元に用意できました。

変更になった箇所を追いかけてみる

試しに変更になった箇所をちょっと追いかけてみます。sys/netinet/ip_icmp.cとか見てみると、ICMP_SOURCEQUENCHが削除されています。

$ cd $HOME/local/src
$ diff -u 5.2R/sys/netinet/ip_icmp.c CURRENT/sys/netinet/ip_icmp.c
...中略...
@@ -375,22 +451,15 @@
                if (code > 1)
                        goto badcode;
                code = PRC_PARAMPROB;
-               goto deliver;
-
-       case ICMP_SOURCEQUENCH:
-               if (code)
-                       goto badcode;
-               code = PRC_QUENCH;
        deliver:

ICMP_SOURCEQUENCH...?、何じゃそりゃと思いながらsvn blameで見てみると、リビジョンr274359で変更されています。

$ svn blame CURRENT/sys/netinet/ip_icmp.c
...中略...
  1541    rgrimes       case ICMP_MASKREPLY:
274359   melifaro       case ICMP_SOURCEQUENCH:
  1541    rgrimes       default:

svn logで追いかけると、ICMP_SOURCEQUENCHはRFC 6633で廃止されたため、ソースコードから削除したのだということが分かります。

$ svn log CURRENT/sys/netinet/ip_icmp.c | grep -A6 r274359 
r274359 | melifaro | 2014-11-11 08:10:01 +0900 (火, 11 11 2014) | 4 lines

Remove kernel handling of ICMP_SOURCEQUENCH.
It hasn't been used for a very long time.
Additionally, it was deprecated by RFC 6633.

------------------------------------------------------------------------

ちなみに、ICMP_SOURCEQUENCHはRFC 1812の時点で推奨されないICMPメッセージとなっています。RFC 6833で正式にICMP_SOURCEQUENCHは廃止と相成ったようです。

まとめ

BSD本の1st/2nd Editionに対応するFreeBSDカーネルソースの取得方法をまとめてみました。変更箇所を追いかけてみる話はすこし横道にそれる感じでしたが、ソースコードの変更箇所からRFCでのICMP_SOURCEQUENCH廃止の経緯が垣間見えてくるのは面白いですね。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4