スタート低レイヤー #0

  • 2,210 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,210
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
19
Comments
0
Likes
16

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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%29PC16550I/Oポート0x3F8にASCIIコードを書けばOK
  • 13. printf => I/Oポート の間は?
  • 14. backtrace取ってみたよ
  • 15. ソースコードの取得CVS$ cat ~/.cvsrcdiff -cuupdate -dPcheckout -Pcvs -z3 -q$ cvs -d :pserver:anoncvs@anoncvs.jp.netbsd.org:/cvs/cvsroot loginLogging in to :pserver:anoncvs@anoncvs.jp.netbsd.org:2401/cvs/cvsrootCVS password: anoncvs$ cvs -d :pserver:anoncvs@anoncvs.jp.netbsd.org:/cvs/cvsroot co -rnetbsd-6-0-1-RELEASE srcGit$ git clone git://github.com/jsonn/src.git$ git checkout -b netbsd_6_0 remotes/origin/netbsd_6_0
  • 16. 読むべきソースコードの在処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 := バーチャルメモリ他のディレクトリはおいおい説明します
  • 17. ドキュメントはmanpagehttp://netbsd.gw.com/cgi-bin/man-cgihttp://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 netbsdnetbsd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),statically linked, for NetBSD 6.0, not strippedコードをちょっと変えて動作を見たいときどうぞ
  • 19. 実行環境: NetBSD + virtualboxisoで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 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
  • 20. virtualboxでシリアルコンソールhttp://www.reactos.org/wiki/VirtualBoxvirtualboxのシリアルを名前付きpipeに設定http://www.cetus-net.org/bsd/i386/serial.htmlNetBSD側でシリアルコンソールを有効に# 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を開く$ socat unix-client:/hogehoge/com0.pipe stdioNetBSD/i386 (Amnesiac) (tty00)login:
  • 21. 何もかも解らない時どうすれば...static intvn_write(file_t *fp, off_t *offset, struct uio *uio, kauth_cred_tcred, 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 GLOBALhttp://www.gnu.org/software/global/☆ Exuberant Ctagshttp://ctags.sourceforge.net/
  • 23. 2. NetBSDドキュメント☆ NetBSD Documentationのkernel章http://www.netbsd.org/docs/☆ NetBSD Documentation: Kernelhttp://www.netbsd.org/docs/kernel/☆ NetBSD Wikiのkernel関連http://wiki.netbsd.org/wiki/sitemap/☆ 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=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/