第5章 ARMLinux內(nèi)核.ppt_第1頁
第5章 ARMLinux內(nèi)核.ppt_第2頁
第5章 ARMLinux內(nèi)核.ppt_第3頁
第5章 ARMLinux內(nèi)核.ppt_第4頁
第5章 ARMLinux內(nèi)核.ppt_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,ARMLinux 內(nèi)核,2,提綱,1. ARM系統(tǒng)結(jié)構(gòu)簡介 2. ARM-Linux內(nèi)存管理 3. ARM-Linux 的中斷響應(yīng)和處理 4. ARM-Linux系統(tǒng)調(diào)用 5. 系統(tǒng)的啟動和初始化 6. ARM-Linux進(jìn)程管理和調(diào)度 7. Linux的模塊機(jī)制,3,1. ARM系統(tǒng)結(jié)構(gòu)簡介,ARM有7種運(yùn)行狀態(tài): 用戶狀態(tài)(User) 中斷狀態(tài)(IRQ, Imterrupt Request) 快中斷狀態(tài)(FIQ,Fast Imterrupt Request) 監(jiān)管狀態(tài)(Supervisor) 終止?fàn)顟B(tài)(Abort) 無定義狀態(tài)(Undefined) 系統(tǒng)狀態(tài)(System),4,ARM

2、系統(tǒng)結(jié)構(gòu)中各個寄存器的使用方式,5,2 ARM-Linux內(nèi)存管理,存儲管理是一個很大的范疇 存儲管理機(jī)制的實(shí)現(xiàn)和具體的CPU以及MMU的結(jié)構(gòu)關(guān)系非常緊密 操作系統(tǒng)內(nèi)核的復(fù)雜性相當(dāng)程度上來自內(nèi)存管理,對整個系統(tǒng)的結(jié)構(gòu)有著根本性的深遠(yuǎn)影響,6,2.1內(nèi)存管理和MMU,MMU,也就是“內(nèi)存管理單元”,其主要作用是兩個方面: 地址映射 對地址訪問的保護(hù)和限制 MMU可以做在芯片中,也可以作為協(xié)處理器,7,2.2 馮諾依曼結(jié)構(gòu)和哈佛結(jié)構(gòu),馮諾依曼結(jié)構(gòu):程序只是一種數(shù)據(jù),對程序也可以像對數(shù)據(jù)一樣加以處理,并且可以和數(shù)據(jù)存儲在同一個存儲器中 嵌入式系統(tǒng)中往往采用程序和數(shù)據(jù)兩個存儲器、兩條總線的系統(tǒng)結(jié)構(gòu),稱

3、為“哈佛結(jié)構(gòu)”,8,2.3 ARM存儲管理機(jī)制,ARM系統(tǒng)結(jié)構(gòu)中,地址映射可以是單層的按“段(section)”映射,也可以是二層的頁面映射 采用單層的段映射的時(shí)候,內(nèi)存中有個“段映射表” ,當(dāng)CPU訪問內(nèi)存的時(shí)候: 其32位虛地址的高12位用作訪問段映射表的下標(biāo),從表中找到相應(yīng)的表項(xiàng) 每個表項(xiàng)提供一個12位的物理段地址,以及對這個段的訪問許可標(biāo)志,將這12位物理段地址和虛擬地址中的低20位拼接在一起,就得到了32位的物理地址,9,如果采用頁面映射,“段映射表”就成了“首層頁面映射表”,映射的過程如下: 以32位虛地址的高12位(bit20-bit31)作為訪問首層映射表的下標(biāo),從表中找到相應(yīng)

