ldd3-chapter2

了解 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)

參考來源