狠狠撸
Submit Search
スタート低レイヤー #0
?
16 likes
?
3,140 views
Kiwamu Okabe
Follow
1 of 27
Download now
Download to read offline
More Related Content
スタート低レイヤー #0
1.
スタート低レイヤー #0 Kiwamu
Okabe
2.
私は誰? ☆ Twitter: @master_q ☆
ミラクル?リナックス勤務 ☆ 前はコピー機のOSをNetBSDで作ってた ☆ デジタルサイネージのソフト開発してます ☆ OSSに興味のある{エンジニア,インターン} 募集中です!
3.
この勉強会は何? ☆ UNIXモドキのOSを理解するために ☆ printf関数の動作を題材にして ☆
NetBSDソースコードを読んだり ☆ NetBSD manpageを読んだり する勉強会です
4.
この勉強会の進め方 ☆ backtraceを見て ☆ 興味のある箇所を参加者が調べて発表 ☆
調べる方法を有識者がフォロー ☆ printfの動作完全理解で勉強会卒業!
5.
つまり打ち出の小槌ですヨ!
6.
でもまたなんでprintfなの? ☆ OSの学び方とか聞いたことありますか? ☆ ぼくのケース
:= 会社入っていきなり仕事 ☆ 独学でした... #orz ☆ 10年ぐらいNetBSDのお守り ☆ 皆さんには近道を通ってほしい!
7.
ダメな例1: UNIX本読む ☆ 各部品については理解できる ☆
部品と部品の繋がりがイメージできない ☆ よってkernel全体感も掴めない ☆ 細かい部品についてはコード読まないと ☆ 本読むのは良いけどそれだけじゃぁ...
8.
ダメな例2: 自作OS ☆ 楽しいけど... ☆
x86セグメントとかイキナリ ☆ デバイス周りやVMなど下側ばかり ☆ バスドライバなど抽象まで辿りつけない ☆ 上に複雑なアプリケーションはいない ☆ 結果: 単なるデバドラ屋になりさがる...
9.
ダメな例3: 起動プロセスを調べる ☆ プロセスの生成、光あれ! ☆
過渡と定常 ☆ 過渡ばかり覚える ☆ 定常 := 機器が動いている時 ☆ アプリ結合で思考停止する人間になる
10.
じゃあ何が近道なのさ!? ☆ フリーUNIXのソース全部読めってか? ☆ 無理だぽー ☆
シナリオが必要です ☆ 最も簡単そうなシナリオは? ☆ printf関数の動作じゃね
11.
簡単なプログラムを作りました /* whileprint.c */ #include
<stdio.h> int main() { while(1) { printf("."); } } このプログラムをシリアルコンソールから実行 すれば、 PCのシリアルポートに"."をひたすら書 くだけのはず。
12.
x86のシリアルポートのしくみ http://community.osdev.info/index.php?%28serial%29PC16550 I/Oポート0x3F8にASCIIコードを書けばOK
13.
printf => I/Oポート
の间は?
14.
产补肠办迟谤补肠别取ってみたよ
15.
ソースコードの取得 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
16.
読むべきソースコードの在処 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 := バーチャルメモリ 他のディレクトリはおいおい説明します
17.
ドキュメントはmanpage http://netbsd.gw.com/cgi-bin/man-cgi http://netbsdman.masterq.net/ 翻訳環境構築中
18.
開発環境: 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 コードをちょっと変えて動作を見たいときどうぞ
19.
実行環境: 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
20.
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:
21.
何もかも解らない時どうすれば... 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;
22.
1. タグジャンプ 以下どれかを使うとソースコード追いやすい ☆ GNU
GLOBAL http://www.gnu.org/software/global/ ☆ Exuberant Ctags http://ctags.sourceforge.net/
23.
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
24.
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
25.
みなさんへのお願い 勉強会の運営には皆さんの協力が必要です! ☆ 好きな箇所を読んで発表 ☆ NetBSD
manの翻訳 http://netbsdman.masterq.net/ ☆ Metasepiプロジェクトへの参加 http://metasepi.masterq.net/
26.
ということでソース読みましょう! ☆ printf関数から読む ☆ I/Oポートアクセスから読む あなたはどっち?
27.
参考資料 ☆ 本勉強会まとめサイト http://start_printf.masterq.net/
Download