4、的表項(xiàng),每個表項(xiàng)指向一個二層映射表。 以虛擬地址中的次8位(bit12-bit19)作為訪問所得二層映射表的下標(biāo),進(jìn)一步從相應(yīng)表項(xiàng)中取得20位的物理頁面地址。 最后,將20位的物理頁面地址和虛擬地址中的最低12位拼接在一起,就得到了32位的物理地址。,10,凡是支持虛存的CPU必須為有關(guān)的映射表提供高速緩存,使地址映射的過程在不訪問內(nèi)存的前提下完成,用于這個目的高速緩存稱為TLB 高速緩存 ARM系統(tǒng)結(jié)構(gòu)中配備了兩個地址映射TLB和兩個高速緩存,11,ARM處理器中,MMU是作為協(xié)處理器CP15的一部分實(shí)現(xiàn)的 MMU相關(guān)的最主要的寄存器有三個: 控制寄存器,控制MMU的開關(guān)、高速緩存的開關(guān)、寫

5、緩沖區(qū)的開關(guān)等 地址轉(zhuǎn)換表基地址寄存器 域訪問控制寄存器,12,控制寄存器中有S位(表示System)和R位(表示ROM),用于決定了CPU在當(dāng)前運(yùn)行狀態(tài)下對目標(biāo)段或者頁面的訪問權(quán)限:,13,2.4 ARM-Linux存儲機(jī)制的建立,ARM-Linux內(nèi)核也將這4GB虛擬地址空間分為兩個部分 ,系統(tǒng)空間和用戶空間 ARM將I/O也放在內(nèi)存地址空間中,所以系統(tǒng)空間的一部分虛擬地址不是映射到物理內(nèi)存,而是映射到一些I/O設(shè)備的地址,14,ARM處理器上的實(shí)現(xiàn)和x86的既相似又有很多不同: 在ARM處理器上,如果整個段(1MB,并且和1MB邊界對齊)都有映射,就采用單層映射;而在x86上總是采用二層

6、映射 ARM處理器上所謂的“段(section)”是固定長度的,實(shí)質(zhì)上就是超大型的頁面;而x86上的“段(segment)”則是不定長的 Linux在啟動初始化的時(shí)候依次調(diào)用:start_kernel()setup_arch()pageing_init()memtable_init()create_mapping(),15,Xsbase255開發(fā)系統(tǒng)存儲管理的描述數(shù)據(jù)結(jié)構(gòu):,16,2.5 ARM-Linux進(jìn)程的虛存空間,Linux虛擬內(nèi)存的實(shí)現(xiàn)需要6種機(jī)制的支持: 地址映射機(jī)制 內(nèi)存分配回收機(jī)制 緩存和刷新機(jī)制 請求頁機(jī)制 交換機(jī)制 內(nèi)存共享機(jī)制,17,系統(tǒng)中的每個進(jìn)程都各有自己的首層映射表

7、,這就是它的空間,沒有獨(dú)立的空間的就只是線程而不是進(jìn)程 Linux內(nèi)核需要管理所有的虛擬內(nèi)存地址,每個進(jìn)程虛擬內(nèi)存中的內(nèi)容在其task_struct結(jié)構(gòu)中指向的 vm_area_struct結(jié)構(gòu)中描敘,18,task_struct結(jié)構(gòu)分析圖 :,19,由于那些虛擬內(nèi)存區(qū)域來源各不相同,Linux使用vm_area_struct中指向一組虛擬內(nèi)存處理過程的指針來抽象此接口 為進(jìn)程創(chuàng)建新的虛擬內(nèi)存區(qū)域或處理頁面不在物理內(nèi)存中的情況下,Linux內(nèi)核重復(fù)使用進(jìn)程的vm_area_struct數(shù)據(jù)結(jié)構(gòu)集合 當(dāng)進(jìn)程請求分配虛擬內(nèi)存時(shí),Linux并不直接分配物理內(nèi)存,20,3 ARM-Linux 的中斷響

