SlideShare a Scribd company logo
1 of 27
Download to read offline
スタート低レイヤー #0


 Kiwamu Okabe
私は誰?
☆ Twitter: @master_q
☆ ミラクル・リナックス勤務
☆ 前はコピー機のOSをNetBSDで作ってた
☆ デジタルサイネージのソフト開発してます
☆ OSSに興味のある{エンジニア,インターン}
募集中です!
この勉強会は何?
☆ UNIXモドキのOSを理解するために
☆ printf関数の動作を題材にして
☆ NetBSDソースコードを読んだり
☆ NetBSD manpageを読んだり
する勉強会です
この勉強会の進め方
☆ backtraceを見て
☆ 興味のある箇所を参加者が調べて発表
☆ 調べる方法を有識者がフォロー
☆ printfの動作完全理解で勉強会卒業!
つまり打ち出の小槌ですヨ!
でもまたなんでprintfなの?
☆ OSの学び方とか聞いたことありますか?
☆ ぼくのケース := 会社入っていきなり仕事
☆ 独学でした... #orz
☆ 10年ぐらいNetBSDのお守り
☆ 皆さんには近道を通ってほしい!
ダメな例1: UNIX本読む
☆ 各部品については理解できる
☆ 部品と部品の繋がりがイメージできない
☆ よってkernel全体感も掴めない
☆ 細かい部品についてはコード読まないと
☆ 本読むのは良いけどそれだけじゃぁ...
ダメな例2: 自作OS
☆ 楽しいけど...
☆ x86セグメントとかイキナリ
☆ デバイス周りやVMなど下側ばかり
☆ バスドライバなど抽象まで辿りつけない
☆ 上に複雑なアプリケーションはいない
☆ 結果: 単なるデバドラ屋になりさがる...
ダメな例3: 起動プロセスを調べる
☆ プロセスの生成、光あれ!
☆ 過渡と定常
☆ 過渡ばかり覚える
☆ 定常 := 機器が動いている時
☆ アプリ結合で思考停止する人間になる
じゃあ何が近道なのさ!?
☆ フリーUNIXのソース全部読めってか?
☆ 無理だぽー
☆ シナリオが必要です
☆ 最も簡単そうなシナリオは?
☆ printf関数の動作じゃね
簡単なプログラムを作りました
/* whileprint.c */
#include <stdio.h>

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



このプログラムをシリアルコンソールから実行
すれば、 PCのシリアルポートに"."をひたすら書
くだけのはず。
x86のシリアルポートのしくみ
http://community.osdev.info/index.php?%28serial%29PC16550


I/Oポート0x3F8にASCIIコードを書けばOK
printf => I/Oポート の間は?
backtrace取ってみたよ
ソースコードの取得
CVS
$ cat ~/.cvsrc
diff -cu
update -dP
checkout -P
cvs -z3 -q
$ cvs -d :pserver:anoncvs@anoncvs.jp.netbsd.org:/cvs/cvsroot login
Logging in to :pserver:anoncvs@anoncvs.jp.netbsd.org:2401/cvs/
cvsroot
CVS password: anoncvs
$ cvs -d :pserver:anoncvs@anoncvs.jp.netbsd.org:/cvs/cvsroot co -r
netbsd-6-0-1-RELEASE src


Git
$ git clone git://github.com/jsonn/src.git
$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0
読むべきソースコードの在処
src/lib/libc            :=   libc
src/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             :=   バーチャルメモリ


他のディレクトリはおいおい説明します
ドキュメントはmanpage
http://netbsd.gw.com/cgi-bin/man-cgi
http://netbsdman.masterq.net/
翻訳環境構築中
開発環境: build.sh
以下の手順で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 netbsd
netbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
statically linked, for NetBSD 6.0, not stripped


コードをちょっと変えて動作を見たいときどうぞ
実行環境: NetBSD + virtualbox
isoでvirtualboxにNetBSDをインストール
ftp://iso.jp.netbsd.org/pub/NetBSD/iso/6.0.1/NetBSD-6.0.1-i386.iso


さっきコンパイルしたkernelを/netbsd.testの
名前でvirtualboxインスタンスに置く
以下のように/boot.cfgを設定
menu=Boot   normally:rndseed /var/db/entropy-file;boot netbsd
menu=Boot   ddb:rndseed /var/db/entropy-file;boot netbsd.test -d
menu=Boot   single user:rndseed /var/db/entropy-file;boot netbsd -s
menu=Drop   to boot prompt:prompt
default=1
timeout=5
clear=1
virtualboxでシリアルコンソール
http://www.reactos.org/wiki/VirtualBox


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


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


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

login:
何もかも解らない時どうすれば...
static int
vn_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;
1. タグジャンプ
以下どれかを使うとソースコード追いやすい
☆ GNU GLOBAL
http://www.gnu.org/software/global/
☆ Exuberant Ctags
http://ctags.sourceforge.net/
2. NetBSDドキュメント
☆ NetBSD Documentationのkernel章
http://www.netbsd.org/docs/


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


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


