スタート低レイヤー #0

27
スタート低レイヤー #0 スタート低レイヤー #0 スタート低レイヤー #0 スタート低レイヤー #0 スタート低レイヤー #0 Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe

description

 

Transcript of スタート低レイヤー #0

Page 1: スタート低レイヤー #0

スタート低レイヤー #0スタート低レイヤー #0スタート低レイヤー #0スタート低レイヤー #0スタート低レイヤー #0

Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe

Page 2: スタート低レイヤー #0

私は誰?私は誰?私は誰?私は誰?私は誰?

☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q

☆ ミラクル・リナックス勤務☆ ミラクル・リナックス勤務☆ ミラクル・リナックス勤務☆ ミラクル・リナックス勤務☆ ミラクル・リナックス勤務

☆ 前はコピー機のOSをNetBSDで作ってた☆ 前はコピー機のOSをNetBSDで作ってた☆ 前はコピー機のOSをNetBSDで作ってた☆ 前はコピー機のOSをNetBSDで作ってた☆ 前はコピー機のOSをNetBSDで作ってた

☆ デジタルサイネージのソフト開発してます☆ デジタルサイネージのソフト開発してます☆ デジタルサイネージのソフト開発してます☆ デジタルサイネージのソフト開発してます☆ デジタルサイネージのソフト開発してます

☆ OSSに興味のある{エンジニア,インターン}募集中です!☆ OSSに興味のある{エンジニア,インターン}募集中です!☆ OSSに興味のある{エンジニア,インターン}募集中です!☆ OSSに興味のある{エンジニア,インターン}募集中です!☆ OSSに興味のある{エンジニア,インターン}募集中です!

Page 3: スタート低レイヤー #0

この勉強会は何?この勉強会は何?この勉強会は何?この勉強会は何?この勉強会は何?

☆ UNIXモドキのOSを理解するために☆ UNIXモドキのOSを理解するために☆ UNIXモドキのOSを理解するために☆ UNIXモドキのOSを理解するために☆ UNIXモドキのOSを理解するために

☆ printf関数の動作を題材にして☆ printf関数の動作を題材にして☆ printf関数の動作を題材にして☆ printf関数の動作を題材にして☆ printf関数の動作を題材にして

☆ NetBSDソースコードを読んだり☆ NetBSDソースコードを読んだり☆ NetBSDソースコードを読んだり☆ NetBSDソースコードを読んだり☆ NetBSDソースコードを読んだり

☆ NetBSD manpageを読んだり☆ NetBSD manpageを読んだり☆ NetBSD manpageを読んだり☆ NetBSD manpageを読んだり☆ NetBSD manpageを読んだり

する勉強会ですする勉強会ですする勉強会ですする勉強会ですする勉強会です

Page 4: スタート低レイヤー #0

この勉強会の進め方この勉強会の進め方この勉強会の進め方この勉強会の進め方この勉強会の進め方

☆ backtraceを見て☆ backtraceを見て☆ backtraceを見て☆ backtraceを見て☆ backtraceを見て

☆ 興味のある箇所を参加者が調べて発表☆ 興味のある箇所を参加者が調べて発表☆ 興味のある箇所を参加者が調べて発表☆ 興味のある箇所を参加者が調べて発表☆ 興味のある箇所を参加者が調べて発表

☆ 調べる方法を有識者がフォロー☆ 調べる方法を有識者がフォロー☆ 調べる方法を有識者がフォロー☆ 調べる方法を有識者がフォロー☆ 調べる方法を有識者がフォロー

☆ printfの動作完全理解で勉強会卒業!☆ printfの動作完全理解で勉強会卒業!☆ printfの動作完全理解で勉強会卒業!☆ printfの動作完全理解で勉強会卒業!☆ printfの動作完全理解で勉強会卒業!

Page 5: スタート低レイヤー #0

つまり打ち出の小槌ですヨ!つまり打ち出の小槌ですヨ!つまり打ち出の小槌ですヨ!つまり打ち出の小槌ですヨ!つまり打ち出の小槌ですヨ!

Page 6: スタート低レイヤー #0

でもまたなんでprintfなの?でもまたなんでprintfなの?でもまたなんでprintfなの?でもまたなんでprintfなの?でもまたなんでprintfなの?

☆ OSの学び方とか聞いたことありますか?☆ OSの学び方とか聞いたことありますか?☆ OSの学び方とか聞いたことありますか?☆ OSの学び方とか聞いたことありますか?☆ OSの学び方とか聞いたことありますか?

☆ ぼくのケース := 会社入っていきなり仕事☆ ぼくのケース := 会社入っていきなり仕事☆ ぼくのケース := 会社入っていきなり仕事☆ ぼくのケース := 会社入っていきなり仕事☆ ぼくのケース := 会社入っていきなり仕事

☆ 独学でした... #orz☆ 独学でした... #orz☆ 独学でした... #orz☆ 独学でした... #orz☆ 独学でした... #orz

