系統(tǒng)調(diào)用
用戶進(jìn)程與內(nèi)核進(jìn)行交互的一組接口帮哈;
需要C庫(kù)支持司顿,通過(guò)使用C庫(kù)定義的函數(shù)來(lái)訪問(wèn)系統(tǒng)調(diào)用
系統(tǒng)調(diào)用伴找、中斷盈蛮、異常是訪問(wèn)內(nèi)核的三種方式。
- 系統(tǒng)調(diào)用號(hào):關(guān)聯(lián)系統(tǒng)調(diào)用
- 系統(tǒng)調(diào)用的性能:
- linux很短的上下文切換時(shí)間
- 系統(tǒng)調(diào)用處理程序和每個(gè)系統(tǒng)調(diào)用都非常簡(jiǎn)潔
- 系統(tǒng)調(diào)用處理程序:用戶空間的程序使用軟中斷來(lái)通知內(nèi)核執(zhí)行系統(tǒng)調(diào)用
通過(guò)exa寄存器傳遞系統(tǒng)調(diào)用號(hào)給內(nèi)核技矮;
給用戶空間的返回值也通過(guò)寄存器傳遞(x86系統(tǒng):存放在eax寄存器上)抖誉;
建立系統(tǒng)調(diào)用的好處:
- 系統(tǒng)調(diào)用創(chuàng)建容易且使用方便
- Linux系統(tǒng)調(diào)用性能很高
- 保證了系統(tǒng)的安全性和穩(wěn)定性:用戶程序不能直接操作內(nèi)核地址空間。
系統(tǒng)調(diào)用和庫(kù)函數(shù)的區(qū)別:
- 庫(kù)函數(shù)是0-n個(gè)系統(tǒng)調(diào)用的封裝
- 函數(shù)庫(kù)調(diào)用是調(diào)用函數(shù)庫(kù)中的一個(gè)程序衰倦,而系統(tǒng)調(diào)用是調(diào)用系統(tǒng)內(nèi)核的一個(gè)服務(wù)
- 函數(shù)庫(kù)調(diào)用屬于過(guò)程調(diào)用袒炉,開(kāi)銷(xiāo)較小,系統(tǒng)調(diào)用需要有用戶態(tài)和內(nèi)核態(tài)之間的切換開(kāi)銷(xiāo)
- 庫(kù)函數(shù)調(diào)用是在用戶地址空間執(zhí)行樊零,而系統(tǒng)調(diào)用是在內(nèi)核地址空間執(zhí)行
問(wèn)題:
- 圍繞系統(tǒng)調(diào)用號(hào)來(lái)講我磁,包括系統(tǒng)預(yù)分配、再固化驻襟、注冊(cè)到每個(gè)需要支持的體系結(jié)構(gòu)夺艰、維護(hù)困難(只能在主內(nèi)核樹(shù)維護(hù))、功能簡(jiǎn)單的話便是大材小用
內(nèi)存管理
頁(yè):內(nèi)核把物理頁(yè)作為內(nèi)存管理的基本單位
內(nèi)存管理單元(MMU):管理內(nèi)存并把虛擬地址轉(zhuǎn)換為物理地址的硬件沉衣,以頁(yè)為單位進(jìn)行處理郁副。
struct page:使用了大量的聯(lián)合體union來(lái)保證struct page結(jié)構(gòu)體足夠小
-
區(qū):Linux把系統(tǒng)的頁(yè)劃分成區(qū),形成不同的內(nèi)存池厢蒜,這樣可以根據(jù)用途進(jìn)行分配霞势。
ZONE_DMA:DMA使用的頁(yè)
ZONE_NORMAL:正撑胫玻可尋址的頁(yè)
ZONE_HIGHMEM:動(dòng)態(tài)映射的頁(yè)
kmalloc():返回在物理連續(xù)的一段以字節(jié)為單位的內(nèi)核內(nèi)存
kfree():與kmalloc()配對(duì)使用,避免內(nèi)存泄漏
-
vmalloc():分配的內(nèi)存虛擬地址連續(xù)愕贡,物理地址無(wú)需連續(xù)
分配非連續(xù)的物理內(nèi)存塊草雕,再“修正”頁(yè)表,把內(nèi)存映射到邏輯地址空間的連續(xù)區(qū)域中
-
kmalloc和vmalloc
大部分內(nèi)核代碼選用kmalloc分配內(nèi)存的原因固以,主要出于性能考慮墩虹。
? vmalloc為了把物理上不連續(xù)的頁(yè)轉(zhuǎn)換為虛擬地址空間上連續(xù)的頁(yè),必須專門(mén)建立頁(yè)表項(xiàng)憨琳。并且诫钓,通過(guò)vmalloc獲得的頁(yè)必須一個(gè)一個(gè)進(jìn)行映射,會(huì)導(dǎo)致比直接映射產(chǎn)生更大的TLB抖動(dòng)篙螟。
內(nèi)核常用的內(nèi)存分配方式:使用某個(gè)低級(jí)頁(yè)分配器或者kmalloc
當(dāng)創(chuàng)建和撤銷(xiāo)很多大的數(shù)據(jù)結(jié)構(gòu)菌湃,可以建立slab高速緩存來(lái)提升性能
進(jìn)程地址空間
用戶空間中進(jìn)程的內(nèi)存,成為進(jìn)程地址空間遍略。
-
內(nèi)存區(qū)域:
- 代碼段:可執(zhí)行文件代碼的內(nèi)存映射
- 數(shù)據(jù)段:可執(zhí)行文件的已初始化的全局變量和靜態(tài)變量
- BSS段:未初始化的全局變量和靜態(tài)變量
- 堆:任何匿名的內(nèi)存映射(如malloc分配的內(nèi)存)
- 棧:進(jìn)程用戶空間棧(進(jìn)程內(nèi)核棧獨(dú)立存在并由內(nèi)核維護(hù))
內(nèi)核同時(shí)使用了mmap(鏈?zhǔn)浇Y(jié)構(gòu))和mm_rb(紅黑樹(shù))來(lái)描述同一塊內(nèi)存區(qū)域惧所,在可以同時(shí)遍歷整個(gè)節(jié)點(diǎn)同時(shí),保證了查找節(jié)點(diǎn)的效率
-
查找內(nèi)存地址所對(duì)應(yīng)的內(nèi)存區(qū)域:
- 查看mmap_cache緩存
- 未命中時(shí)則選擇搜索mm_rb紅黑樹(shù)結(jié)構(gòu)绪杏,未找到則返回NULL
linux使用三級(jí)頁(yè)表完成地址轉(zhuǎn)換(虛擬地址轉(zhuǎn)換成物理地址)
brk sbrk
定時(shí)器和時(shí)間管理
實(shí)際時(shí)間:開(kāi)機(jī)后下愈,內(nèi)核初始化從RTC讀取,放入到xtime變量中蕾久。系統(tǒng)讀寫(xiě) xtime 時(shí)用的就是順序鎖
-
定時(shí)器
-
靜態(tài)定時(shí)器:執(zhí)行周期性的工作
更新系統(tǒng)運(yùn)行時(shí)間
更新實(shí)際時(shí)間
檢查當(dāng)前進(jìn)程是否用盡了自己的時(shí)間片势似,如果用盡,需要重新調(diào)度僧著。
-
-
動(dòng)態(tài)定時(shí)器
動(dòng)態(tài)創(chuàng)建的定時(shí)器履因,使用后銷(xiāo)毀。一般在內(nèi)核代碼中使用的基本都是動(dòng)態(tài)定時(shí)器
-
HZ:
節(jié)拍率(HZ)是時(shí)鐘中斷的頻率盹愚,表示的一秒內(nèi)時(shí)鐘中斷的次數(shù)搓逾。比如 HZ=100 表示一秒內(nèi)觸發(fā)100次時(shí)鐘中斷程序。
-
jiffies
jiffies用來(lái)記錄自系統(tǒng)啟動(dòng)以來(lái)產(chǎn)生的總節(jié)拍數(shù)杯拐。比如系統(tǒng)啟動(dòng)了 N 秒,那么 jiffies就為 N×HZ
-
時(shí)間中斷處理程序
時(shí)鐘中斷處理程序作為系統(tǒng)定時(shí)器而注冊(cè)到內(nèi)核中世蔗,體系結(jié)構(gòu)的不同端逼,可能時(shí)鐘中斷處理程序中處理的內(nèi)容不同
-
-
定時(shí)器執(zhí)行流程
定義:定時(shí)器在內(nèi)核中用一個(gè)鏈表來(lái)保存的,鏈表的每個(gè)節(jié)點(diǎn)都是一個(gè)定時(shí)器
生命周期:
img