linux內(nèi)核

系統(tǒng)調(diào)用

用戶進(jìn)程與內(nèi)核進(jìn)行交互的一組接口;

需要C庫支持,通過使用C庫定義的函數(shù)來訪問系統(tǒng)調(diào)用

系統(tǒng)調(diào)用、中斷、異常是訪問內(nèi)核的三種方式。

  • 系統(tǒng)調(diào)用號(hào):關(guān)聯(lián)系統(tǒng)調(diào)用
  • 系統(tǒng)調(diào)用的性能:
  1. linux很短的上下文切換時(shí)間
  2. 系統(tǒng)調(diào)用處理程序和每個(gè)系統(tǒng)調(diào)用都非常簡(jiǎn)潔
  • 系統(tǒng)調(diào)用處理程序:用戶空間的程序使用軟中斷來通知內(nèi)核執(zhí)行系統(tǒng)調(diào)用

通過exa寄存器傳遞系統(tǒng)調(diào)用號(hào)給內(nèi)核;

給用戶空間的返回值也通過寄存器傳遞(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)用和庫函數(shù)的區(qū)別:

  • 庫函數(shù)是0-n個(gè)系統(tǒng)調(diào)用的封裝
  • 函數(shù)庫調(diào)用是調(diào)用函數(shù)庫中的一個(gè)程序,而系統(tǒng)調(diào)用是調(diào)用系統(tǒng)內(nèi)核的一個(gè)服務(wù)
  • 函數(shù)庫調(diào)用屬于過程調(diào)用,開銷較小,系統(tǒng)調(diào)用需要有用戶態(tài)和內(nèi)核態(tài)之間的切換開銷
  • 庫函數(shù)調(diào)用是在用戶地址空間執(zhí)行,而系統(tǒng)調(diào)用是在內(nèi)核地址空間執(zhí)行

問題:

  • 圍繞系統(tǒng)調(diào)用號(hào)來講,包括系統(tǒng)預(yù)分配、再固化、注冊(cè)到每個(gè)需要支持的體系結(jié)構(gòu)、維護(hù)困難(只能在主內(nèi)核樹維護(hù))、功能簡(jiǎn)單的話便是大材小用

內(nèi)存管理

  • 頁:內(nèi)核把物理頁作為內(nèi)存管理的基本單位

  • 內(nèi)存管理單元(MMU):管理內(nèi)存并把虛擬地址轉(zhuǎn)換為物理地址的硬件,以頁為單位進(jìn)行處理。

  • struct page:使用了大量的聯(lián)合體union來保證struct page結(jié)構(gòu)體足夠小

  • 區(qū):Linux把系統(tǒng)的頁劃分成區(qū),形成不同的內(nèi)存池,這樣可以根據(jù)用途進(jìn)行分配。

    ZONE_DMA:DMA使用的頁

    ZONE_NORMAL:正??蓪ぶ返捻?/p>

    ZONE_HIGHMEM:動(dòng)態(tài)映射的頁

  • kmalloc():返回在物理連續(xù)的一段以字節(jié)為單位的內(nèi)核內(nèi)存

  • kfree():與kmalloc()配對(duì)使用,避免內(nèi)存泄漏

  • vmalloc():分配的內(nèi)存虛擬地址連續(xù),物理地址無需連續(xù)

    分配非連續(xù)的物理內(nèi)存塊,再“修正”頁表,把內(nèi)存映射到邏輯地址空間的連續(xù)區(qū)域

  • kmalloc和vmalloc

    大部分內(nèi)核代碼選用kmalloc分配內(nèi)存的原因,主要出于性能考慮。

    ? vmalloc為了把物理上不連續(xù)的頁轉(zhuǎn)換為虛擬地址空間上連續(xù)的頁,必須專門建立頁表項(xiàng)。并且,通過vmalloc獲得的頁必須一個(gè)一個(gè)進(jìn)行映射,會(huì)導(dǎo)致比直接映射產(chǎn)生更大的TLB抖動(dòng)

  • 內(nèi)核常用的內(nèi)存分配方式:使用某個(gè)低級(jí)頁分配器或者kmalloc

  • 當(dāng)創(chuàng)建和撤銷很多大的數(shù)據(jù)結(jié)構(gòu),可以建立slab高速緩存來提升性能

進(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(紅黑樹)來描述同一塊內(nèi)存區(qū)域,在可以同時(shí)遍歷整個(gè)節(jié)點(diǎn)同時(shí),保證了查找節(jié)點(diǎn)的效率

  • 查找內(nèi)存地址所對(duì)應(yīng)的內(nèi)存區(qū)域:

    1. 查看mmap_cache緩存
    2. 未命中時(shí)則選擇搜索mm_rb紅黑樹結(jié)構(gòu),未找到則返回NULL
  • linux使用三級(jí)頁表完成地址轉(zhuǎn)換(虛擬地址轉(zhuǎn)換成物理地址)

  • brk sbrk

定時(shí)器和時(shí)間管理

  • 實(shí)際時(shí)間:開機(jī)后,內(nèi)核初始化從RTC讀取,放入到xtime變量中。系統(tǒng)讀寫 xtime 時(shí)用的就是順序鎖

  • 定時(shí)器

    • 靜態(tài)定時(shí)器:執(zhí)行周期性的工作

      1. 更新系統(tǒng)運(yùn)行時(shí)間

      2. 更新實(shí)際時(shí)間

      3. 檢查當(dāng)前進(jìn)程是否用盡了自己的時(shí)間片,如果用盡,需要重新調(diào)度。

  • 動(dòng)態(tài)定時(shí)器

    動(dòng)態(tài)創(chuàng)建的定時(shí)器,使用后銷毀。一般在內(nèi)核代碼中使用的基本都是動(dòng)態(tài)定時(shí)器

    1. HZ:

      節(jié)拍率(HZ)是時(shí)鐘中斷的頻率,表示的一秒內(nèi)時(shí)鐘中斷的次數(shù)。比如 HZ=100 表示一秒內(nèi)觸發(fā)100次時(shí)鐘中斷程序。

    2. jiffies

      jiffies用來記錄自系統(tǒng)啟動(dòng)以來產(chǎn)生的總節(jié)拍數(shù)。比如系統(tǒng)啟動(dòng)了 N 秒,那么 jiffies就為 N×HZ

    3. 時(shí)間中斷處理程序

      時(shí)鐘中斷處理程序作為系統(tǒng)定時(shí)器而注冊(cè)到內(nèi)核中,體系結(jié)構(gòu)的不同,可能時(shí)鐘中斷處理程序中處理的內(nèi)容不同

  • 定時(shí)器執(zhí)行流程

    定義:定時(shí)器在內(nèi)核中用一個(gè)鏈表來保存的,鏈表的每個(gè)節(jié)點(diǎn)都是一個(gè)定時(shí)器

    生命周期:

    img
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容