8、應(yīng)和處理,中斷是一個流程,一般來說要經(jīng)過三個環(huán)節(jié): 中斷響應(yīng) 中斷處理 中斷返回 中斷響應(yīng)是第一個環(huán)節(jié),主要是確定中斷源,在整個中斷機(jī)制中起著樞紐的作用,21,使CPU在響應(yīng)中斷的時(shí)候能迅速的確定中斷源,輔助手段主要有下列幾種: 中斷源通過數(shù)據(jù)總線提供一個代表具體設(shè)備的數(shù)值,稱為“中斷向量” 在外部提供一個“集線器”,稱為“中斷控制器” 將中斷控制器集成在CPU芯片中,但是設(shè)法“挪用”或“復(fù)制”原有的若干引線,而并不實(shí)際增加引線的數(shù)量,22,ARM是將中斷控制器集成在CPU內(nèi)部的,由外設(shè)產(chǎn)生的中斷請求都由芯片上的中斷控制器匯總成一個IRQ中斷請求 中斷控制器還向CPU提供一個中斷請求寄存器和一

9、個中斷控制寄存器 GPIO是一個通用的可編程的I/O接口,其接口寄存器中的每一位都可以分別在程序的控制下設(shè)置用于輸入或者輸出,23,ARM Linux將中斷源分為三組: 第一組是針對外部中斷源; 第二組中是針對內(nèi)部中斷源,它們都來自集成在芯片內(nèi)部的外圍設(shè)備和控制器,比如LCD控制器、串行口、DMA控制器等等。 第三組中斷源使用的是一個兩層結(jié)構(gòu)。,24,在Linux中,每一個中斷控制器都由strcut hw_interrut_type數(shù)據(jù)結(jié)構(gòu)表示:,25,每一個中斷請求線都有一個struct irqdesc 數(shù)據(jù)結(jié)構(gòu)表示:,26,具體中斷處理程序則在數(shù)據(jù)結(jié)構(gòu) struct irqaction 三

10、個數(shù)據(jù)結(jié)構(gòu)的相互關(guān)系如圖 :,irq_descNR_IRQS,27,在進(jìn)入中斷響應(yīng)之前,CPU自動完成下列操作: 將進(jìn)入中斷響應(yīng)前的內(nèi)容裝入r14_irq,即中斷模式的lr,使其指向中斷點(diǎn)。 將cpsr原來的內(nèi)容裝入spsr_irq,即中斷模式的spsr;同時(shí)改變cpsr的內(nèi)容使CPU運(yùn)行于中斷模式,并關(guān)閉中斷。 將堆棧指針sp切換成中斷模式的sp_irq。 將pc指向0 x18。,28,中斷流程圖:,29,4 ARM-Linux系統(tǒng)調(diào)用,arm處理器有自陷指令SWI cpu遇到自陷指令后,跳轉(zhuǎn)到內(nèi)核態(tài) 操作系統(tǒng)首先保存當(dāng)前運(yùn)行的信息,然后根據(jù)系統(tǒng)調(diào)用號查找相應(yīng)的函數(shù)去執(zhí)行 執(zhí)行完了以后恢復(fù)原

11、先保存的運(yùn)行信息返回,30,實(shí)驗(yàn)一創(chuàng)建和使用一個新的系統(tǒng)調(diào)用,在 arch/arm/kernel/目錄下創(chuàng)建一個新的文件mysyscall.c 在 arch/arm/kernel/call.S 中添加新的系統(tǒng)調(diào)用,新的系統(tǒng)調(diào)用號0 x900000+226 修改arch/arm/kernel/目錄下的Makefile文件,在obj-y后面添加mysyscall.o,31,實(shí)驗(yàn)一創(chuàng)建和使用一個新的系統(tǒng)調(diào)用(1),一個測試程序來使用新的系統(tǒng)調(diào)用:,32,實(shí)驗(yàn)一創(chuàng)建和使用一個新的系統(tǒng)調(diào)用(2),然后執(zhí)行 啟動開發(fā)板,將應(yīng)用程序test通過zmodem協(xié)議下載到開發(fā)板的文件系統(tǒng)目錄下,在板子上運(yùn)行tes

