スタート低レイヤー #0

Kiwamu Okabe
Kiwamu OkabeSoftware Engineer at SELTECH CORPORATION em SELTECH CORPORATION
スタート低レイヤー #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/
1 de 27

Mais conteúdo relacionado

Mais procurados

Node 学園祭 2012 用Node 学園祭 2012 用
Node 学園祭 2012 用Rei Kawai
2.6K visualizações9 slides
2012 11-17.nagoyapm082012 11-17.nagoyapm08
2012 11-17.nagoyapm08IWATA Susumu
2K visualizações73 slides
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
4K visualizações13 slides
2012-09-09.nagoyapm072012-09-09.nagoyapm07
2012-09-09.nagoyapm07IWATA Susumu
849 visualizações44 slides

Mais procurados(20)

Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 half
tomoaki07054.3K visualizações
Node 学園祭 2012 用Node 学園祭 2012 用
Node 学園祭 2012 用
Rei Kawai2.6K visualizações
2012 11-17.nagoyapm082012 11-17.nagoyapm08
2012 11-17.nagoyapm08
IWATA Susumu2K visualizações
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
y-uti4K visualizações
2012-09-09.nagoyapm072012-09-09.nagoyapm07
2012-09-09.nagoyapm07
IWATA Susumu849 visualizações
C83 λカ娘の販促にやってきましたC83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきました
Kiwamu Okabe1.4K visualizações
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
Yuto Takei1.2K visualizações
たのしいNode.jsたのしいNode.js
たのしいNode.js
ishiki-takai1.7K visualizações
あるキャッシュメモリの話あるキャッシュメモリの話
あるキャッシュメモリの話
nullnilaki3.8K visualizações
あるmmapの話あるmmapの話
あるmmapの話
nullnilaki4.6K visualizações
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
MITSUNARI Shigeo6.3K visualizações
VAEで遊んでみるVAEで遊んでみる
VAEで遊んでみる
超史 宮崎4K visualizações
Node native extNode native ext
Node native ext
裕士 常田252 visualizações
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみた
firewood1.1K visualizações
What is Metasepi?What is Metasepi?
What is Metasepi?
Kiwamu Okabe2K visualizações

Destaque

Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11Takashi Kawachi
938 visualizações24 slides
Programming Haskell Chapter8Programming Haskell Chapter8
Programming Haskell Chapter8Kousuke Ruichi
4.1K visualizações77 slides
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10Kousuke Ruichi
3.8K visualizações58 slides
第3章 型とクラス第3章 型とクラス
第3章 型とクラスYasuaki Takebe
2.3K visualizações19 slides
Purescript with MonadPurescript with Monad
Purescript with MonadKousuke Ruichi
13.4K visualizações60 slides
An engineer uses monadsAn engineer uses monads
An engineer uses monadsKousuke Ruichi
5.9K visualizações67 slides

Destaque(9)

Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
Takashi Kawachi938 visualizações
Programming Haskell Chapter8Programming Haskell Chapter8
Programming Haskell Chapter8
Kousuke Ruichi4.1K visualizações
Programming haskell chapter10Programming haskell chapter10
Programming haskell chapter10
Kousuke Ruichi3.8K visualizações
第3章 型とクラス第3章 型とクラス
第3章 型とクラス
Yasuaki Takebe2.3K visualizações
Purescript with MonadPurescript with Monad
Purescript with Monad
Kousuke Ruichi13.4K visualizações
An engineer uses monadsAn engineer uses monads
An engineer uses monads
Kousuke Ruichi5.9K visualizações
ゆるふわなHaskell話ゆるふわなHaskell話
ゆるふわなHaskell話
Kousuke Ruichi4.5K visualizações
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi9K visualizações

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

InfiniBand on DebianInfiniBand on Debian
InfiniBand on DebianTaisuke Yamada
5.5K visualizações61 slides
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例OSSラボ株式会社
5K visualizações14 slides
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kKenji Aoyama
2.7K visualizações41 slides
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_writekusabanachi
612 visualizações43 slides
NetBSD/evbarm on Raspberry PiNetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry Pitokudahiroshi
2.3K visualizações8 slides

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

InfiniBand on DebianInfiniBand on Debian
InfiniBand on Debian
Taisuke Yamada5.5K visualizações
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
OSSラボ株式会社5K visualizações
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88k
Kenji Aoyama2.7K visualizações
dofilewrite and vn_writedofilewrite and vn_write
dofilewrite and vn_write
kusabanachi612 visualizações
NetBSD/evbarm on Raspberry PiNetBSD/evbarm on Raspberry Pi
NetBSD/evbarm on Raspberry Pi
tokudahiroshi2.3K visualizações
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo7.8K visualizações
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
Makiko Konoshima1.1K visualizações
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
y-uti10.1K visualizações
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
magoroku Yamamoto2.7K visualizações
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
Manabu Ori9.3K visualizações
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
Hiro Yoshioka461 visualizações
initramfsについてinitramfsについて
initramfsについて
Kazuhiro Nishiyama14.3K visualizações
Riscv+fpga200606Riscv+fpga200606
Riscv+fpga200606
たけおか しょうぞう670 visualizações
about DakotagUIabout DakotagUI
about DakotagUI
Etsuji Nomura674 visualizações
20170527 inside .NET Core on Linux20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux
Takayoshi Tanaka1.5K visualizações
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
Kouhei Maeda1.3K visualizações

スタート低レイヤー #0