linux2.6內(nèi)核編程培訓(xùn).ppt_第1頁
linux2.6內(nèi)核編程培訓(xùn).ppt_第2頁
linux2.6內(nèi)核編程培訓(xùn).ppt_第3頁
linux2.6內(nèi)核編程培訓(xùn).ppt_第4頁
linux2.6內(nèi)核編程培訓(xùn).ppt_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、linux2.6內(nèi)核編程培訓(xùn),龐宇,2011年3月12日,網(wǎng)絡(luò)安全部,目錄,一,代碼執(zhí)行環(huán)境和互斥,內(nèi)存管理和分配三,內(nèi)核提供的同步機(jī)制四,閑談,一代碼執(zhí)行環(huán)境和互斥,代碼執(zhí)行環(huán)境,內(nèi)核啟動初始化所有CPU (無論是單核還是多核)在任意時間點的活動范圍都在用戶空間中執(zhí)行,并且是進(jìn)程上下文中的三個活動之一。 它在內(nèi)核空間中運行,并位于進(jìn)程上下文中。 表示特定進(jìn)程的執(zhí)行。 在內(nèi)核空間中運行,位于中斷上下文中。 不管哪個進(jìn)程,都處理特定的中斷。 中斷處理程序、linux的中斷處理程序無需重新輸入。 如果一個中斷處理程序正在運行,則相應(yīng)的中斷線由所有處理器屏蔽,以防止同一中斷線接收到另一個新的中斷。

2、通常,所有其他中斷都處于打開狀態(tài),因此可以處理這些不同中斷線上的其他中斷,但始終禁止當(dāng)前中斷。 因此,不會同時調(diào)用相同的中斷處理程序來處理嵌套的中斷。 但是,如果多個中斷共享相同的數(shù)據(jù),則必須考慮互斥。 單核:相同中斷線的處理程序不需要考慮重新輸入。 但是,如果要在不同的中斷處理程序中使用共享數(shù)據(jù),請使用local_irq_disable ()等函數(shù)掩蔽當(dāng)前的CPU中斷。 多核:相同的中斷線處理程序不需要考慮重新輸入。 但是,如果在不同的中斷處理程序中使用共享數(shù)據(jù),則使用spin_lock_irqsave ()和spin_lock_irqstore ()函數(shù)(因為不知道當(dāng)前是否允許中斷)屏蔽當(dāng)

3、前的CPU中斷并且互斥鎖定這樣可以確保當(dāng)前CPU不會因其他中斷而中斷,并且無論其他CPU是在中斷上下文中運行還是在進(jìn)程上下文中運行,都可以與其他CPU互斥。 軟中斷處理程序(1)、軟中斷處理程序在中斷上下文中處理并且在從一個硬件中斷代碼返回時被調(diào)度。 (軟中斷在中斷的進(jìn)程地址空間的中斷上下文中執(zhí)行)在ksoftirqd內(nèi)核線程中執(zhí)行。 (軟中斷在此進(jìn)程的地址空間中斷上下文中執(zhí)行)同一類型的兩個軟中斷可以同時在一個系統(tǒng)的多個處理器上執(zhí)行。 但是,同一處理器上的一個軟中斷不會切斷另一個軟中斷,所以不需要禁止下半部分。 單核心:不需要做任何事。 多核:使用spin_lock ()和rwlock ()

4、等函數(shù)阻止對全局變量的沖突訪問。 軟中斷處理程序由中斷處理程序中斷,軟中斷處理程序和中斷處理程序共享數(shù)據(jù)時。 可以使用單核: local_irq_disable ()等函數(shù)掩蔽中斷的沖突。 (只能關(guān)閉當(dāng)前處理器的中斷)多核:用spin_lock_irq ()和spin_lock_irqsave ()等函數(shù)屏蔽中斷,同時施加互斥鎖。 (只關(guān)閉當(dāng)前處理器的中斷)、軟中斷處理程序(2)、注意:在獲得鎖之前,必須首先禁止本地中斷。 否則,中斷處理程序可能會中斷具有鎖的內(nèi)核代碼并嘗試沖突此自旋鎖。 注意:只需要關(guān)閉當(dāng)前處理程序上的中斷。 如果在不同的處理器上發(fā)生中斷,即使中斷處理程序旋轉(zhuǎn)到同一鎖,也不會

