嵌入式LINUX操作系統(tǒng)_第1頁
嵌入式LINUX操作系統(tǒng)_第2頁
嵌入式LINUX操作系統(tǒng)_第3頁
嵌入式LINUX操作系統(tǒng)_第4頁
嵌入式LINUX操作系統(tǒng)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式Linux操作系統(tǒng)主要內(nèi)容任務(wù)調(diào)度存儲管理中斷系統(tǒng)驅(qū)動程序多線程程序設(shè)計Linux的歷史Linux操作系統(tǒng)是UNIX操作系統(tǒng)的一種克隆系統(tǒng)。它誕生于1991年的10月5日(這是第一次正式向外公布的時間)?,F(xiàn)已成為今天世界上使用最多的一種UNIX類操作系統(tǒng),并且使用人數(shù)還在迅猛增長。Linux操作系統(tǒng)的誕生、發(fā)展和成長過程始終依賴著以下五個重要支柱:UNIX操作系統(tǒng)、MINIX操作系統(tǒng)、GNU計劃、POSIX標(biāo)準(zhǔn)和Internet網(wǎng)絡(luò)。

進程狀態(tài)運行態(tài):正在使用CPU運行的狀態(tài)可運行態(tài):進程已分配到除CPU外所需要的其它資源。等待態(tài):正在等待某個事件或某個資源時所處的狀態(tài)。處于可中斷等待態(tài)的進程可以由信號解除其等待態(tài)。處于不可中斷等待態(tài)的進程,一般是直接或間接等待硬件條件,它只能用特定的方式來解除。暫停態(tài):進程需要接受某種特殊處理而暫時停止運行所處的狀態(tài)。例如,正在接受調(diào)試的進程就處于這種狀態(tài)。僵死態(tài):進程的運行已經(jīng)結(jié)束,但它所占的資源還未釋放。優(yōu)先級策略系統(tǒng)中所有進程的優(yōu)先級在[0,MAX_PRIO-1]之間,數(shù)值越低優(yōu)先級越高;實時進程的優(yōu)先級范圍在[0,MAX_RT_PRIO-1],優(yōu)先級從創(chuàng)建之初便已確定,不會改變;非實時進程的優(yōu)先級在[MAX_RT_PRIO,MAX_PRIO]之間,優(yōu)先級分為靜態(tài)和動態(tài)兩方面。靜態(tài)優(yōu)先級在進程產(chǎn)生的時候確定:static_prio=MAX_RT_PRIO+nice+20動態(tài)優(yōu)先級在運行時隨著進程狀態(tài)而動態(tài)變化:調(diào)度策略相同優(yōu)先級的實時進程的調(diào)度策略有兩種:SCHED_RR:時間片輪轉(zhuǎn);在運行了指定的時間片后會被搶占并重新調(diào)度SCHED_FIFO:先入先出方式,每一個可以運行的實時進程按照它在調(diào)度隊列中的固定順序運行非實時進程的調(diào)度策略SCHED_OTHER:以時間片輪轉(zhuǎn)為基礎(chǔ),根據(jù)每個進程的情況進行一定的優(yōu)化使得進程調(diào)度可以公平有效而又不損失響應(yīng)時間。調(diào)度程序Schedule()voidschedule(void){if(存在中斷下半部分

服務(wù)請求)

調(diào)用do_bottom_half來運行中斷處理的后半截。if(當(dāng)前進程是時間片輪轉(zhuǎn)的實時進程)根據(jù)當(dāng)前進程的狀態(tài)進行相應(yīng)處理。while(遍歷整個可運行態(tài)的隊列){if(當(dāng)前位置的進程可以被調(diào)度)

調(diào)用goodness來計算當(dāng)前位置進程的權(quán)值。if(返回的權(quán)值大于以前保存的最大權(quán)值)

保存這個權(quán)值以及進程。}使用switch_to宏來切換當(dāng)前進程和選中進程的上下文。}進程調(diào)度的時機增加一個新進程進程狀態(tài)轉(zhuǎn)換系統(tǒng)調(diào)用執(zhí)行完畢返回用戶態(tài)中斷處理完畢返回到用戶態(tài)當(dāng)前進程的時間片使用完畢Linux的存儲器管理虛擬存儲管理(省略)內(nèi)存分配策略伙伴系統(tǒng)算法Slab分配器伙伴系統(tǒng)每個空間按照尺寸為2U大小的塊如果申請空間的尺寸s滿足2U-1<s<=2U,則分配整個塊通過不斷對分大內(nèi)存塊來獲得小內(nèi)存塊,并盡可能合并空閑塊。當(dāng)一個內(nèi)存塊被對分后,每一部分成為對方的伙伴1112Linux中的伙伴系統(tǒng)所有頁面分成10組不同大小的頁塊。每組中的塊大小分別是1,2,4,8,?,512個頁面,分別通過一個free-area-struct結(jié)構(gòu)管理將10個free-area-struct結(jié)構(gòu)組成一個free-area[]數(shù)組。若所請求的頁面數(shù)目不是2的冪次方,則按稍大于此數(shù)目的2的冪次方在頁塊組中查找空閑頁塊,如果對應(yīng)的頁塊鏈表中沒有空閑頁塊,則在更大的頁塊鏈表中查找。釋放頁面時,伙伴系統(tǒng)會將頁面插入到對應(yīng)的頁面鏈表中,并且檢查新插入的頁面能否和原有的頁塊組合構(gòu)成一個更大的頁塊,如果有兩個塊的大小相同且這兩個塊的物理地址連續(xù),則合并成一個新頁塊并加入到對應(yīng)的頁塊鏈表中,并迭代此過程直到不能合并為止,Slab如果每次都從伙伴系統(tǒng)中按頁框為單位分配和釋放內(nèi)存塊,不僅造成大量的內(nèi)碎片,而且嚴(yán)重影響系統(tǒng)的運行性能。Slab分配器通過預(yù)先分配一塊內(nèi)存區(qū)域當(dāng)作緩沖區(qū),當(dāng)要求分配對象時,就直接從緩沖區(qū)中返回,釋放對象時Slab分配器只是將對象歸還到緩沖區(qū)以供下次分配時使用,這樣就可以避免頻繁地調(diào)用伙伴系統(tǒng)的申請和釋放操作,從而加快申請和釋放對象的時間。Linux中的Slab分配器三層基本結(jié)構(gòu)緩存(cache)Slab對象(object)Linux中斷處理流程確定該次中斷的來源;保存現(xiàn)場,把中斷發(fā)生前所有寄存器的內(nèi)容都保存在堆棧中;do_IRQ()函數(shù)根據(jù)中斷號,然后進行中斷處理;irq_exit()函數(shù)執(zhí)行軟中斷。Linux的基本數(shù)據(jù)結(jié)構(gòu)(中斷描述符)structirqdesc{ unsignedint nomask:1; /*IRQdoesnotmaskinIRQ*/ unsignedint enabled:1; /*IRQiscurrentlyenabled*/ unsignedint triggered:1; /*IRQhasoccurred*/ unsignedint probing:1; /*IRQinuseforaprobe*/ unsignedint probe_ok:1; /*IRQcanbeusedforprobe*/ unsignedint valid:1; /*IRQclaimable*/ unsignedint noautoenable:1; /*don'tautomaticallyenableIRQ*/ unsignedint unused:25; void(*mask_ack)(unsignedintirq);/*MaskandacknowledgeIRQ*/ void(*mask)(unsignedintirq); /*MaskIRQ*/ void(*unmask)(unsignedintirq);/*UnmaskIRQ*/ structirqaction*action; /*IRQlockdetection*/};structirqdescirq_desc[NR_IRQS];//中斷描述符表中斷處理相應(yīng)結(jié)構(gòu)structirqaction{ void(*handler)(int,void*,structpt_regs*); unsignedlongflags; unsignedlongmask; constchar*name; void*dev_id; structirqaction*next;};do_IRQasmlinkagevoiddo_IRQ(intirq,structpt_regs*regs){ structirqdesc*desc; structirqaction*action; intcpu; if(irq>=NR_IRQS) gotobad_irq; desc=irq_desc+irq; spin_lock(&irq_controller_lock); desc->mask_ack(irq);//屏蔽此中斷源

