2.2 核心原始碼樹
arch 特定體系結構的原始碼
block crypto api
crypto 核心原始碼文件
drivers 裝置驅動程式
firmware
fs vfs和各種檔案系統
include 核心標頭檔案
init 核心引導和初始化
ipc 程序間通訊**
kernel 像排程程式這樣的核心子系統
lib 通用核心函式
makefile
makefile.common
mm 記憶體管理子系統和vm
module.symvers
net 網路子系統
samples
scripts 編譯核心所用的指令碼
security linux安全模組
sound 語音子系統
system.map
tools
usr 早期使用者空間**
virt
2.3 編譯核心
配置核心(不同的選項)
make config
make menuconfig
make xconfig
make gconfig
建立預設配置
make defconfig
make oldconfig
編譯make
記錄編譯資訊
make >../log.txt
互略編譯資訊
make >/dev/null
衍生多個編譯作業
make -j?
如雙核處理器上,每個處理器衍生兩個作業
make -j4
安裝模組
make modules_install
2.4 核心開發的特點
1.沒有libc庫
大部分常用的c庫函式在核心中都已經得到了實現
2.gnu c
內聯函式
把對時間要求比較高而本身長度又比較短的函式定義成內聯函式
static inline void test(unsigned long tail_size)
內聯函式必須在使用前就定義好,一般在標頭檔案或者檔案頭中定義內聯函式
內聯彙編
分支宣告(為了優化)
likely()
unlikely()
if(unlikely(foo)
if (likely(foo))
3.沒有記憶體保護機制
4.不要輕易在核心中使用浮點數
5.核心空間具有容積小而固定的棧
6.同步和併發
7.可移植性
三.程序管理
程序是處於執行期的程式以及它所包含的資源的總稱
3.1程序描述符及任務結構
核心把程序存放在任務佇列中
任務佇列是各雙向迴圈鍊錶,鍊錶中的每一項都是型別為task_struct,成為程序描述符的結構
定義在檔案中
程序描述符中包含乙個具體程序的所有資訊
task_struct在32位機器上有1.7k位元組
其中包含的資料能完整的描述乙個正在執行的程式
(開啟的檔案,程序的位址空間,掛起的訊號,程序的狀態還有其他更多資訊)
3.1.1分配程序描述符
通過slab分配器分配task_struct結構
3.1.2程序描述符的存放
核心通過乙個唯一的程序標識值或pid類標識每個程序
pid最大預設值為32768(short int的最大值)
也可以修改/proc/sys/kernle/pid_max來提高上限
3.1.3程序狀態
程序描述符中的state域描述了程序的當前狀態,系統中每個程序都必須處於五種狀態中的一種
task_running(執行)
task_interruptible(可中斷)
task_uninterruptible(不可中斷)
task_zombie(僵死)
task_stopped(停止)
3.1.4 設定當前程序狀態
set_task_state(task,state);
/將任務task的狀態設定為state/
set_current_state(state) <=> set_stask_state(current,state)
3.1.5程序上下文
3.1.6程序家族樹
所有的程序都是pid為1的init程序的後台
核心在系統啟動的最後階段啟動init程序
該程序讀取系統的初始化指令碼並執行其他的相關程式
程序間的關係存放在程序描述符中
每個tack_struct都包含乙個指向其父程序task_struct,叫做parent的指標
獲取其父程序的程序描述符:
struct task_struct *my_parent = ourrent->parent;
訪問子程序:
struct task_struct *task;
struct list_head *list;
list_for_each(list,$current->children)
struct task_struct task;
for (task =current;task != $init_task; task= task->parent)
/ task 現在指向init */
五.系統呼叫
5.1 api.posix.c
5.2 系統呼叫(系統呼叫號)
5.3 系統呼叫處理程式
int $0x80(十進位制128) system_call()
第128號異常處理程式
系統呼叫號通過eax暫存器傳遞給核心
call *sys_call_table(,%eax,4)
系統呼叫表的表項是以32位型別存放的,所以核心需要將給定的系統呼叫號乘以4,然後查詢
引數傳遞:ebx,ecx,edx,esi和edi按照順序存放前五個引數
5.4 系統呼叫的實現
5.5 系統呼叫上下文
entry.s(系統呼叫表)
六.中斷和中斷處理程式
irq:中斷請求
isr:中斷服務例程
6.3 註冊中斷處理程式
int request_irq(unsigned int irq,
irqreturn_t(*handler)(int,void *,struct pt_regs ),
unsighed long irqflags,
const char devname,
void *dev_id)
引數說明:
irq:要分配的中斷號
handler:指標,指向處理這個中斷的世紀中斷處理程式。
handler函式的原型是特定的,接受三個引數,並有乙個型別為irqresutn_t的返回值。
irqflags:可以為0,也可以為下列標誌的位掩碼
sa_interrupt:表示給定的中斷處理程式是乙個快速中斷處理程式
sa_sample_random:
sa_shirq:
devname:與中斷相關的ascii文字表示法.
dev_id:
request_irq()成功執行會返回0.
linux核心學習筆記
核心的配置 a.make s3c2410 deconfig b.make menuconfig 圖形化配置 c.使用廠家給出的配置 生成.config 編譯生成核心,使用如下命令 make vmlinux make uimage 帶頭部 真正核心 1 config 建立生成autoconf.h 供源...
Linux核心學習筆記 核心同步
linux核心中執行的程式,時刻都要防止併發引起的競態。這將會導致資料結構被破壞,嚴重的時候會引起核心崩潰。所以核心同步技術對核心開發的驅動程式來說非常重要。不懂核心同步技術的人,是寫不出安全健壯的核心驅動程式來的。在學習核心同步技術之前需要掌握一下幾個概念。1 並行,併發與競態 在smp執行的li...
linux核心學習筆記1
邏輯位址 選擇符 偏移部分 typedef 段描述符 描述符表 系統模式 實模式 保護模式 描述符 使用者段描述符 系統段描述符 8位元組 0 7 0位 段界限 1 15 8位 段界限 2 7 0位 基位址 3 15 8位 基位址 4 23 16位 基位址 5 p dpl s 型別 a 訪問權位元組...