5、阻礙鎖的所有者(在不同的處理器上)最終解除鎖定。內(nèi)核搶占(1)、相同的內(nèi)核進(jìn)程上下文可以在多個CPU上同時運行,并且可以使用spin_lock ()等函數(shù)屏蔽多核沖突。 單核: spin_lock ()僅禁止內(nèi)核斷開。 多核: spin_lock ()鎖定多個CPU,以防止它們同時訪問同一數(shù)據(jù)。 如果軟中斷可能在內(nèi)核進(jìn)程上下文中中斷,并且進(jìn)程上下文和軟中斷共享數(shù)據(jù):使用單核: local_bh_disable ()等函數(shù)掩蔽軟中斷。 (只能關(guān)閉當(dāng)前處理程序的軟中斷)使用多核: spin_locak_bh ()等函數(shù)在屏蔽軟中斷的同時進(jìn)行互斥鎖定。(只能關(guān)閉當(dāng)前處理器的軟中斷)注意:在獲取鎖之前

6、,必須禁止本地軟中斷。 否則,軟中斷處理程序可能會中斷保持鎖的內(nèi)核代碼,并嘗試與此保持的自旋鎖沖突。 注意:只需要關(guān)閉當(dāng)前處理程序上的軟中斷。 如果在不同的處理器上發(fā)生軟中斷,即使軟中斷處理程序旋轉(zhuǎn)到同一鎖,也不會阻礙鎖定的所有者(在不同的處理器上)最終解除鎖定。內(nèi)核搶占(2)、內(nèi)核進(jìn)程上下文可被中斷,對于進(jìn)程上下文和中斷共享數(shù)據(jù):使用單核: local_irq_disable ()等函數(shù)屏蔽中斷。 (只能關(guān)閉當(dāng)前處理器的中斷)多核:用spin_lock_irq ()和spin_lock_irqsave ()等函數(shù)屏蔽中斷,同時施加互斥鎖。 (只能關(guān)閉當(dāng)前處理器的中斷)注意:在獲得鎖之前,必須

7、禁止本地中斷。 否則,中斷處理程序可能會中斷保持鎖的內(nèi)核代碼,并嘗試與保持的自旋鎖發(fā)生沖突。 注意:只需要關(guān)閉當(dāng)前處理程序上的中斷。 如果在不同的處理器上發(fā)生中斷,即使中斷處理程序旋轉(zhuǎn)到同一鎖,也不會阻礙鎖的所有者(在不同的處理器上)最終解除鎖定。 可能是內(nèi)核斷開(3)、內(nèi)核進(jìn)程的上下斷開。 在從中斷處理程序(軟中斷或硬中斷)切換到內(nèi)核區(qū)域之前發(fā)生內(nèi)核斷開(無法使用中斷處理程序斷開內(nèi)核)。 內(nèi)核在進(jìn)程上下文中釋放spinlock鎖(如果保持旋轉(zhuǎn)鎖,則無法斷開內(nèi)核,也無法切換上下文)。 內(nèi)核在進(jìn)程上下文中調(diào)用perrmpt_enable ()函數(shù)允許內(nèi)核斷開連接時。 對于內(nèi)核任務(wù)中顯示的調(diào)用sc

8、hedule ()。 如果內(nèi)核任務(wù)被阻止。 preempt_enable ()或preempt_disable ()函數(shù)用于允許或禁止內(nèi)核斷開。 用于上述沖突防止的spin_lock ()、spin_lock_* ()、local_irq_disable ()、local_bh_disable、2內(nèi)存管理被分配為,內(nèi)存管理、ZONE_DMA這樣的區(qū)域中包含的頁面,在舊的設(shè)備ZONE_NORMAL此區(qū)域中包含的頁面在內(nèi)核線性地址空間中映射,而x86系統(tǒng)中包含的頁面通常位于與16M內(nèi)核線性地址對應(yīng)的物理內(nèi)存范圍內(nèi)。 ZONE_HIGHMEM包含在此區(qū)域中的物理內(nèi)存是無法映射內(nèi)核的線性地址空間的內(nèi)存

9、,并且當(dāng)內(nèi)核使用此區(qū)域的頁面時,該區(qū)域的頁面首先執(zhí)行地址映射(映射到內(nèi)核的VMALLOC線性地址空間)。 如果在分配內(nèi)存時指定了_GFP_DMA標(biāo)志,則僅搜索ZONE_DMA部分。 如果未指定標(biāo)志,則同時搜索ZONE_NORMAL和ZONE_DMA部分,并優(yōu)先搜索ZONE_NORMAL部分。 如果指定_GFP_HIGHMEM標(biāo)志,則會搜索三個段,并且搜索段的優(yōu)先級為ZONE_HIGHMEM、ZONE_NORMAL和ZONE_DMA。 編程中常用的類型標(biāo)志GFP_KERNEL標(biāo)志可以在內(nèi)核空間的進(jìn)程上下文中使用,并且可以休眠。 GFP_ATOMIC標(biāo)志可在內(nèi)核空間的進(jìn)程上下文、中斷上下文和spi