spin_unlock(&irq_controller_lock); desc->triggered=1;

do_IRQ()action=desc->action;if(action){ intstatus=0;//遍歷所有的中斷相應(yīng)塊,并執(zhí)行相應(yīng)程序

do{ status|=action->flags; action->handler(irq,action->dev_id,regs); action=action->next; }while(action);}//軟中斷?。?!if(softirq_pending(cpu)) do_softirq();return;bad_irq: irq_err_count+=1; printk(KERN_ERR"IRQ:spuriousinterrupt%d\n",irq); return;}驅(qū)動程序申請中斷intrequest_irq(unsignedintirq,void(*handler)(int,void*,structpt_regs*),unsignedlongirq_flags,constchar*devname,void*dev_id);irq:要申請的中斷號;handler:中斷處理函數(shù)指針;irq_flags:中斷管理掩碼;devname:設(shè)備名稱;dev_id:設(shè)備相關(guān)的私用存儲區(qū),用于標(biāo)示自身申請中斷的實現(xiàn)intrequest_irq(unsignedintirq,void(*handler)(int,void*,structpt_regs*), unsignedlongirq_flags,constchar*devname,void*dev_id){ unsignedlongretval; structirqaction*action; action=(structirqaction*)kmalloc(sizeof(structirqaction),GFP_KERNEL); if(!action)return-ENOMEM; action->handler=handler; action->flags=irq_flags; action->mask=0; action->name=devname;action->next=NULL; action->dev_id=dev_id; retval=setup_arm_irq(irq,action); if(retval) kfree(action); returnretval;}釋放中斷voidfree_irq(unsignedintirq,void*dev_id)irq:中斷號dev_id:中斷處理程序標(biāo)示釋放中斷的實現(xiàn)voidfree_irq(unsignedintirq,void*dev_id){ structirqaction*action,**p; unsignedlongflags; if(irq>=NR_IRQS||!irq_desc[irq].valid){ //錯誤處理