☆ 10年ぐらいNetBSDのお守り☆ 10年ぐらいNetBSDのお守り☆ 10年ぐらいNetBSDのお守り☆ 10年ぐらいNetBSDのお守り☆ 10年ぐらいNetBSDのお守り

☆ 皆さんには近道を通ってほしい!☆ 皆さんには近道を通ってほしい!☆ 皆さんには近道を通ってほしい!☆ 皆さんには近道を通ってほしい!☆ 皆さんには近道を通ってほしい!

Page 7: スタート低レイヤー #0

ダメな例1: UNIX本読むダメな例1: UNIX本読むダメな例1: UNIX本読むダメな例1: UNIX本読むダメな例1: UNIX本読む

☆ 各部品については理解できる☆ 各部品については理解できる☆ 各部品については理解できる☆ 各部品については理解できる☆ 各部品については理解できる

☆ 部品と部品の繋がりがイメージできない☆ 部品と部品の繋がりがイメージできない☆ 部品と部品の繋がりがイメージできない☆ 部品と部品の繋がりがイメージできない☆ 部品と部品の繋がりがイメージできない

☆ よってkernel全体感も掴めない☆ よってkernel全体感も掴めない☆ よってkernel全体感も掴めない☆ よってkernel全体感も掴めない☆ よってkernel全体感も掴めない

☆ 細かい部品についてはコード読まないと☆ 細かい部品についてはコード読まないと☆ 細かい部品についてはコード読まないと☆ 細かい部品についてはコード読まないと☆ 細かい部品についてはコード読まないと

☆ 本読むのは良いけどそれだけじゃぁ...☆ 本読むのは良いけどそれだけじゃぁ...☆ 本読むのは良いけどそれだけじゃぁ...☆ 本読むのは良いけどそれだけじゃぁ...☆ 本読むのは良いけどそれだけじゃぁ...

Page 8: スタート低レイヤー #0

ダメな例2: 自作OSダメな例2: 自作OSダメな例2: 自作OSダメな例2: 自作OSダメな例2: 自作OS

☆ 楽しいけど...☆ 楽しいけど...☆ 楽しいけど...☆ 楽しいけど...☆ 楽しいけど...

☆ x86セグメントとかイキナリ☆ x86セグメントとかイキナリ☆ x86セグメントとかイキナリ☆ x86セグメントとかイキナリ☆ x86セグメントとかイキナリ

☆ デバイス周りやVMなど下側ばかり☆ デバイス周りやVMなど下側ばかり☆ デバイス周りやVMなど下側ばかり☆ デバイス周りやVMなど下側ばかり☆ デバイス周りやVMなど下側ばかり

☆ バスドライバなど抽象まで辿りつけない☆ バスドライバなど抽象まで辿りつけない☆ バスドライバなど抽象まで辿りつけない☆ バスドライバなど抽象まで辿りつけない☆ バスドライバなど抽象まで辿りつけない

☆ 上に複雑なアプリケーションはいない☆ 上に複雑なアプリケーションはいない☆ 上に複雑なアプリケーションはいない☆ 上に複雑なアプリケーションはいない☆ 上に複雑なアプリケーションはいない

☆ 結果: 単なるデバドラ屋になりさがる...☆ 結果: 単なるデバドラ屋になりさがる...☆ 結果: 単なるデバドラ屋になりさがる...☆ 結果: 単なるデバドラ屋になりさがる...☆ 結果: 単なるデバドラ屋になりさがる...

Page 9: スタート低レイヤー #0

ダメな例3: 起動プロセスを調べるダメな例3: 起動プロセスを調べるダメな例3: 起動プロセスを調べるダメな例3: 起動プロセスを調べるダメな例3: 起動プロセスを調べる

☆ プロセスの生成、光あれ!☆ プロセスの生成、光あれ!☆ プロセスの生成、光あれ!☆ プロセスの生成、光あれ!☆ プロセスの生成、光あれ!

☆ 過渡と定常☆ 過渡と定常☆ 過渡と定常☆ 過渡と定常☆ 過渡と定常

☆ 過渡ばかり覚える☆ 過渡ばかり覚える☆ 過渡ばかり覚える☆ 過渡ばかり覚える☆ 過渡ばかり覚える

☆ 定常 := 機器が動いている時☆ 定常 := 機器が動いている時☆ 定常 := 機器が動いている時☆ 定常 := 機器が動いている時☆ 定常 := 機器が動いている時

☆ アプリ結合で思考停止する人間になる☆ アプリ結合で思考停止する人間になる☆ アプリ結合で思考停止する人間になる☆ アプリ結合で思考停止する人間になる☆ アプリ結合で思考停止する人間になる

Page 10: スタート低レイヤー #0

じゃあ何が近道なのさ!?じゃあ何が近道なのさ!?じゃあ何が近道なのさ!?じゃあ何が近道なのさ!?じゃあ何が近道なのさ!?

☆ フリーUNIXのソース全部読めってか?☆ フリーUNIXのソース全部読めってか?☆ フリーUNIXのソース全部読めってか?☆ フリーUNIXのソース全部読めってか?☆ フリーUNIXのソース全部読めってか?