12、t程序所得結(jié)果如下:,33,5. 系統(tǒng)的啟動和初始化,使用bootloader將內(nèi)核映像載入 內(nèi)核數(shù)據(jù)結(jié)構(gòu)初始化(內(nèi)核引導(dǎo)第一部分) :start_kernel()中調(diào)用了一系列初始化函數(shù),以完成kernel本身的設(shè)置 ,啟動init過程,創(chuàng)建第一個內(nèi)核線程 start_kernel()函數(shù)中各個主要初始化函數(shù)的功能,34,外設(shè)初始化-內(nèi)核引導(dǎo)第二部分:init()函數(shù)作為內(nèi)核線程,首先鎖定內(nèi)核,然后調(diào)用do_basic_setup()完成外設(shè)及其驅(qū)動程序的加載和初始化 外設(shè)初始化的主要過程,35,init進(jìn)程和inittab腳本 init進(jìn)程是系統(tǒng)所有進(jìn)程的起點(diǎn),它的進(jìn)程號是1 initta

13、b是以行為為單位的描述性(非執(zhí)行性)文本,每一個指令行都具有以下格式:,36,rc啟動腳本:rc.sysinit中最常見的動作就是激活交換分區(qū),檢查磁盤,加載硬件模塊 Shell的啟動,37,6 ARM-Linux進(jìn)程管理和調(diào)度,Linux進(jìn)程有5種狀態(tài),分別是: TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE TASK_ZOMBIE TASK_STOPPED,38,6.1 Linux進(jìn)程的創(chuàng)建、執(zhí)行和消亡,1. Linux進(jìn)程的創(chuàng)建 系統(tǒng)的第一個真正的進(jìn)程,init內(nèi)核線程(或進(jìn)程)的標(biāo)志符為1 新進(jìn)程通過克隆老進(jìn)程或當(dāng)前進(jìn)程來創(chuàng)建,

14、系統(tǒng)調(diào)用fork或clone可以創(chuàng)建新任務(wù) 復(fù)制完成后,Linux允許兩個進(jìn)程共享資源而不是復(fù)制各自的拷貝,39,2. Linux進(jìn)程的執(zhí)行 要讓若干新進(jìn)程按照需要處理不同的事情,就必須通過系統(tǒng)調(diào)用exec 函數(shù)sys_execve將可執(zhí)行文件的名字從用戶空間取入內(nèi)核空間以后就調(diào)用do_execve( )執(zhí)行具體的操作,40,do_execve( )執(zhí)行的流程: 打開可執(zhí)行文件,獲取該文件的 file結(jié)構(gòu)。 獲取參數(shù)區(qū)長度,將存放參數(shù)的頁面清零。 對linux_binprm結(jié)構(gòu)的其它項(xiàng)作初始化 通過對參數(shù)和環(huán)境個數(shù)的計(jì)算來檢查是否在這方面有錯誤 調(diào)用prepare_binprm() 對數(shù)據(jù)結(jié)構(gòu)

15、linux_binprm作進(jìn)一步準(zhǔn)備 把一些參數(shù)(文件名、環(huán)境變量、文件參數(shù))從用戶空間復(fù)制到內(nèi)核空間 調(diào)用search_binary_handler(),搜尋目標(biāo)文件的處理模塊并執(zhí)行,41,3. Linux進(jìn)程的消亡 進(jìn)程終止由可終止進(jìn)程的系統(tǒng)調(diào)用通過調(diào)用do_exit()實(shí)現(xiàn) do_exit(long code)帶一個參數(shù)code,用于傳遞終止進(jìn)程的原因,42,以下情況要調(diào)用do_exit()函數(shù): 具體對應(yīng)的系統(tǒng)調(diào)用出錯,不得不終止進(jìn)程 ,如: do_page_fault() sys_sigreturn() setup_frame() save_v86_state() 其他終止進(jìn)程的情況

