#author("2016-09-02T13:10:47+09:00","default:afuruta","afuruta") * Linux Kernel の見取り図 [#u00e790d] #ref(Linux_bigmap_for_driver_developer.png); 標準ライブラリ |機能単位|主なヘッダやソース|備考|h |型定義|&ogfileone(include/linux/types.h);&br;|コンパイラは inttypes.h, stdint.h を提供しています。| |定数、最大、最小|&ogfileone(include/linux/kernel.h);&br;&ogfileone(include/linux/stddef.h);&br;&ogfileone(include/uapi/linux/limits.h);&br;&ogfileone(include/linux/sizes.h);|uapi/linux/limits.h は linux/limits.h で include します。| |構造体オフセット|&ogfileone(include/linux/stddef.h);&br;&ogfileone(include/linux/kernel.h);&br;|メンバーからそれを保持する構造体へ変換するマクロ &ogdefs(container_of(),container_of,include/linux/kernel.h); もここに含めます。| |文字|&ogfileone(include/linux/ctype.h);|| |文字列・メモリ|&ogfileone(include/linux/string.h);&br;&ogfileone(include/linux/glob.h);&br;&ogfileone(include/linux/string_helpers.h);&br;&ogfileone(include/linux/textsearch.h);&br;&ogfileone(include/linux/textsearch_fsm.h);&br;&ogfileone(include/linux/ihex.h);|| |文字列変換|&ogfileone(include/linux/kernel.h);&br;&ogfileone(include/linux/parser.h);|strtoxxx は kstrtoxxx という関数になっています。| |書式フォーマット|&ogfileone(include/linux/kernel.h);|| |計算(数値)|&ogfileone(include/linux/kernel.h);&br;&ogfile(div64.h);&br;&ogfileone(include/linux/gcd.h);&br;&ogfileone(include/linux/lcm.h);&br;&ogfileone(include/linux/log2.h);&br;&ogfileone(include/linux/math64.h);&br;&ogfileone(include/linux/mpi.h);|| |計算(ビット)|&ogfileone(include/linux/bcd.h);&br;&ogfile(include/linux/bitops.h);&br;&ogfile(asm/bitops.h);&br;&ogfileone(include/linux/bitrev.h);&br;&ogfileone(include/linux/bitmap.h);&br;&ogfileone(include/asm-generic/bitops/const_hweight.h);&br;&ogfile(include/asm-generic/bitops/ffs.h);&br;&ogfile(include/asm-generic/bitops/fls.h);&br;&ogfile(include/asm-generic/bitops/find.h);&hr;&ogfileone(include/linux/crc-ccitt.h);&br;&ogfileone(include/linux/crc-itu-t.h);&br;&ogfileone(include/linux/crc-t10dif.h);&br;&ogfileone(include/linux/crc16.h);&br;&ogfileone(include/linux/crc32.h);&br;&ogfileone(include/linux/crc32c.h);&br;&ogfileone(include/linux/crc7.h);&br;&ogfileone(include/linux/crc8.h);|asm/bitops.h はプロセッサ毎に定義されています。asm/bitops.h は linux/bitops.h で include されます。直接 include しない方が良いでしょう。&br;asm-generic/bitops/const_hweight.h は linux/bitops.h を include すると取り込まれます。ビットを数え上げる計算です。ファイル名に const がついていますが、即値と変数両方に使えるマクロです。gcc の組み込み関数 __builtin_constant_p() を使用して静的な定数と変数に対する計算をそれぞれ最適化しています。| |エンディアン変換|&ogfileone(include/linux/byteorder/generic.h);&br;&ogfileone(include/linux/swab.h);|linux/byteorder/generic.h は関数一覧として挙げてあります。実際は各アーキテクチャに最適な変換処理を利用するので &ogfile(asm/byteorder.h); をインクルードします。| |アルゴリズム|&ogfileone(include/linux/average.h);&br;&ogfileone(include/linux/bch.h);&br;&ogfileone(include/linux/bpf.h);&br;&ogfileone(include/linux/bsearch.h);&br;&ogfileone(include/linux/btree.h);&br;&ogfileone(include/linux/circ_buf.h);&br;&ogfileone(include/linux/cordic.h);&br;&ogfileone(include/linux/plist.h);&br;&ogfileone(include/linux/sort.h);&br;&ogfileone(include/linux/range.h);&br;&ogfileone(include/linux/rbtree.h);&br;&ogfileone(include/linux/rslib.h);&hr;&ogfileone(include/linux/crypto.h);&br;&ogfileone(include/linux/cryptohash.h);&br;&ogfileone(include/linux/cryptouser.h);&hr;&ogfileone(include/linux/hash.h);&br;&ogfileone(include/linux/hashtable.h);&br;&ogfileone(include/linux/jhash.h);|| |圧縮|&ogfileone(include/linux/lz4.h);&br;&ogfileone(include/linux/lzo.h);&br;&ogfileone(include/linux/xz.h);&br;&ogfileone(include/linux/zlib.h);|| リンク・リスト |機能単位|主なヘッダやソース|備考|h |リスト操作|&ogfileone(include/linux/list.h);|リンク・リスト・メンバーからそれを保持する構造体へ変換するマクロ &ogdefs(list_entry(),list_entry,include/linux/list.h); は &ogdefs(container_of(),container_of,include/linux/kernel.h); と同じです。リスト操作に関連するならば &ogdefs(list_entry(),list_entry,include/linux/list.h); を使用して下さい。| アトミック操作 |機能単位|主なヘッダやソース|備考|h |整数|&ogfileone(include/linux/atomic.h);&br;&ogfile(asm/atomic.h);|asm/atomic.h はプロセッサ毎に定義されています。asm/atomic.h は linux/atomic.h で include されます。直接 include しない方が良いでしょう。| |ビット||| 排他制御 |機能単位|主なヘッダやソース|備考|h |Spin Lock||| |Semaphore||| 同期制御、状態変化待ち |機能単位|主なヘッダやソース|h |Event|| 割り込み処理 |機能単位|主なヘッダやソース|備考|h |IRQ class||| 時間待ち、タイマー |機能単位|主なヘッダやソース|備考|h |Sleep||| |Timer||| 時刻 |機能単位|主なヘッダやソース|備考|h |jiffies||| |Time||| メモリ確保 |機能単位|主なヘッダやソース|備考|h |任意サイズ|&ogfileone(include/linux/slab.h);|| |ページ単位|&ogfileone(include/linux/gfp.h);&br;&ogfileone(include/linux/mm.h);|ページ確保: gfp.h &ogdefs(alloc_page(),alloc_page,gfp.h); 、ページ・アドレス取得: mm.h &ogdefs(page_address(),page_address,mm.h); となっています。| 論理-物理マップ、DMA 転送、コピー |機能単位|主なヘッダやソース|h |User - Kernel Copy|| |Virt - Phy map convert|| |DMA map Scatter Gather|| スレッド・軽量処理 |機能単位|主なヘッダやソース|h |kthread|| |work queue|| |tasklet|| 接続切断通知 |機能単位|主なヘッダやソース|h |UEvent|| |switch (Android)|| リファレンスカウンタ |機能単位|主なヘッダやソース|h |kref|| Kernel Object |機能単位|主なヘッダやソース|備考|h |KObject||| |KSet||| ノード形成 |機能単位|主なヘッダやソース|備考|h |VFS(character)||| |VFS(block)||| |procfs||| |sysfs||| |debugfs||| モジュールロード、アンロード、シンボル解決 |機能単位|主なヘッダやソース|備考|h |Module insmod rmmod||| |Symbol lookup||| 基本的なドライバ |機能単位|主なヘッダやソース|h |Null, Zero, Full, Mem drivers|| 基本的なファイルシステムノード |機能単位|主なヘッダやソース|備考|h |pipe||| |eventfd||| |signalfd||| |timerfd|||