☆ 無理だぽー☆ 無理だぽー☆ 無理だぽー☆ 無理だぽー☆ 無理だぽー

☆ シナリオが必要です☆ シナリオが必要です☆ シナリオが必要です☆ シナリオが必要です☆ シナリオが必要です

☆ 最も簡単そうなシナリオは?☆ 最も簡単そうなシナリオは?☆ 最も簡単そうなシナリオは?☆ 最も簡単そうなシナリオは?☆ 最も簡単そうなシナリオは?

☆ printf関数の動作じゃね☆ printf関数の動作じゃね☆ printf関数の動作じゃね☆ printf関数の動作じゃね☆ printf関数の動作じゃね

Page 11: スタート低レイヤー #0

簡単なプログラムを作りました簡単なプログラムを作りました簡単なプログラムを作りました簡単なプログラムを作りました簡単なプログラムを作りました/* whileprint.c */#include <stdio.h>

int main(){ while(1) { printf("."); }}

/* whileprint.c */#include <stdio.h>

int main(){ while(1) { printf("."); }}

/* whileprint.c */#include <stdio.h>

int main(){ while(1) { printf("."); }}

/* whileprint.c */#include <stdio.h>

int main(){ while(1) { printf("."); }}

/* whileprint.c */#include <stdio.h>

int main(){

while(1) { printf("."); }}

このプログラムをシリアルコンソールから実行すれば、 PCのシリアルポートに"."をひたすら書くだけのはず。

このプログラムをシリアルコンソールから実行すれば、 PCのシリアルポートに"."をひたすら書くだけのはず。

このプログラムをシリアルコンソールから実行すれば、 PCのシリアルポートに"."をひたすら書くだけのはず。

このプログラムをシリアルコンソールから実行すれば、 PCのシリアルポートに"."をひたすら書くだけのはず。

このプログラムをシリアルコンソールから実行すれば、 PCのシリアルポートに"."をひたすら書くだけのはず。

Page 12: スタート低レイヤー #0

x86のシリアルポートのしくみx86のシリアルポートのしくみx86のシリアルポートのしくみx86のシリアルポートのしくみx86のシリアルポートのしくみhttp://community.osdev.info/index.php?%28serial%29PC16550http://community.osdev.info/index.php?%28serial%29PC16550http://community.osdev.info/index.php?%28serial%29PC16550http://community.osdev.info/index.php?%28serial%29PC16550http://community.osdev.info/index.php?%28serial%29PC16550

I/Oポート0x3F8にASCIIコードを書けばOKI/Oポート0x3F8にASCIIコードを書けばOKI/Oポート0x3F8にASCIIコードを書けばOKI/Oポート0x3F8にASCIIコードを書けばOKI/Oポート0x3F8にASCIIコードを書けばOK

Page 13: スタート低レイヤー #0

printf => I/Oポート の間は?printf => I/Oポート の間は?printf => I/Oポート の間は?printf => I/Oポート の間は?printf => I/Oポート の間は?

Page 14: スタート低レイヤー #0

backtrace取ってみたよbacktrace取ってみたよbacktrace取ってみたよbacktrace取ってみたよbacktrace取ってみたよ

Page 15: スタート低レイヤー #0

ソースコードの取得ソースコードの取得ソースコードの取得ソースコードの取得ソースコードの取得

CVSCVSCVSCVSCVS$ cat ~/.cvsrcdiff -cuupdate -dPcheckout -Pcvs -z3 -q$ cvs -d :pserver:[email protected]:/cvs/cvsroot loginLogging in to :pserver:[email protected]:2401/cvs/cvsrootCVS password: anoncvs$ cvs -d :pserver:[email protected]:/cvs/cvsroot co -r netbsd-6-0-1-RELEASE src

$ cat ~/.cvsrcdiff -cuupdate -dPcheckout -Pcvs -z3 -q$ cvs -d :pserver:[email protected]:/cvs/cvsroot loginLogging in to :pserver:[email protected]:2401/cvs/cvsrootCVS password: anoncvs$ cvs -d :pserver:[email protected]:/cvs/cvsroot co -r netbsd-6-0-1-RELEASE src

$ cat ~/.cvsrcdiff -cuupdate -dPcheckout -Pcvs -z3 -q$ cvs -d :pserver:[email protected]:/cvs/cvsroot loginLogging in to :pserver:[email protected]:2401/cvs/cvsrootCVS password: anoncvs$ cvs -d :pserver:[email protected]:/cvs/cvsroot co -r netbsd-6-0-1-RELEASE src

$ cat ~/.cvsrcdiff -cuupdate -dPcheckout -Pcvs -z3 -q$ cvs -d :pserver:[email protected]:/cvs/cvsroot loginLogging in to :pserver:[email protected]:2401/cvs/cvsrootCVS password: anoncvs$ cvs -d :pserver:[email protected]:/cvs/cvsroot co -r netbsd-6-0-1-RELEASE src