☆ NetBSD source code style guide
http://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?
rev=1.49&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
3. 本
☆ 4.4BSDの設計と実装
http://www.amazon.co.jp/dp/4756143466


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


☆ 386BSDカーネルソースコードの秘密
http://www.amazon.co.jp/dp/4756120423
みなさんへのお願い
勉強会の運営には皆さんの協力が必要です!
☆ 好きな箇所を読んで発表
☆ NetBSD manの翻訳
http://netbsdman.masterq.net/


☆ Metasepiプロジェクトへの参加
http://metasepi.masterq.net/
ということでソース読みましょう!
☆ printf関数から読む
☆ I/Oポートアクセスから読む
あなたはどっち?
参考資料
☆ 本勉強会まとめサイト
http://start_printf.masterq.net/

More Related Content

What's hot

Cvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halftomoaki0705
 
Node 学園祭 2012 用
Node 学園祭 2012 用Node 学園祭 2012 用
Node 学園祭 2012 用Rei Kawai
 
2012 11-17.nagoyapm08
2012 11-17.nagoyapm082012 11-17.nagoyapm08
2012 11-17.nagoyapm08IWATA Susumu
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
2012-09-09.nagoyapm07
2012-09-09.nagoyapm072012-09-09.nagoyapm07
2012-09-09.nagoyapm07IWATA Susumu
 
C83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきましたC83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきましたKiwamu Okabe
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうksk sue
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.jsishiki-takai
 
あるキャッシュメモリの話
あるキャッシュメモリの話あるキャッシュメモリの話
あるキャッシュメモリの話nullnilaki
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPGuchan_nos
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話nullnilaki
 
VAEで遊んでみる
VAEで遊んでみるVAEで遊んでみる
VAEで遊んでみる超史 宮崎
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
Xcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたfirewood
 
Routerboard勉強会 tips
Routerboard勉強会 tipsRouterboard勉強会 tips
Routerboard勉強会 tipskometch H
 

What's hot (20)

Cvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 half
 
Node 学園祭 2012 用
Node 学園祭 2012 用Node 学園祭 2012 用
Node 学園祭 2012 用
 
2012 11-17.nagoyapm08
2012 11-17.nagoyapm082012 11-17.nagoyapm08
2012 11-17.nagoyapm08
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
2012-09-09.nagoyapm07
2012-09-09.nagoyapm072012-09-09.nagoyapm07
2012-09-09.nagoyapm07
 
C83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきましたC83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきました
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
あるキャッシュメモリの話
あるキャッシュメモリの話あるキャッシュメモリの話
あるキャッシュメモリの話
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 
VAEで遊んでみる
VAEで遊んでみるVAEで遊んでみる
VAEで遊んでみる
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
Node native ext
Node native extNode native ext
Node native ext
 
Xcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみた
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
Routerboard勉強会 tips
Routerboard勉強会 tipsRouterboard勉強会 tips
Routerboard勉強会 tips
 

Viewers also liked

Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11Takashi Kawachi
 
Programming Haskell Chapter8
Programming Haskell Chapter8Programming Haskell Chapter8
Programming Haskell Chapter8Kousuke Ruichi
 
Programming haskell chapter10
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10Kousuke Ruichi
 
第3章 型とクラス
第3章 型とクラス第3章 型とクラス
第3章 型とクラスYasuaki Takebe
 
An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monadsKousuke Ruichi
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話Kousuke Ruichi
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかKousuke Ruichi
 

Viewers also liked (9)

Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 
Programming Haskell Chapter8
Programming Haskell Chapter8Programming Haskell Chapter8
Programming Haskell Chapter8
 
Programming haskell chapter10
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10
 
第3章 型とクラス
第3章 型とクラス第3章 型とクラス
第3章 型とクラス
 
Purescript with Monad
Purescript with MonadPurescript with Monad
Purescript with Monad
 
An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monads
 
ゆるふわなHaskell話
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
 

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

A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kKenji Aoyama
 
dofilewrite and vn_write
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_writekusabanachi
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス5mingame2
 
NetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry PiNetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry Pitokudahiroshi
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめMakiko Konoshima
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇Manabu Ori
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)inaz2
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp CodereadingHiro Yoshioka
 
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Mr. Vengineer
 
20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux20170527 inside .NET Core on Linux
20170527 inside .NET Core on LinuxTakayoshi Tanaka
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりYuya Rin
 

Similar to スタート低レイヤー #0 (20)

InfiniBand on Debian
InfiniBand on DebianInfiniBand on Debian
InfiniBand on Debian
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88k
 
dofilewrite and vn_write
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_write
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
NetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry PiNetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry Pi
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
 
Riscv+fpga200606
Riscv+fpga200606Riscv+fpga200606
Riscv+fpga200606
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつり
 

スタート低レイヤー #0