版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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)核啟動(dòng)初始化所有CPU (無(wú)論是單核還是多核)在任意時(shí)間點(diǎn)的活動(dòng)范圍都在用戶空間中執(zhí)行,并且是進(jìn)程上下文中的三個(gè)活動(dòng)之一。 它在內(nèi)核空間中運(yùn)行,并位于進(jìn)程上下文中。 表示特定進(jìn)程的執(zhí)行。 在內(nèi)核空間中運(yùn)行,位于中斷上下文中。 不管哪個(gè)進(jìn)程,都處理特定的中斷。 中斷處理程序、linux的中斷處理程序無(wú)需重新輸入。 如果一個(gè)中斷處理程序正在運(yùn)行,則相應(yīng)的中斷線由所有處理器屏蔽,以防止同一中斷線接收到另一個(gè)新的中斷。
2、通常,所有其他中斷都處于打開(kāi)狀態(tài),因此可以處理這些不同中斷線上的其他中斷,但始終禁止當(dāng)前中斷。 因此,不會(huì)同時(shí)調(diào)用相同的中斷處理程序來(lái)處理嵌套的中斷。 但是,如果多個(gè)中斷共享相同的數(shù)據(jù),則必須考慮互斥。 單核:相同中斷線的處理程序不需要考慮重新輸入。 但是,如果要在不同的中斷處理程序中使用共享數(shù)據(jù),請(qǐng)使用local_irq_disable ()等函數(shù)掩蔽當(dāng)前的CPU中斷。 多核:相同的中斷線處理程序不需要考慮重新輸入。 但是,如果在不同的中斷處理程序中使用共享數(shù)據(jù),則使用spin_lock_irqsave ()和spin_lock_irqstore ()函數(shù)(因?yàn)椴恢喇?dāng)前是否允許中斷)屏蔽當(dāng)
3、前的CPU中斷并且互斥鎖定這樣可以確保當(dāng)前CPU不會(huì)因其他中斷而中斷,并且無(wú)論其他CPU是在中斷上下文中運(yùn)行還是在進(jìn)程上下文中運(yùn)行,都可以與其他CPU互斥。 軟中斷處理程序(1)、軟中斷處理程序在中斷上下文中處理并且在從一個(gè)硬件中斷代碼返回時(shí)被調(diào)度。 (軟中斷在中斷的進(jìn)程地址空間的中斷上下文中執(zhí)行)在ksoftirqd內(nèi)核線程中執(zhí)行。 (軟中斷在此進(jìn)程的地址空間中斷上下文中執(zhí)行)同一類型的兩個(gè)軟中斷可以同時(shí)在一個(gè)系統(tǒng)的多個(gè)處理器上執(zhí)行。 但是,同一處理器上的一個(gè)軟中斷不會(huì)切斷另一個(gè)軟中斷,所以不需要禁止下半部分。 單核心:不需要做任何事。 多核:使用spin_lock ()和rwlock ()
4、等函數(shù)阻止對(duì)全局變量的沖突訪問(wèn)。 軟中斷處理程序由中斷處理程序中斷,軟中斷處理程序和中斷處理程序共享數(shù)據(jù)時(shí)。 可以使用單核: local_irq_disable ()等函數(shù)掩蔽中斷的沖突。 (只能關(guān)閉當(dāng)前處理器的中斷)多核:用spin_lock_irq ()和spin_lock_irqsave ()等函數(shù)屏蔽中斷,同時(shí)施加互斥鎖。 (只關(guān)閉當(dāng)前處理器的中斷)、軟中斷處理程序(2)、注意:在獲得鎖之前,必須首先禁止本地中斷。 否則,中斷處理程序可能會(huì)中斷具有鎖的內(nèi)核代碼并嘗試沖突此自旋鎖。 注意:只需要關(guān)閉當(dāng)前處理程序上的中斷。 如果在不同的處理器上發(fā)生中斷,即使中斷處理程序旋轉(zhuǎn)到同一鎖,也不會(huì)
5、阻礙鎖的所有者(在不同的處理器上)最終解除鎖定。內(nèi)核搶占(1)、相同的內(nèi)核進(jìn)程上下文可以在多個(gè)CPU上同時(shí)運(yùn)行,并且可以使用spin_lock ()等函數(shù)屏蔽多核沖突。 單核: spin_lock ()僅禁止內(nèi)核斷開(kāi)。 多核: spin_lock ()鎖定多個(gè)CPU,以防止它們同時(shí)訪問(wèn)同一數(shù)據(jù)。 如果軟中斷可能在內(nèi)核進(jìn)程上下文中中斷,并且進(jìn)程上下文和軟中斷共享數(shù)據(jù):使用單核: local_bh_disable ()等函數(shù)掩蔽軟中斷。 (只能關(guān)閉當(dāng)前處理程序的軟中斷)使用多核: spin_locak_bh ()等函數(shù)在屏蔽軟中斷的同時(shí)進(jìn)行互斥鎖定。(只能關(guān)閉當(dāng)前處理器的軟中斷)注意:在獲取鎖之前
6、,必須禁止本地軟中斷。 否則,軟中斷處理程序可能會(huì)中斷保持鎖的內(nèi)核代碼,并嘗試與此保持的自旋鎖沖突。 注意:只需要關(guān)閉當(dāng)前處理程序上的軟中斷。 如果在不同的處理器上發(fā)生軟中斷,即使軟中斷處理程序旋轉(zhuǎn)到同一鎖,也不會(huì)阻礙鎖定的所有者(在不同的處理器上)最終解除鎖定。內(nèi)核搶占(2)、內(nèi)核進(jìn)程上下文可被中斷,對(duì)于進(jìn)程上下文和中斷共享數(shù)據(jù):使用單核: local_irq_disable ()等函數(shù)屏蔽中斷。 (只能關(guān)閉當(dāng)前處理器的中斷)多核:用spin_lock_irq ()和spin_lock_irqsave ()等函數(shù)屏蔽中斷,同時(shí)施加互斥鎖。 (只能關(guān)閉當(dāng)前處理器的中斷)注意:在獲得鎖之前,必須
7、禁止本地中斷。 否則,中斷處理程序可能會(huì)中斷保持鎖的內(nèi)核代碼,并嘗試與保持的自旋鎖發(fā)生沖突。 注意:只需要關(guān)閉當(dāng)前處理程序上的中斷。 如果在不同的處理器上發(fā)生中斷,即使中斷處理程序旋轉(zhuǎn)到同一鎖,也不會(huì)阻礙鎖的所有者(在不同的處理器上)最終解除鎖定。 可能是內(nèi)核斷開(kāi)(3)、內(nèi)核進(jìn)程的上下斷開(kāi)。 在從中斷處理程序(軟中斷或硬中斷)切換到內(nèi)核區(qū)域之前發(fā)生內(nèi)核斷開(kāi)(無(wú)法使用中斷處理程序斷開(kāi)內(nèi)核)。 內(nèi)核在進(jìn)程上下文中釋放spinlock鎖(如果保持旋轉(zhuǎn)鎖,則無(wú)法斷開(kāi)內(nèi)核,也無(wú)法切換上下文)。 內(nèi)核在進(jìn)程上下文中調(diào)用perrmpt_enable ()函數(shù)允許內(nèi)核斷開(kāi)連接時(shí)。 對(duì)于內(nèi)核任務(wù)中顯示的調(diào)用sc
8、hedule ()。 如果內(nèi)核任務(wù)被阻止。 preempt_enable ()或preempt_disable ()函數(shù)用于允許或禁止內(nèi)核斷開(kāi)。 用于上述沖突防止的spin_lock ()、spin_lock_* ()、local_irq_disable ()、local_bh_disable、2內(nèi)存管理被分配為,內(nèi)存管理、ZONE_DMA這樣的區(qū)域中包含的頁(yè)面,在舊的設(shè)備ZONE_NORMAL此區(qū)域中包含的頁(yè)面在內(nèi)核線性地址空間中映射,而x86系統(tǒng)中包含的頁(yè)面通常位于與16M內(nèi)核線性地址對(duì)應(yīng)的物理內(nèi)存范圍內(nèi)。 ZONE_HIGHMEM包含在此區(qū)域中的物理內(nèi)存是無(wú)法映射內(nèi)核的線性地址空間的內(nèi)存
9、,并且當(dāng)內(nèi)核使用此區(qū)域的頁(yè)面時(shí),該區(qū)域的頁(yè)面首先執(zhí)行地址映射(映射到內(nèi)核的VMALLOC線性地址空間)。 如果在分配內(nèi)存時(shí)指定了_GFP_DMA標(biāo)志,則僅搜索ZONE_DMA部分。 如果未指定標(biāo)志,則同時(shí)搜索ZONE_NORMAL和ZONE_DMA部分,并優(yōu)先搜索ZONE_NORMAL部分。 如果指定_GFP_HIGHMEM標(biāo)志,則會(huì)搜索三個(gè)段,并且搜索段的優(yōu)先級(jí)為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鎖之間使用,不能休眠。存儲(chǔ)器分配(1)、如果需要連續(xù)的物理頁(yè),則以頁(yè)為單位分配alloc_pages(gfp_mask,order )等函數(shù),由于內(nèi)核通過(guò)合作伙伴系統(tǒng)算法管理存儲(chǔ)器頁(yè),所以此函數(shù)休眠嗎? kmalloc (大小、標(biāo)志)函數(shù)。 最多可按字節(jié)分配128K的內(nèi)存。 flags決定此函數(shù)是否休眠以及要為哪些段分配內(nèi)存。 但是,不能使用_GFP_HIGHMEM標(biāo)志為高端內(nèi)存分配內(nèi)存。 此外,如果存儲(chǔ)器分配部(2)不需要物理上連續(xù)的頁(yè)面而僅需要虛擬地址上的連續(xù)頁(yè)面,則存儲(chǔ)器分配部(2)利用vmalloc(size )函數(shù)分配存儲(chǔ)器。 此函數(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)存會(huì)導(dǎo)致TLB抖動(dòng),因此無(wú)法高效使用。內(nèi)存分配(3)、創(chuàng)建和銷毀大量大型數(shù)據(jù)結(jié)構(gòu)時(shí),請(qǐng)考慮建立slab緩存。 kmem_cache_create ()創(chuàng)建僅使用ZONE_NORMAL和ZONE_DMA區(qū)域的高速緩存。 此函數(shù)休眠,不能在暫停上下文中使用。 kmem_cache_destroy
12、()釋放緩存。 此函數(shù)休眠,不能在中斷上下文中使用。 kmem _ cache _分配(卡片、標(biāo)志)。 此函數(shù)從cachep指定的緩存中獲取對(duì)象,flags決定是否休眠。 kmem _ cache _ free (卡片,對(duì)象)。 此函數(shù)將objp指向的對(duì)象釋放到cachep指定的緩存中。 這個(gè)函數(shù)睡不著。 內(nèi)存分配(4)需要從高端內(nèi)存分配時(shí),使用以下分配方法。 使用alloc_pages(gfp_mask,order )將_GFP_HIGHMEM標(biāo)志指定給gfp_mask,但是此函數(shù)沒(méi)有映射為返回指向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)存,每個(gè)內(nèi)存分配函數(shù)對(duì)應(yīng)一個(gè)釋放函數(shù),釋放時(shí)使用對(duì)應(yīng)的釋放函數(shù),并注意該函數(shù)是否休眠。 有些內(nèi)存釋放函數(shù)將內(nèi)存釋放到其高速緩存(slab緩沖區(qū)),而不是實(shí)際釋放到空閑頁(yè)面隊(duì)列。 內(nèi)核周期性地(幾乎每隔兩秒)調(diào)用cache_reap ()函數(shù)以重用slab高速緩存的內(nèi)存頁(yè)。 如果內(nèi)核調(diào)用_alloc_pages ()檢測(cè)到適合內(nèi)存分配的所有內(nèi)存管理區(qū)域中的可用頁(yè)低于“警告”值,則激活kswapd內(nèi)核線程并重用內(nèi)存。 內(nèi)
14、存分配失敗時(shí),激活內(nèi)存不足回收函數(shù)try_to_free_pages ()進(jìn)行回收。 如果內(nèi)核無(wú)法釋放更多內(nèi)存,則刪除進(jìn)程將釋放更多內(nèi)存。 有些頁(yè)面不能重復(fù)使用。 空閑頁(yè),保留頁(yè)(帶有PG_RESERVED標(biāo)志),內(nèi)核動(dòng)態(tài)分配頁(yè),內(nèi)核狀態(tài)堆棧頁(yè),臨時(shí)鎖定頁(yè)(PG_LOCKET標(biāo)志集),內(nèi)存鎖定頁(yè)(VM_LOCKED )。某些可重用頁(yè)內(nèi)存管理的一些問(wèn)題是,內(nèi)核只能直接使用0896M的內(nèi)存空間。 即使系統(tǒng)有2G物理內(nèi)存,并且CONFIG_HIGHMEM和CONFIG_X86_PAE選項(xiàng)打開(kāi),內(nèi)核空間也只能使用896M內(nèi)存。 這在linux2.6內(nèi)核中也沒(méi)有變化。 (如果選中CONFIG_HIGHM
15、EM選項(xiàng),則用戶區(qū)域可以使用超過(guò)1G的內(nèi)存區(qū)域。 如果選中CONFIG_X86_PAE選項(xiàng),則X86-CPU總線為36位。 也就是說(shuō),cpu可以訪問(wèn)064G內(nèi)存。 調(diào)用_alloc_pages ()分配高端內(nèi)存頁(yè),因?yàn)橥ㄟ^(guò)kmap ()的內(nèi)核空間的線性地址空間只有1G。 由于內(nèi)核僅限制了1G個(gè)線性地址空間,即使在我們的設(shè)備中使用2G個(gè)物理存儲(chǔ)器,也將浪費(fèi)1G個(gè)物理存儲(chǔ)器。 (但是,如果選中CONFIG_HIGHMEM選項(xiàng),則1G2G內(nèi)存空間可供用戶空間使用)、三個(gè)內(nèi)核提供的同步機(jī)制以及每個(gè)CPU變量的CPU數(shù)據(jù)可用于大量(或最小化)數(shù)據(jù)丟失唯一的安全要求是禁止內(nèi)核斷開(kāi)連接。 此成本遠(yuǎn)小于鎖定,
16、因?yàn)榻涌跁?huì)自動(dòng)執(zhí)行此過(guò)程(在獲取當(dāng)前處理器編號(hào)時(shí)必須調(diào)用get_cpu ()函數(shù),該函數(shù)會(huì)自動(dòng)調(diào)用preempt_disable ()以禁止內(nèi)核斷開(kāi)對(duì)應(yīng)的put_cpu ()也會(huì)自動(dòng)調(diào)用preempt_enable ()以允許內(nèi)核斷開(kāi)連接。 每個(gè)CPU數(shù)據(jù)在中斷或進(jìn)程上下文中使用是安全的。 但是,在訪問(wèn)各CPU數(shù)據(jù)時(shí)不能休眠。 不這樣做的話,醒來(lái)之后可能到了其他處理器。 每個(gè)CPU變量保護(hù)來(lái)自不同CPU的并發(fā)訪問(wèn),但不保護(hù)來(lái)自異步函數(shù)(中斷處理程序和可延遲函數(shù))的訪問(wèn)。 在這種情況下,需要另一個(gè)同步基元。 各CPU變量在單核中沒(méi)有意義,只有在多核中才有意義。 一個(gè)CPU不能訪問(wèn)與其他CPU對(duì)應(yīng)
17、的數(shù)組元素。 您還可以自由閱讀和修改自己的元素,而不必?fù)?dān)心競(jìng)爭(zhēng)條件。 因?yàn)檫@是唯一有資格做到這一點(diǎn)的CPU。 保證原子操作(1)、原子操作在單核系統(tǒng)和多核系統(tǒng)中都能正確執(zhí)行。 此外,執(zhí)行效果相同。 通過(guò)原子操作,即使命令以原子方式執(zhí)行,執(zhí)行過(guò)程也不會(huì)中斷。 內(nèi)核提供兩個(gè)原子操作界面。 一個(gè)操作整數(shù),另一個(gè)操作單獨(dú)的位。 linux支持的所有體系結(jié)構(gòu)都實(shí)現(xiàn)了這兩個(gè)接口。 大多數(shù)體系結(jié)構(gòu)原本支持簡(jiǎn)單的原子操作,或提供鎖定內(nèi)存總線的指令,以便一步執(zhí)行。 整數(shù)原子操作整數(shù)原子操作只能處理atomic_t類型的數(shù)據(jù)。 如果需要將atomic_t類型轉(zhuǎn)換為int類型,可以使用atomic_read ()來(lái)執(zhí)行。 原子整數(shù)運(yùn)算函數(shù)為atomic_* ()。 原子整數(shù)操作最常見(jiàn)的用途是實(shí)現(xiàn)計(jì)數(shù)器。 在原子上,不要在指令執(zhí)行過(guò)程中中斷,或者完成所有執(zhí)行,或者完全不執(zhí)行。 原子操作僅保證原子性,順序性根據(jù)屏障指令實(shí)施。 原子操作(2)、原子位操作位操作函數(shù)操作通常的存儲(chǔ)器地址。 殘奧儀表是指針和標(biāo)記,第0位是指定地址的最低有效位。 在32位機(jī)器中,第31位是給定地址的最高有效位,第32位是下一個(gè)字的最低有效位。 使用原子操作時(shí),通常會(huì)訪問(wèn)1字長(zhǎng)的內(nèi)存,因此標(biāo)簽應(yīng)該在031之間(64位機(jī)器中在063之間),但標(biāo)簽的范圍不受限制。 因?yàn)?/p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東科學(xué)技術(shù)職業(yè)學(xué)院《建筑給水排水》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東酒店管理職業(yè)技術(shù)學(xué)院《社會(huì)工作基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東金融學(xué)院《動(dòng)物微生物與免疫學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東建設(shè)職業(yè)技術(shù)學(xué)院《國(guó)際金融管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東工業(yè)大學(xué)《道路與橋梁工程實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東東軟學(xué)院《高級(jí)日語(yǔ)(I)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東創(chuàng)新科技職業(yè)學(xué)院《導(dǎo)向信息媒體設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海中醫(yī)藥基礎(chǔ)醫(yī)學(xué)免疫學(xué)課件緒論
- 廣東白云學(xué)院《計(jì)算機(jī)繪圖CAD》2023-2024學(xué)年第一學(xué)期期末試卷
- 共青科技職業(yè)學(xué)院《西方音樂(lè)史與欣賞Ⅰ》2023-2024學(xué)年第一學(xué)期期末試卷
- 《社區(qū)安全防范》課程教案
- 中石油度員工HSE培訓(xùn)計(jì)劃
- 瀝青路面損壞調(diào)查表-帶公式
- (完整版)Adams課程設(shè)計(jì)
- 30課時(shí)羽毛球教案
- 客服部相關(guān)報(bào)表解
- 全踝關(guān)節(jié)置換術(shù)ppt課件
- 學(xué)術(shù)英語(yǔ)寫作范文17篇
- 任發(fā)改委副主任掛職鍛煉工作總結(jié)范文
- 中華任姓字輩源流
- 2021年人事部年度年終工作總結(jié)及明年工作計(jì)劃
評(píng)論
0/150
提交評(píng)論