$ cat ~/.cvsrcdiff -cuupdate -dPcheckout -Pcvs -z3 -q$ cvs -d :pserver:[email protected]:/cvs/cvsroot loginLogging in to :pserver:[email protected]:2401/cvs/cvsrootCVS password: anoncvs$ cvs -d :pserver:[email protected]:/cvs/cvsroot co -r netbsd-6-0-1-RELEASE src

GitGitGitGitGit$ git clone git://github.com/jsonn/src.git$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0$ git clone git://github.com/jsonn/src.git$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0$ git clone git://github.com/jsonn/src.git$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0$ git clone git://github.com/jsonn/src.git$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0$ git clone git://github.com/jsonn/src.git$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0

Page 16: スタート低レイヤー #0

読むべきソースコードの在処読むべきソースコードの在処読むべきソースコードの在処読むべきソースコードの在処読むべきソースコードの在処src/lib/libc := libcsrc/libexec/ld.elf_so := 動的リンカsrc/sys := kernel全体src/sys/sys := kernel内APIヘッダsrc/sys/arch/x86 := i386/amd64共通機種依存コードsrc/sys/arch/i386 := i386アーキティクチャ機種依存コードsrc/sys/dev := デバイスドライバsrc/sys/kern := kernelコアルーチンsrc/sys/uvm := バーチャルメモリ

src/lib/libc := libcsrc/libexec/ld.elf_so := 動的リンカsrc/sys := kernel全体src/sys/sys := kernel内APIヘッダsrc/sys/arch/x86 := i386/amd64共通機種依存コードsrc/sys/arch/i386 := i386アーキティクチャ機種依存コードsrc/sys/dev := デバイスドライバsrc/sys/kern := kernelコアルーチンsrc/sys/uvm := バーチャルメモリ

src/lib/libc := libcsrc/libexec/ld.elf_so := 動的リンカsrc/sys := kernel全体src/sys/sys := kernel内APIヘッダsrc/sys/arch/x86 := i386/amd64共通機種依存コードsrc/sys/arch/i386 := i386アーキティクチャ機種依存コードsrc/sys/dev := デバイスドライバsrc/sys/kern := kernelコアルーチンsrc/sys/uvm := バーチャルメモリ

src/lib/libc := libcsrc/libexec/ld.elf_so := 動的リンカsrc/sys := kernel全体src/sys/sys := kernel内APIヘッダsrc/sys/arch/x86 := i386/amd64共通機種依存コードsrc/sys/arch/i386 := i386アーキティクチャ機種依存コードsrc/sys/dev := デバイスドライバsrc/sys/kern := kernelコアルーチンsrc/sys/uvm := バーチャルメモリ

src/lib/libc := libcsrc/libexec/ld.elf_so := 動的リンカsrc/sys := kernel全体src/sys/sys := kernel内APIヘッダsrc/sys/arch/x86 := i386/amd64共通機種依存コードsrc/sys/arch/i386 := i386アーキティクチャ機種依存コードsrc/sys/dev := デバイスドライバsrc/sys/kern := kernelコアルーチンsrc/sys/uvm := バーチャルメモリ

他のディレクトリはおいおい説明します他のディレクトリはおいおい説明します他のディレクトリはおいおい説明します他のディレクトリはおいおい説明します他のディレクトリはおいおい説明します

Page 17: スタート低レイヤー #0

ドキュメントはmanpageドキュメントはmanpageドキュメントはmanpageドキュメントはmanpageドキュメントはmanpage

http://netbsd.gw.com/cgi-bin/man-cgihttp://netbsd.gw.com/cgi-bin/man-cgihttp://netbsd.gw.com/cgi-bin/man-cgihttp://netbsd.gw.com/cgi-bin/man-cgihttp://netbsd.gw.com/cgi-bin/man-cgi

http://netbsdman.masterq.net/http://netbsdman.masterq.net/http://netbsdman.masterq.net/http://netbsdman.masterq.net/http://netbsdman.masterq.net/

翻訳環境構築中翻訳環境構築中翻訳環境構築中翻訳環境構築中翻訳環境構築中

Page 18: スタート低レイヤー #0

開発環境: build.sh開発環境: build.sh開発環境: build.sh開発環境: build.sh開発環境: build.sh

以下の手順でkernelをコンパイルできます以下の手順でkernelをコンパイルできます以下の手順でkernelをコンパイルできます以下の手順でkernelをコンパイルできます以下の手順でkernelをコンパイルできます$ cd src/$ ./build.sh -T obj/tooldir -m i386 tools$ cd sys/arch/i386/conf/$ ../../../../obj/tooldir/bin/nbconfig GENERIC$ cd ../compile/GENERIC/$ ../../../../../obj/tooldir/bin/nbmake-i386 depend$ ../../../../../obj/tooldir/bin/nbmake-i386$ file netbsdnetbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for NetBSD 6.0, not stripped

$ cd src/$ ./build.sh -T obj/tooldir -m i386 tools$ cd sys/arch/i386/conf/$ ../../../../obj/tooldir/bin/nbconfig GENERIC$ cd ../compile/GENERIC/$ ../../../../../obj/tooldir/bin/nbmake-i386 depend$ ../../../../../obj/tooldir/bin/nbmake-i386$ file netbsdnetbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for NetBSD 6.0, not stripped