10、nlock鎖之間使用,不能休眠。存儲器分配(1)、如果需要連續(xù)的物理頁,則以頁為單位分配alloc_pages(gfp_mask,order )等函數(shù),由于內(nèi)核通過合作伙伴系統(tǒng)算法管理存儲器頁,所以此函數(shù)休眠嗎? kmalloc (大小、標(biāo)志)函數(shù)。 最多可按字節(jié)分配128K的內(nèi)存。 flags決定此函數(shù)是否休眠以及要為哪些段分配內(nèi)存。 但是,不能使用_GFP_HIGHMEM標(biāo)志為高端內(nèi)存分配內(nèi)存。 此外,如果存儲器分配部(2)不需要物理上連續(xù)的頁面而僅需要虛擬地址上的連續(xù)頁面,則存儲器分配部(2)利用vmalloc(size )函數(shù)分配存儲器。 此函數(shù)休眠,不能在暫停上下文中使用。由于vma

11、lloc ()分配內(nèi)存指定了_GFP_HIGHMEM標(biāo)志,因此首先從高端內(nèi)存(缺省值大于896M )分配。 可獲取的地址位于VMALLOC_STARTVMALLOC_END空間中,默認(rèn)大小為128M。 由于物理上不連續(xù),因此由此函數(shù)分配的內(nèi)存不能用于處理器以外的其他處理器。 由vmalloc ()分配的內(nèi)存會導(dǎo)致TLB抖動,因此無法高效使用。內(nèi)存分配(3)、創(chuàng)建和銷毀大量大型數(shù)據(jù)結(jié)構(gòu)時,請考慮建立slab緩存。 kmem_cache_create ()創(chuàng)建僅使用ZONE_NORMAL和ZONE_DMA區(qū)域的高速緩存。 此函數(shù)休眠,不能在暫停上下文中使用。 kmem_cache_destroy

12、()釋放緩存。 此函數(shù)休眠,不能在中斷上下文中使用。 kmem _ cache _分配(卡片、標(biāo)志)。 此函數(shù)從cachep指定的緩存中獲取對象,flags決定是否休眠。 kmem _ cache _ free (卡片,對象)。 此函數(shù)將objp指向的對象釋放到cachep指定的緩存中。 這個函數(shù)睡不著。 內(nèi)存分配(4)需要從高端內(nèi)存分配時,使用以下分配方法。 使用alloc_pages(gfp_mask,order )將_GFP_HIGHMEM標(biāo)志指定給gfp_mask,但是此函數(shù)沒有映射為返回指向page結(jié)構(gòu)的指針,而是返回指向page結(jié)構(gòu)的指針vmalloc ()函數(shù)也從高端內(nèi)存分配,并

13、返回映射的邏輯地址。 但是,可分配的內(nèi)存大小為VMALLOC_STARTVMALLOC_END空間(默認(rèn)為128M內(nèi)存空間)。 此外,此函數(shù)取睡眠,不能在中斷上下文中使用。 釋放內(nèi)存,每個內(nèi)存分配函數(shù)對應(yīng)一個釋放函數(shù),釋放時使用對應(yīng)的釋放函數(shù),并注意該函數(shù)是否休眠。 有些內(nèi)存釋放函數(shù)將內(nèi)存釋放到其高速緩存(slab緩沖區(qū)),而不是實際釋放到空閑頁面隊列。 內(nèi)核周期性地(幾乎每隔兩秒)調(diào)用cache_reap ()函數(shù)以重用slab高速緩存的內(nèi)存頁。 如果內(nèi)核調(diào)用_alloc_pages ()檢測到適合內(nèi)存分配的所有內(nèi)存管理區(qū)域中的可用頁低于“警告”值,則激活kswapd內(nèi)核線程并重用內(nèi)存。 內(nèi)