return; } spin_lock_irqsave(&irq_controller_lock,flags); for(p=&irq_desc[irq].action;(action=*p)!=NULL;p=&action->next){ if(action->dev_id!=dev_id) continue; /*Foundit-nowfreeit*/ *p=action->next; kfree(action); gotoout; }out: spin_unlock_irqrestore(&irq_controller_lock,flags);}中斷處理程序voidhandler(intirq,void*dev_id,structpt_regs*regs);irq:中斷號dev_id:驅(qū)動程序標(biāo)示regs:上下文寄存器現(xiàn)場軟中斷、tasklet(小任務(wù))和下半部分為什么要引入軟中斷(延遲任務(wù))?在上述硬件中斷的處理過程中,需要關(guān)閉中斷;如果中斷處理程序的處理過于復(fù)雜,則導(dǎo)致不能及時響應(yīng)中斷;將比較簡單的任務(wù)放到硬件中斷處理過程,把復(fù)雜的操作放到軟中斷操作過程,提高內(nèi)核的響應(yīng)中斷速度。軟中斷可以被硬件中斷所打斷。軟中斷、tasklet(小任務(wù))和下半部分軟中斷tasklet下半部分可延遲函數(shù)動態(tài)分配并發(fā)性軟中斷No同類軟中斷可并發(fā)在多個CPU上運行TaskletYes不同類tasklet可并發(fā)在多個CPU上運行,同類不行下半部分No不能并發(fā)在多個CPU上運行軟中斷系統(tǒng)中固定有4種軟中斷軟中斷存放在一個softirq_vec數(shù)組中,數(shù)據(jù)類型為softirq_action。softirq_action包含了軟中斷函數(shù)指針和相關(guān)數(shù)據(jù)結(jié)構(gòu)。軟中斷優(yōu)先級描述HI_SOFTIRQ0高優(yōu)先級tasklet和軟中斷NET_TX_SOFTIRQ1網(wǎng)絡(luò)發(fā)送軟中斷NET_RX_SOFTIRQ2網(wǎng)絡(luò)接收軟中斷TASKLET_SOFTIRQ3tasklet軟中斷調(diào)用的時機通過調(diào)用softirq_pending()判斷是否有軟中斷如果有軟中斷則執(zhí)行do_softirq();判斷的時機包括:do_IRQ()完成了中斷處理程序smp_apic_timer_interrupt完成本地時鐘中斷當(dāng)一個特定的ksoftirqd內(nèi)核線程被喚醒…tasklet建立在HI_SOFTIRQ和TASKLET_SOFIR

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論