$ cd src/$ ./build.sh -T obj/tooldir -m i386 tools$ cd sys/arch/i386/conf/$ ../../../../obj/tooldir/bin/nbconfig GENERIC$ cd ../compile/GENERIC/$ ../../../../../obj/tooldir/bin/nbmake-i386 depend$ ../../../../../obj/tooldir/bin/nbmake-i386$ file netbsdnetbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for NetBSD 6.0, not stripped

$ cd src/$ ./build.sh -T obj/tooldir -m i386 tools$ cd sys/arch/i386/conf/$ ../../../../obj/tooldir/bin/nbconfig GENERIC$ cd ../compile/GENERIC/$ ../../../../../obj/tooldir/bin/nbmake-i386 depend$ ../../../../../obj/tooldir/bin/nbmake-i386$ file netbsdnetbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for NetBSD 6.0, not stripped

$ cd src/$ ./build.sh -T obj/tooldir -m i386 tools$ cd sys/arch/i386/conf/$ ../../../../obj/tooldir/bin/nbconfig GENERIC$ cd ../compile/GENERIC/$ ../../../../../obj/tooldir/bin/nbmake-i386 depend$ ../../../../../obj/tooldir/bin/nbmake-i386$ file netbsdnetbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for NetBSD 6.0, not stripped

コードをちょっと変えて動作を見たいときどうぞコードをちょっと変えて動作を見たいときどうぞコードをちょっと変えて動作を見たいときどうぞコードをちょっと変えて動作を見たいときどうぞコードをちょっと変えて動作を見たいときどうぞ

Page 19: スタート低レイヤー #0

実行環境: NetBSD + virtualbox実行環境: NetBSD + virtualbox実行環境: NetBSD + virtualbox実行環境: NetBSD + virtualbox実行環境: NetBSD + virtualbox

isoでvirtualboxにNetBSDをインストールisoでvirtualboxにNetBSDをインストールisoでvirtualboxにNetBSDをインストールisoでvirtualboxにNetBSDをインストールisoでvirtualboxにNetBSDをインストールftp://iso.jp.netbsd.org/pub/NetBSD/iso/6.0.1/NetBSD-6.0.1-i386.isoftp://iso.jp.netbsd.org/pub/NetBSD/iso/6.0.1/NetBSD-6.0.1-i386.isoftp://iso.jp.netbsd.org/pub/NetBSD/iso/6.0.1/NetBSD-6.0.1-i386.isoftp://iso.jp.netbsd.org/pub/NetBSD/iso/6.0.1/NetBSD-6.0.1-i386.isoftp://iso.jp.netbsd.org/pub/NetBSD/iso/6.0.1/NetBSD-6.0.1-i386.iso

さっきコンパイルしたkernelを/netbsd.testの名前でvirtualboxインスタンスに置くさっきコンパイルしたkernelを/netbsd.testの名前でvirtualboxインスタンスに置くさっきコンパイルしたkernelを/netbsd.testの名前でvirtualboxインスタンスに置くさっきコンパイルしたkernelを/netbsd.testの名前でvirtualboxインスタンスに置くさっきコンパイルしたkernelを/netbsd.testの名前でvirtualboxインスタンスに置く

以下のように/boot.cfgを設定以下のように/boot.cfgを設定以下のように/boot.cfgを設定以下のように/boot.cfgを設定以下のように/boot.cfgを設定menu=Boot normally:rndseed /var/db/entropy-file;boot netbsdmenu=Boot ddb:rndseed /var/db/entropy-file;boot netbsd.test -dmenu=Boot single user:rndseed /var/db/entropy-file;boot netbsd -smenu=Drop to boot prompt:promptdefault=1timeout=5clear=1

menu=Boot normally:rndseed /var/db/entropy-file;boot netbsdmenu=Boot ddb:rndseed /var/db/entropy-file;boot netbsd.test -dmenu=Boot single user:rndseed /var/db/entropy-file;boot netbsd -smenu=Drop to boot prompt:promptdefault=1timeout=5clear=1

menu=Boot normally:rndseed /var/db/entropy-file;boot netbsdmenu=Boot ddb:rndseed /var/db/entropy-file;boot netbsd.test -dmenu=Boot single user:rndseed /var/db/entropy-file;boot netbsd -smenu=Drop to boot prompt:promptdefault=1timeout=5clear=1

menu=Boot normally:rndseed /var/db/entropy-file;boot netbsdmenu=Boot ddb:rndseed /var/db/entropy-file;boot netbsd.test -dmenu=Boot single user:rndseed /var/db/entropy-file;boot netbsd -smenu=Drop to boot prompt:promptdefault=1timeout=5clear=1