16、,通過調(diào)用以下函數(shù)實(shí)現(xiàn)終止:sys_exit() sys_reboot() do_signal(),43,LINUX系統(tǒng)進(jìn)程的切換包括三個層次: 用戶數(shù)據(jù)的保存 寄存器數(shù)據(jù)的保存 系統(tǒng)層次的保存,44,6.2 ARM-Linux進(jìn)程的調(diào)度,Linux進(jìn)程調(diào)度由函數(shù)schedule()實(shí)現(xiàn)的,其基本流程可以概括為五步: 清理當(dāng)前運(yùn)行中的進(jìn)程 選擇下一個投入運(yùn)行的進(jìn)程 設(shè)置新進(jìn)程的運(yùn)行環(huán)境 執(zhí)行進(jìn)程上下文切換 后期整理 Linux調(diào)度的時(shí)機(jī)有兩種: 在內(nèi)核應(yīng)用中直接調(diào)用schedule() 被動調(diào)用schedule(),45,7. Linux的模塊機(jī)制,Linux中的可加載模塊(Module)是

17、Linux內(nèi)核支持的動態(tài)可加載模塊 Insmod rmmod Linux module載入內(nèi)核后,它就成為內(nèi)核代碼的一部分 若某個module空閑,用戶便可將它卸載出內(nèi)核,46,與module相關(guān)的命令有: lsmod 把現(xiàn)在 kernel 中已經(jīng)安裝的modules 列出來 insmod 把某個 module 安裝到 kernel 中 rmmod 把某個沒在用的 module 從kernel中卸載 depmod 制造 module dependency file,以告訴將來的 insmod 要去哪兒找modules 來安裝,47,module 相關(guān)的數(shù)據(jù)結(jié)構(gòu)主要有 : module的聲明如下

18、:,48,symbol_table的聲明如下:,49,和module相關(guān)的系統(tǒng)調(diào)用有:,50,7.1 Module的使用,Module的裝入有兩種方法 : 通過insmod命令手工將module載入內(nèi)核 根據(jù)需要載入module(demand loaded module) 卸載module有兩種方法 用戶使用rmmod命令卸載module kerneld自動卸載,51,2.4系列內(nèi)核的insmod工作的主要流程是: insmod先調(diào)用系統(tǒng)調(diào)用sys_get_kernel_syms,將當(dāng)前加到系統(tǒng)中的模塊和內(nèi)核的符號表全部輸出到kernel_sym結(jié)構(gòu)中,為后面使用。 將Mymodule目標(biāo)文件

19、讀進(jìn)insmod用戶進(jìn)程空間,成為一個映像。 根據(jù)第一步得到的信息,將Mymodule映像中的地址沒有確定的函數(shù)和變量一一修正過來。 調(diào)用系統(tǒng)調(diào)用sys_create_module、sys_init_module,將Mymodule鏈入到系統(tǒng)中去,52,實(shí)驗(yàn)二 Linux2.6內(nèi)核移植,2.4.18內(nèi)核、2.6內(nèi)核和LynuxOS 4.0在最好情況、平均情況下和最壞情況下任務(wù)的響應(yīng)時(shí)間比較:,53,實(shí)驗(yàn)二 Linux2.6內(nèi)核移植(1),Linux內(nèi)核移植大致可以歸納成以下幾個步驟: 準(zhǔn)備工作,下載Linux2.6內(nèi)核源代碼和編譯器源代碼等 建立交叉編譯環(huán)境 制作Boot Loader 修改和

20、編譯內(nèi)核 制作文件系統(tǒng) 編寫相應(yīng)的設(shè)備驅(qū)動 編寫應(yīng)用程序,54,實(shí)驗(yàn)二 Linux2.6內(nèi)核移植(2),1.準(zhǔn)備工作 下載Linux2.6.10內(nèi)核源代碼,可以到 下載 ARM Linux是基于標(biāo)準(zhǔn)Linux內(nèi)核為ARM做的補(bǔ)丁,可以在 .uk上下載,55,實(shí)驗(yàn)二 Linux2.6內(nèi)核移植(3),2.編譯交叉編譯工具 編譯linux2.6內(nèi)核需要gcc3.2以上的版本 ,在這次實(shí)驗(yàn)中在主機(jī)平臺上編譯arm-linux-gcc3.4.2 修改t-linux文件,在TARGET_LIBGCC2_CFLAGS加上-D_gthr_posix_h和-Dinhibit_libc 編譯安裝,56,實(shí)驗(yàn)二 L

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論