了解 Linux Kernel Driver
更新記錄
item | note |
---|---|
20160608 | 第一版 |
目錄
Linux Kernel
核心源碼
- 一般核心源碼安裝於 /usr/src/linux
- Linux核心僅使使用了C99功能的一個子集
kernel source tree
目錄 | 說明 |
---|---|
arch | 特定架構的源碼 |
block | 區塊I/O層 |
crypto | Crypto API |
Documentation | 核心原碼文件 |
drivers | 裝置驅動程式 |
firwmare | 特定驅動式需要用到的韌体 |
fs | VFS和各種的檔案系統 |
include | 核心標頭檔 |
init | 核心的啟動和初始化 |
ipc | 行程間通訊的程式碼 |
kernel | 基礎(core)子系統,像是排程器 |
mm | 記憶体管理子系統和VM |
net | 網路子系統 |
samples | 樣本、範例程式碼 |
scripts | 用於建立核心的命令稿 |
security | linux 安全模組 |
sound | 音效子系統 |
usr | 開始階段的用戶空間程式碼(initramfs) |
tools | 對Linux開發有用的工具 |
virt | 虛擬化基礎架構 |
寫核心需要注意項事
- 沒有記憶体保謢機制
- ex. 當你操作NULL的指標,將會導致oops的結果
- 容量小而長度固定的堆疊
- 32bit CPU 的stack只有2個分頁即8K的大小
- Linux為preemptivve multitasking(抢占式多任务处理),因為在處理spinlock(自旋鎖)或seamphore(號誌)要特別小心
GCC
Language Standards Supported by GCC">Language Standards Supported by GCC
- The original ANSI C standard (X3.159-1989) was ratified in 1989 and published in 1990
- ANSIC 標準有下例3種
ANSIC C | Description | library |
---|---|---|
C89 ,C90 | -ansi, -std=c90 or -std=iso9899:1990 | <float.h> <stdarg.h> <stddef.h> |
C99 | -std=c99 or -std=iso9899:1999 | <stdbool.h> <stdint.h> |
C11 | -std=c11 or -std=iso9899:2011 | <stdalign.h> <stdnoreturn.h> |
- By default, GCC provides some extensions to the C language that, on rare occasions conflict with the C standard
- Extensions to the C Language Family
- The default, if no C language dialect options are given, is -std=gnu11.
GCC |
---|
-std=gnu90 (for C90 with GNU extensions |
-std=gnu99 (for C99 with GNU extensions) |
-std=gnu11 (for C11 with GNU extensions) |