menu=Boot normally:rndseed /var/db/entropy-file;boot netbsdmenu=Boot ddb:rndseed /var/db/entropy-file;boot netbsd.test -dmenu=Boot single user:rndseed /var/db/entropy-file;boot netbsd -smenu=Drop to boot prompt:promptdefault=1timeout=5clear=1

Page 20: スタート低レイヤー #0

virtualboxでシリアルコンソールvirtualboxでシリアルコンソールvirtualboxでシリアルコンソールvirtualboxでシリアルコンソールvirtualboxでシリアルコンソールhttp://www.reactos.org/wiki/VirtualBoxhttp://www.reactos.org/wiki/VirtualBoxhttp://www.reactos.org/wiki/VirtualBoxhttp://www.reactos.org/wiki/VirtualBoxhttp://www.reactos.org/wiki/VirtualBox

virtualboxのシリアルを名前付きpipeに設定virtualboxのシリアルを名前付きpipeに設定virtualboxのシリアルを名前付きpipeに設定virtualboxのシリアルを名前付きpipeに設定virtualboxのシリアルを名前付きpipeに設定http://www.cetus-net.org/bsd/i386/serial.htmlhttp://www.cetus-net.org/bsd/i386/serial.htmlhttp://www.cetus-net.org/bsd/i386/serial.htmlhttp://www.cetus-net.org/bsd/i386/serial.htmlhttp://www.cetus-net.org/bsd/i386/serial.html

NetBSD側でシリアルコンソールを有効にNetBSD側でシリアルコンソールを有効にNetBSD側でシリアルコンソールを有効にNetBSD側でシリアルコンソールを有効にNetBSD側でシリアルコンソールを有効に# diff /etc/ttys.back /etc/ttys13c13< tty00 "/usr/libexec/getty std.9600" unknown off secure---> tty00 "/usr/libexec/getty std.9600" vt100 on secure local

# diff /etc/ttys.back /etc/ttys13c13< tty00 "/usr/libexec/getty std.9600" unknown off secure---> tty00 "/usr/libexec/getty std.9600" vt100 on secure local

# diff /etc/ttys.back /etc/ttys13c13< tty00 "/usr/libexec/getty std.9600" unknown off secure---> tty00 "/usr/libexec/getty std.9600" vt100 on secure local

# diff /etc/ttys.back /etc/ttys13c13< tty00 "/usr/libexec/getty std.9600" unknown off secure---> tty00 "/usr/libexec/getty std.9600" vt100 on secure local

# diff /etc/ttys.back /etc/ttys13c13< tty00 "/usr/libexec/getty std.9600" unknown off secure---> tty00 "/usr/libexec/getty std.9600" vt100 on secure local

ホストOSから名前付きpipeを開くホストOSから名前付きpipeを開くホストOSから名前付きpipeを開くホストOSから名前付きpipeを開くホストOSから名前付きpipeを開く$ socat unix-client:/hogehoge/com0.pipe stdioNetBSD/i386 (Amnesiac) (tty00)

login:

$ socat unix-client:/hogehoge/com0.pipe stdioNetBSD/i386 (Amnesiac) (tty00)

login:

$ socat unix-client:/hogehoge/com0.pipe stdioNetBSD/i386 (Amnesiac) (tty00)

login:

$ socat unix-client:/hogehoge/com0.pipe stdioNetBSD/i386 (Amnesiac) (tty00)

login:

$ socat unix-client:/hogehoge/com0.pipe stdioNetBSD/i386 (Amnesiac) (tty00)

login:

Page 21: スタート低レイヤー #0

何もかも解らない時どうすれば...何もかも解らない時どうすれば...何もかも解らない時どうすれば...何もかも解らない時どうすれば...何もかも解らない時どうすれば...static intvn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_t cred, int flags){

struct vnode *vp = (struct vnode *)fp->f_data;int count, error, ioflag, fflag;

ioflag = IO_ADV_ENCODE(fp->f_advice) | IO_UNIT;fflag = fp->f_flag;if (vp->v_type == VREG && (fflag & O_APPEND))

ioflag |= IO_APPEND;if (fflag & FNONBLOCK)

ioflag |= IO_NDELAY;if (fflag & FFSYNC || (vp->v_mount && (vp->v_mount->mnt_flag &

MNT_SYNCHRONOUS)))ioflag |= IO_SYNC;

else if (fflag & FDSYNC)ioflag |= IO_DSYNC;

if (fflag & FALTIO)ioflag |= IO_ALTSEMANTICS;

if (fflag & FDIRECT)ioflag |= IO_DIRECT;

vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);

static intvn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_t cred, int flags){

struct vnode *vp = (struct vnode *)fp->f_data;int count, error, ioflag, fflag;

ioflag = IO_ADV_ENCODE(fp->f_advice) | IO_UNIT;fflag = fp->f_flag;if (vp->v_type == VREG && (fflag & O_APPEND))

ioflag |= IO_APPEND;if (fflag & FNONBLOCK)

ioflag |= IO_NDELAY;if (fflag & FFSYNC || (vp->v_mount && (vp->v_mount->mnt_flag &

MNT_SYNCHRONOUS)))ioflag |= IO_SYNC;

else if (fflag & FDSYNC)ioflag |= IO_DSYNC;

if (fflag & FALTIO)ioflag |= IO_ALTSEMANTICS;

if (fflag & FDIRECT)ioflag |= IO_DIRECT;

vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);