14、存分配失敗時,激活內(nèi)存不足回收函數(shù)try_to_free_pages ()進(jìn)行回收。 如果內(nèi)核無法釋放更多內(nèi)存,則刪除進(jìn)程將釋放更多內(nèi)存。 有些頁面不能重復(fù)使用。 空閑頁,保留頁(帶有PG_RESERVED標(biāo)志),內(nèi)核動態(tài)分配頁,內(nèi)核狀態(tài)堆棧頁,臨時鎖定頁(PG_LOCKET標(biāo)志集),內(nèi)存鎖定頁(VM_LOCKED )。某些可重用頁內(nèi)存管理的一些問題是,內(nèi)核只能直接使用0896M的內(nèi)存空間。 即使系統(tǒng)有2G物理內(nèi)存,并且CONFIG_HIGHMEM和CONFIG_X86_PAE選項打開,內(nèi)核空間也只能使用896M內(nèi)存。 這在linux2.6內(nèi)核中也沒有變化。 (如果選中CONFIG_HIGHM

15、EM選項,則用戶區(qū)域可以使用超過1G的內(nèi)存區(qū)域。 如果選中CONFIG_X86_PAE選項,則X86-CPU總線為36位。 也就是說,cpu可以訪問064G內(nèi)存。 調(diào)用_alloc_pages ()分配高端內(nèi)存頁,因為通過kmap ()的內(nèi)核空間的線性地址空間只有1G。 由于內(nèi)核僅限制了1G個線性地址空間,即使在我們的設(shè)備中使用2G個物理存儲器,也將浪費1G個物理存儲器。 (但是,如果選中CONFIG_HIGHMEM選項,則1G2G內(nèi)存空間可供用戶空間使用)、三個內(nèi)核提供的同步機(jī)制以及每個CPU變量的CPU數(shù)據(jù)可用于大量(或最小化)數(shù)據(jù)丟失唯一的安全要求是禁止內(nèi)核斷開連接。 此成本遠(yuǎn)小于鎖定,

16、因為接口會自動執(zhí)行此過程(在獲取當(dāng)前處理器編號時必須調(diào)用get_cpu ()函數(shù),該函數(shù)會自動調(diào)用preempt_disable ()以禁止內(nèi)核斷開對應(yīng)的put_cpu ()也會自動調(diào)用preempt_enable ()以允許內(nèi)核斷開連接。 每個CPU數(shù)據(jù)在中斷或進(jìn)程上下文中使用是安全的。 但是,在訪問各CPU數(shù)據(jù)時不能休眠。 不這樣做的話,醒來之后可能到了其他處理器。 每個CPU變量保護(hù)來自不同CPU的并發(fā)訪問,但不保護(hù)來自異步函數(shù)(中斷處理程序和可延遲函數(shù))的訪問。 在這種情況下,需要另一個同步基元。 各CPU變量在單核中沒有意義,只有在多核中才有意義。 一個CPU不能訪問與其他CPU對應(yīng)

17、的數(shù)組元素。 您還可以自由閱讀和修改自己的元素,而不必?fù)?dān)心競爭條件。 因為這是唯一有資格做到這一點的CPU。 保證原子操作(1)、原子操作在單核系統(tǒng)和多核系統(tǒng)中都能正確執(zhí)行。 此外,執(zhí)行效果相同。 通過原子操作,即使命令以原子方式執(zhí)行,執(zhí)行過程也不會中斷。 內(nèi)核提供兩個原子操作界面。 一個操作整數(shù),另一個操作單獨的位。 linux支持的所有體系結(jié)構(gòu)都實現(xiàn)了這兩個接口。 大多數(shù)體系結(jié)構(gòu)原本支持簡單的原子操作,或提供鎖定內(nèi)存總線的指令,以便一步執(zhí)行。 整數(shù)原子操作整數(shù)原子操作只能處理atomic_t類型的數(shù)據(jù)。 如果需要將atomic_t類型轉(zhuǎn)換為int類型,可以使用atomic_read ()來執(zhí)行。 原子整數(shù)運算函數(shù)為atomic_* ()。 原子整數(shù)操作最常見的用途是實現(xiàn)計數(shù)器。 在原子上,不要在指令執(zhí)行過程中中斷,或者完成所有執(zhí)行,或者完全不執(zhí)行。 原子操作僅保證原子性,順序性根據(jù)屏障指令實施。 原子操作(2)、原子位操作位操作函數(shù)操作通常的存儲器地址。 殘奧儀表是指針和標(biāo)記,第0位是指定地址的最低有效位。 在32位機(jī)器中,第31位是給定地址的最高有效位,第32位是下一個字的最低有效位。 使用原子操作時,通常會訪問1字長的內(nèi)存,因此標(biāo)簽應(yīng)該在031之間(64位機(jī)器中在063之間),但標(biāo)簽的范圍不受限制。 因為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論