Linux核心學習筆記

2022-09-06 05:51:06 字數 3609 閱讀 9657

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 訪問權位元組...