static intvn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_t cred, int flags){

struct vnode *vp = (struct vnode *)fp->f_data;int count, error, ioflag, fflag;

ioflag = IO_ADV_ENCODE(fp->f_advice) | IO_UNIT;fflag = fp->f_flag;if (vp->v_type == VREG && (fflag & O_APPEND))

ioflag |= IO_APPEND;if (fflag & FNONBLOCK)

ioflag |= IO_NDELAY;if (fflag & FFSYNC || (vp->v_mount && (vp->v_mount->mnt_flag &

MNT_SYNCHRONOUS)))ioflag |= IO_SYNC;

else if (fflag & FDSYNC)ioflag |= IO_DSYNC;

if (fflag & FALTIO)ioflag |= IO_ALTSEMANTICS;

if (fflag & FDIRECT)ioflag |= IO_DIRECT;

vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);

static intvn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_t cred, int flags){

struct vnode *vp = (struct vnode *)fp->f_data;int count, error, ioflag, fflag;

ioflag = IO_ADV_ENCODE(fp->f_advice) | IO_UNIT;fflag = fp->f_flag;if (vp->v_type == VREG && (fflag & O_APPEND))

ioflag |= IO_APPEND;if (fflag & FNONBLOCK)

ioflag |= IO_NDELAY;if (fflag & FFSYNC || (vp->v_mount && (vp->v_mount->mnt_flag &

MNT_SYNCHRONOUS)))ioflag |= IO_SYNC;

else if (fflag & FDSYNC)ioflag |= IO_DSYNC;

if (fflag & FALTIO)ioflag |= IO_ALTSEMANTICS;

if (fflag & FDIRECT)ioflag |= IO_DIRECT;

vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);

static intvn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_t cred, int flags){

struct vnode *vp = (struct vnode *)fp->f_data;int count, error, ioflag, fflag;

ioflag = IO_ADV_ENCODE(fp->f_advice) | IO_UNIT;fflag = fp->f_flag;if (vp->v_type == VREG && (fflag & O_APPEND))

ioflag |= IO_APPEND;if (fflag & FNONBLOCK)

ioflag |= IO_NDELAY;if (fflag & FFSYNC || (vp->v_mount && (vp->v_mount->mnt_flag &

MNT_SYNCHRONOUS)))ioflag |= IO_SYNC;

else if (fflag & FDSYNC)ioflag |= IO_DSYNC;

if (fflag & FALTIO)ioflag |= IO_ALTSEMANTICS;

if (fflag & FDIRECT)ioflag |= IO_DIRECT;

vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);

Page 22: スタート低レイヤー #0

1. タグジャンプ1. タグジャンプ1. タグジャンプ1. タグジャンプ1. タグジャンプ

以下どれかを使うとソースコード追いやすい以下どれかを使うとソースコード追いやすい以下どれかを使うとソースコード追いやすい以下どれかを使うとソースコード追いやすい以下どれかを使うとソースコード追いやすい

☆ GNU GLOBAL☆ GNU GLOBAL☆ GNU GLOBAL☆ GNU GLOBAL☆ GNU GLOBAL

http://www.gnu.org/software/global/http://www.gnu.org/software/global/http://www.gnu.org/software/global/http://www.gnu.org/software/global/http://www.gnu.org/software/global/

☆ Exuberant Ctags☆ Exuberant Ctags☆ Exuberant Ctags☆ Exuberant Ctags☆ Exuberant Ctags

http://ctags.sourceforge.net/http://ctags.sourceforge.net/http://ctags.sourceforge.net/http://ctags.sourceforge.net/http://ctags.sourceforge.net/

>>>>>

Page 23: スタート低レイヤー #0

2. NetBSDドキュメント2. NetBSDドキュメント2. NetBSDドキュメント2. NetBSDドキュメント2. NetBSDドキュメント

☆ NetBSD Documentationのkernel章☆ NetBSD Documentationのkernel章☆ NetBSD Documentationのkernel章☆ NetBSD Documentationのkernel章☆ NetBSD Documentationのkernel章http://www.netbsd.org/docs/http://www.netbsd.org/docs/http://www.netbsd.org/docs/http://www.netbsd.org/docs/http://www.netbsd.org/docs/

☆ NetBSD Documentation: Kernel☆ NetBSD Documentation: Kernel☆ NetBSD Documentation: Kernel☆ NetBSD Documentation: Kernel☆ NetBSD Documentation: Kernelhttp://www.netbsd.org/docs/kernel/http://www.netbsd.org/docs/kernel/http://www.netbsd.org/docs/kernel/http://www.netbsd.org/docs/kernel/http://www.netbsd.org/docs/kernel/

☆ NetBSD Wikiのkernel関連☆ NetBSD Wikiのkernel関連☆ NetBSD Wikiのkernel関連☆ NetBSD Wikiのkernel関連☆ NetBSD Wikiのkernel関連http://wiki.netbsd.org/wiki/sitemap/http://wiki.netbsd.org/wiki/sitemap/http://wiki.netbsd.org/wiki/sitemap/http://wiki.netbsd.org/wiki/sitemap/http://wiki.netbsd.org/wiki/sitemap/

☆ NetBSD source code style guide☆ NetBSD source code style guide☆ NetBSD source code style guide☆ NetBSD source code style guide☆ NetBSD source code style guidehttp://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=1.49&content-type=text/x-cvsweb-markup&only_with_tag=MAINhttp://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=1.49&content-type=text/x-cvsweb-markup&only_with_tag=MAINhttp://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=1.49&content-type=text/x-cvsweb-markup&only_with_tag=MAINhttp://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=1.49&content-type=text/x-cvsweb-markup&only_with_tag=MAINhttp://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=1.49&content-type=text/x-cvsweb-markup&only_with_tag=MAIN

>>>>>

Page 24: スタート低レイヤー #0

3. 本3. 本3. 本3. 本3. 本

☆ 4.4BSDの設計と実装☆ 4.4BSDの設計と実装☆ 4.4BSDの設計と実装☆ 4.4BSDの設計と実装☆ 4.4BSDの設計と実装http://www.amazon.co.jp/dp/4756143466http://www.amazon.co.jp/dp/4756143466http://www.amazon.co.jp/dp/4756143466http://www.amazon.co.jp/dp/4756143466http://www.amazon.co.jp/dp/4756143466

☆ BSDカーネルの設計と実装☆ BSDカーネルの設計と実装☆ BSDカーネルの設計と実装☆ BSDカーネルの設計と実装☆ BSDカーネルの設計と実装http://www.amazon.co.jp/dp/4756146791http://www.amazon.co.jp/dp/4756146791http://www.amazon.co.jp/dp/4756146791http://www.amazon.co.jp/dp/4756146791http://www.amazon.co.jp/dp/4756146791

☆ 386BSDカーネルソースコードの秘密☆ 386BSDカーネルソースコードの秘密☆ 386BSDカーネルソースコードの秘密☆ 386BSDカーネルソースコードの秘密☆ 386BSDカーネルソースコードの秘密http://www.amazon.co.jp/dp/4756120423http://www.amazon.co.jp/dp/4756120423http://www.amazon.co.jp/dp/4756120423http://www.amazon.co.jp/dp/4756120423http://www.amazon.co.jp/dp/4756120423

>>>>>

Page 25: スタート低レイヤー #0

みなさんへのお願いみなさんへのお願いみなさんへのお願いみなさんへのお願いみなさんへのお願い

勉強会の運営には皆さんの協力が必要です!勉強会の運営には皆さんの協力が必要です!勉強会の運営には皆さんの協力が必要です!勉強会の運営には皆さんの協力が必要です!勉強会の運営には皆さんの協力が必要です!

☆ 好きな箇所を読んで発表☆ 好きな箇所を読んで発表☆ 好きな箇所を読んで発表☆ 好きな箇所を読んで発表☆ 好きな箇所を読んで発表

☆ NetBSD manの翻訳☆ NetBSD manの翻訳☆ NetBSD manの翻訳☆ NetBSD manの翻訳☆ NetBSD manの翻訳http://netbsdman.masterq.net/http://netbsdman.masterq.net/http://netbsdman.masterq.net/http://netbsdman.masterq.net/http://netbsdman.masterq.net/

☆ Metasepiプロジェクトへの参加☆ Metasepiプロジェクトへの参加☆ Metasepiプロジェクトへの参加☆ Metasepiプロジェクトへの参加☆ Metasepiプロジェクトへの参加http://metasepi.masterq.net/http://metasepi.masterq.net/http://metasepi.masterq.net/http://metasepi.masterq.net/http://metasepi.masterq.net/

>>>>>

Page 26: スタート低レイヤー #0

ということでソース読みましょう!ということでソース読みましょう!ということでソース読みましょう!ということでソース読みましょう!ということでソース読みましょう!

☆ printf関数から読む☆ printf関数から読む☆ printf関数から読む☆ printf関数から読む☆ printf関数から読む

☆ I/Oポートアクセスから読む☆ I/Oポートアクセスから読む☆ I/Oポートアクセスから読む☆ I/Oポートアクセスから読む☆ I/Oポートアクセスから読む

あなたはどっち?あなたはどっち?あなたはどっち?あなたはどっち?あなたはどっち?

>>>>>

Page 27: スタート低レイヤー #0

参考資料参考資料参考資料参考資料参考資料

☆ 本勉強会まとめサイト☆ 本勉強会まとめサイト☆ 本勉強会まとめサイト☆ 本勉強会まとめサイト☆ 本勉強会まとめサイトhttp://start_printf.masterq.net/http://start_printf.masterq.net/http://start_printf.masterq.net/http://start_printf.masterq.net/http://start_printf.masterq.net/

>>>>>