Linux系統(tǒng)移植(第2版):第1章 Linux內(nèi)核介紹_第1頁
Linux系統(tǒng)移植(第2版):第1章 Linux內(nèi)核介紹_第2頁
Linux系統(tǒng)移植(第2版):第1章 Linux內(nèi)核介紹_第3頁
Linux系統(tǒng)移植(第2版):第1章 Linux內(nèi)核介紹_第4頁
Linux系統(tǒng)移植(第2版):第1章 Linux內(nèi)核介紹_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

第1章Linux內(nèi)核介紹1.1系統(tǒng)調(diào)用接口1.2進程管理1.3內(nèi)存管理1.4虛擬文件系統(tǒng)1.5設備驅(qū)動程序1.1系統(tǒng)調(diào)用接口1.1.1Linux系統(tǒng)調(diào)用1.1.2用戶編程接口1.1.3系統(tǒng)調(diào)用與服務例程的對應關系1.1.4系統(tǒng)調(diào)用過程1.1.5系統(tǒng)調(diào)用傳遞的參數(shù)1.1.1Linux系統(tǒng)調(diào)用所有的操作系統(tǒng)在內(nèi)核里都有一些內(nèi)建的函數(shù),這些函數(shù)完成對硬件的訪問和對文件的打開、讀、寫、關閉等操作。Linux系統(tǒng)中稱這些函數(shù)叫做“系統(tǒng)調(diào)用”(即systemcall)。這些函數(shù)實現(xiàn)了將操作從用戶空間轉(zhuǎn)換到內(nèi)核空間。為了對系統(tǒng)進行保護,Linux系統(tǒng)定義了內(nèi)核模式和用戶模式。1.1.2用戶編程接口用戶編程接口是為用戶編程過程提供的各種功能庫函數(shù),如分配空間、拷貝字符、打開文件等。Linux用戶編程接口(API)遵循了在UNIX中最流行的應用編程界面標準——POSIX標準。不同的語言和平臺為用戶提供了豐富的編程接口。系統(tǒng)調(diào)用與用戶編程接口它們之間存在聯(lián)系。一個或者多個系統(tǒng)調(diào)用會對應到一個具體的應用程序使用的API;但是,并非所有的API都需要使用到系統(tǒng)調(diào)用。1.1.3系統(tǒng)調(diào)用與服務例程的對應關系為了通過系統(tǒng)調(diào)用號來調(diào)用不同的內(nèi)核服務例程,系統(tǒng)必須創(chuàng)建并管理好一張系統(tǒng)調(diào)用表。該表用于系統(tǒng)調(diào)用號與內(nèi)核服務函數(shù)的映射,Linux用數(shù)組sys_call_table表示這個表。在這個表的每個表項中存放著對應內(nèi)核服務例程的指針,而該表項的下標就是該內(nèi)核服務例程的系統(tǒng)調(diào)用號。Linux規(guī)定,在i386體系中,處理器的寄存器eax用來傳遞系統(tǒng)調(diào)用號。1.1.4系統(tǒng)調(diào)用過程1.1.5系統(tǒng)調(diào)用傳遞的參數(shù)系統(tǒng)調(diào)用中輸入輸出的參數(shù)為實際傳遞的值或者是用戶態(tài)進程的地址,或者是指向用戶態(tài)函數(shù)指針的數(shù)據(jù)結(jié)構(gòu)地址。傳遞的參數(shù)放在寄存器eax中,即系統(tǒng)調(diào)用號。寄存器傳遞參數(shù)的個數(shù)滿足兩個條件:參數(shù)的長度不超過寄存器的長度不包括eax中的系統(tǒng)調(diào)用號,參數(shù)的個數(shù)不超過6個。1.2進程管理1.2.1進程1.2.2進程描述符1.2.3進程狀態(tài)1.2.4進程調(diào)度1.2.5進程地址空間1.2.1進程進程是程序執(zhí)行時的一個實體。程序包含指令和數(shù)據(jù),而進程包含程序計數(shù)器和全部CPU寄存器的值。進程的堆棧中存儲著一些數(shù)據(jù),如子程序參數(shù)、返回地址及變量之類的臨時數(shù)據(jù)。當前的執(zhí)行程序(進程)包含著當前處理器中的活動狀態(tài)。1.2.2進程描述符內(nèi)核對進程的優(yōu)先級、進程的狀態(tài)、地址空間等采用進程描述符表示。在Linux內(nèi)核中,進程用相當大的一個稱為task_struct的結(jié)構(gòu)表示。structtask_struct{volatilelongstate;

/*

-1unrunnable,0runnable,>0stopped*/...unsignedintflags;

/*

perprocessflags,definedbelow*/...structlist_headtasks;structmm_struct*mm,*active_mm;/*

taskstate*/structlinux_binfmt*binfmt;intexit_state;...structlist_headthread_group;structcompletion*vfork_done;

/*

forvfork()*/int__user*set_child_tid;

/*

CLONE_CHILD_SETTID*/int__user*clear_child_tid;

/*

CLONE_CHILD_CLEARTID*/...};1.2.3進程狀態(tài)進程描述符中state字段描述進程當前的狀態(tài)。它由一組標志組成,其中每個標志描述一種可能的進程狀態(tài)。在2.6內(nèi)核中,進程只能處于這些狀態(tài)中的一種??蛇\行狀態(tài)(TASK_RUNNING等待狀態(tài)(WAITING)暫停狀態(tài)(TASK_STOPPED)僵死狀態(tài)(EXIT_ZOMBIE)1.2.4進程調(diào)度Linux進程調(diào)度的目的就是調(diào)度程序運行時,要在所有可運行狀態(tài)的進程中選擇最值得運行的進程投入運行。每個進程的task_struct結(jié)構(gòu)中有policy、priority、counter和rt_priority這4項是選擇進程的依據(jù)。1.Linux進程分類Linux在執(zhí)行進程調(diào)度的時候,對不同類型的進程采取的策略也不同,一般將Linux分為以下3類。交互式進程批處理進程(BatchProcess)實時進程2.Linux進程優(yōu)先級Linux系統(tǒng)中每一個普通進程都有一個靜態(tài)優(yōu)先級。這個值會被調(diào)度器用來作為參考來調(diào)度進程。在內(nèi)核中調(diào)度的優(yōu)先級區(qū)間為[100,139],數(shù)字越小,優(yōu)先級越高。一個新的進程總是從它的父進程繼承此值。靜態(tài)優(yōu)先級(priority)動態(tài)優(yōu)先級(counter)實時優(yōu)先級(rt_priority)Basetimequantum3.Linux進程的調(diào)度算法在Linux系統(tǒng)中,進程作為程序的實體始終運行在系統(tǒng)中,并且進程占用系統(tǒng)資源,所以進程調(diào)度算法優(yōu)劣將會嚴重影響到系統(tǒng)的性能。常見的進程調(diào)度算法。時間片輪轉(zhuǎn)調(diào)度算法(round-robin)優(yōu)先權(quán)調(diào)度算法FIFO(先進先出)調(diào)度算法1.2.5進程地址空間Linux的虛擬地址空間為0~4GB。虛擬的4GB空間被Linux內(nèi)核分為內(nèi)核空間和用戶空間兩部分。將最高的1GB(從虛擬地址0xC0000000到0xFFFFFFFF)留給內(nèi)核使用,稱為“內(nèi)核空間”。將較低的3GB(從虛擬地址0x00000000到0xBFFFFFFF)留給用戶進程使用,稱為“用戶空間”。與進程地址空間有關的全部信息都包含在一個叫做內(nèi)存描述符(memeorydesvriptor)的數(shù)據(jù)結(jié)構(gòu)中,其結(jié)構(gòu)類型為mm_structs進程描述符的mm字段,就是指向這個結(jié)構(gòu)的。1.創(chuàng)建進程地址空間copy_mm()函數(shù)通過建立新進程的所有頁表和內(nèi)存描述符,來創(chuàng)建進程的地址空間。01

staticintcopy_mm(unsignedlongclone_flags,structtask_struct*

tsk)02

{03

structmm_struct*

mm,*oldmm;04

intretval;05

42

}2.刪除進程地址空間內(nèi)核調(diào)用exit_mm()函數(shù)釋放進程的地址空間。01

staticvoidexit_mm(structtask_struct*

tsk)02

{03

m_release(tsk,mm);04

/*得到讀寫信號量*/05

down_read(&mm->mmap_sem);06

core_state=mm->core_state;07

if(core_state){08

structcore_threadself;09

/*釋放讀寫信號量*/10

up_read(&mm->mmap_sem);33

enter_lazy_tlb(mm,current);34

/*釋放用戶虛擬空間的數(shù)據(jù)結(jié)構(gòu)*/35

clear_freeze_flag(tsk);36

task_unlock(tsk);37

mm_update_next_owner(mm);38

/*遞減mm的引用計數(shù)并是否為0,如是,則釋放mm所代表的映射*/39

mmput(mm);40

}1.3內(nèi)存管理1.3.1內(nèi)存管理技術1.3.2內(nèi)存區(qū)管理1.3.3內(nèi)核中獲取內(nèi)存的幾種方式1.3.1內(nèi)存管理技術操作系統(tǒng)維護虛擬地址和物理地址轉(zhuǎn)換的信息,處理器通過這組信息將虛擬地址轉(zhuǎn)換為物理地址。虛擬內(nèi)存和物理內(nèi)存被分為適當大小的塊,叫做頁。每個物理頁面都有一個structpage結(jié)構(gòu),位于include/linux/mm.h,該結(jié)構(gòu)體包含了管理物理頁面時的所有信息。typedefstructpage{

structlist_headlist;

//指向鏈表中的下一頁

structaddress_space*mapping; //用來指定我們正在映射的索引節(jié)點(inode)

unsignedlongindex;

//在映射表中的偏移

structpage*next_hash;

//指向頁高速緩存哈希表中下一個共享的頁

atomic_tcount;

//引用這個頁的個數(shù)

unsignedlongflags;

//頁面各種不同的屬性

structlist_headlru;

//用在active_list中

wait_queue_head_twait;

//等待這一頁的頁隊列

structpage**pprev_hash;//指向頁高速緩存哈希表中前一個共享的頁與next_hash相對應

structbuffer_head*

buffers;

//把緩沖區(qū)映射到一個磁盤塊

void*virtual;

structzone_struct*zone;

//頁所在的內(nèi)存管理區(qū)

}mem_map_t;1.請求頁面調(diào)度(DemandPaging)為了節(jié)省物理內(nèi)存,只加載執(zhí)行程序正在使用的虛擬頁,這種進行訪問時才加載虛擬頁的技術叫做DemandPaging。Linux使用demandpaging技術將可執(zhí)行映像加載到進程的虛擬內(nèi)存中,在執(zhí)行命令時,包含命令的文件被打開,將該文件的內(nèi)容映射到進程的虛擬內(nèi)存中。這個過程通過修改描述進程內(nèi)存映射的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn),也叫做內(nèi)存映射(memorymapping)。2.頁面置換技術(Swapping)Linux使用LRU(LeastRecentlyUsed,最近最少使用置換算法)的頁面技術公平地選擇需要從系統(tǒng)中廢棄的頁面?;锇橄到y(tǒng)算法,該算法用以解決外碎片問題。把所有的空閑頁框分為11個塊鏈表,每個塊鏈表分別包含1、2、4、8、16、32、64、128、256、512和1024個連續(xù)的頁框。對于1024個頁框的最大請求對應著4MB大小的連續(xù)RAM塊。每個塊的第一個頁框的物理地址是該塊大小的整數(shù)倍。非連續(xù)內(nèi)存管理,當對內(nèi)存區(qū)的請求不是很頻繁的時候,通過連續(xù)的線性地址訪問非連續(xù)的頁框,該方法可以避免外碎片,但是其帶來的負面因素是打亂了內(nèi)核表。1.3.2內(nèi)存區(qū)管理內(nèi)存區(qū)(memoryarea)是具有連續(xù)的物理地址和任意長度的內(nèi)存單元序列?;锇橄到y(tǒng)采用的是頁框作為基本內(nèi)存區(qū),適合于大內(nèi)存的請求,對小內(nèi)存的請求容易造成內(nèi)碎片?;锇橄到y(tǒng)的調(diào)用為了獲得存放新內(nèi)存區(qū)所需的額外頁框,同時也為了釋放不再包含內(nèi)存區(qū)的頁框,用一個動態(tài)鏈表來記錄每個頁框所包含的空閑內(nèi)存區(qū)。物理內(nèi)存被劃分為3個區(qū)來管理,它們是ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。每個區(qū)都用structzone_struct結(jié)構(gòu)表示,定義于include/linux/mmzone.h:1.3.3內(nèi)核中獲取內(nèi)存的幾種方式操作系統(tǒng)的內(nèi)存管理方案優(yōu)劣是決定其效率高低的重要因素,時間與空間常常作為內(nèi)存管理方案優(yōu)劣的衡量指標。首先,分配/釋放內(nèi)存是一個發(fā)生頻率很高的操作,所以它要求有一定的實時性,另外,內(nèi)存又是一種非常寶貴的資源,所以要盡量減少內(nèi)存碎片的產(chǎn)生。1.伙伴算法分配大片物理內(nèi)存alloc_pages(gfp_mask,order):獲得連續(xù)的頁框,返回頁描述符地址,是其他類型內(nèi)存分配的基礎。__get_free_pages(gfp_mask,order):獲得連續(xù)的頁框,并返回頁框?qū)木€性地址。線性地址與物理地址是內(nèi)核直接映射方式。該方法不能用于大于896M的高端內(nèi)存。2.slab緩沖區(qū)分配小片物理內(nèi)存內(nèi)核提供了后備高速緩存機制,稱為“slab分配器”。slab分配器實現(xiàn)的高速緩存具有kmem_cache_t類型,可通過調(diào)用kmem_cache_create創(chuàng)建。kmem_cache_createkmem_cache_allockmalloc(gfp_mask,size)3.非連續(xù)內(nèi)存區(qū)分配vmalloc(size):分配非連續(xù)內(nèi)存區(qū),其線性地址連續(xù),物理地址不連續(xù),減少了外碎片,但是其性能低,因為要打亂內(nèi)核頁表。通常只是分配大內(nèi)存時,例如為活動的交互區(qū)分配數(shù)據(jù)結(jié)構(gòu)、加載內(nèi)核模塊時分配空間、為I/O驅(qū)動程序分配緩沖區(qū)。4.高端內(nèi)存映射kmap(structpage*

page):用于獲得高端內(nèi)存永久內(nèi)核映射的線性地址。kmap_atomic(structpage*

page,enumkm_typetype):用于獲得高端內(nèi)存臨時內(nèi)核映射的線性地址。5.固定線性地址映射set_fixmap(idx,phys):把一個物理地址映射到一個固定的線性地址上。set_fixmap_nocache(idx,phys):把一個物理地址映射到一個固定的線性地址上,禁用該頁高速緩存。1.4虛擬文件系統(tǒng)1.4.1虛擬文件系統(tǒng)作用1.4.2文件系統(tǒng)的注冊1.4.3文件系統(tǒng)的安裝和卸載1.4.1虛擬文件系統(tǒng)作用虛擬文件系統(tǒng)(VirtualFilesystem),實際上是對各種文件系統(tǒng)的一種封裝,為各種文件系統(tǒng)提供了一個通用的接口。通常情況下,為了實現(xiàn)不同操作系統(tǒng)下文件訪問,例如復制/usr/local/arm目錄下的zImage文件到/mnt/hgfs/Windows目錄下。$cp/usr/local/arm/zImage/mnt/hgfs/Windows/1.磁盤文件系統(tǒng)這些文件系統(tǒng)管理本地磁盤中可用的存儲空間或者其他可以起到磁盤作用的設備(如USB閃存或硬盤)。Linux使用的第二擴展文件系統(tǒng)(Ext2),第三擴展文件系統(tǒng)(Ext3)及Reiser文件系統(tǒng)(TeiserFS)UNIX家族文件系統(tǒng)Windows支持的文件系統(tǒng)ISO9660CD-ROM文件系統(tǒng)和通用磁盤的DVD文件系統(tǒng)。其他文件系統(tǒng)2.網(wǎng)絡文件系統(tǒng)(NFS)網(wǎng)絡文件系統(tǒng)最主要的功能就是讓網(wǎng)絡上的主機可以共享目錄及資料。將遠端所共享出來的系統(tǒng),掛載(mount)在本地端的系統(tǒng)上,然后就可以很方便地使用遠端的資料,而操作起來就像在本地操作一樣。使用NFS有相當多的好處,例如文檔可以集中管理、節(jié)省磁盤空間、資源共享等。3.特殊文件系統(tǒng)特殊文件系統(tǒng)可以為系統(tǒng)程序員和管理員提供一種容易的方式,來操作內(nèi)核的數(shù)據(jù)結(jié)構(gòu)并實現(xiàn)操作系統(tǒng)的特殊特征。1.4.2文件系統(tǒng)的注冊每個注冊的文件系統(tǒng)是指可能會被掛載到目錄樹中的各個實際文件系統(tǒng)。注冊過程實際上是將表示各實際文件系統(tǒng)的structfile_system_type數(shù)據(jù)結(jié)構(gòu)的實例化,接著形成一個鏈表,內(nèi)核中用一個名為file_systems的全局變量來指向該鏈表的表頭。structfile_system_type{ constchar*name; intfs_flags; int(*get_sb)(structfile_system_type*,int,constchar*,void*,structvfsmount*); void(*kill_sb)(structsuper_block*); structmodule*owner; structfile_system_type*

next; structlist_headfs_supers; structlock_class_keys_lock_key; structlock_class_keys_umount_key;};1.4.3文件系統(tǒng)的安裝和卸載安裝一個文件系統(tǒng)遵循的步驟:(1)Linux系統(tǒng)內(nèi)核必須首先檢查有關參數(shù)的有效性。(2)查找作為新文件系統(tǒng)安裝點的VFS索引結(jié)點,并且同一目錄下只能安裝一個文件系統(tǒng)。(3)申請一個vfsmount數(shù)據(jù)結(jié)構(gòu),并使它的指針指向所分配的VFS超級塊。(4)當文件系統(tǒng)安裝以后,該文件系統(tǒng)的根索引結(jié)點就一直保存在VFS索引結(jié)點緩存中。1.5設備驅(qū)動程序1.5.1字符設備驅(qū)動程序1.5.2塊設備驅(qū)動程序1.5.3網(wǎng)絡設備驅(qū)動程序1.5.4內(nèi)存與I/O操作1.5.1字符設備驅(qū)動程序字符設備是一種能像字節(jié)流一樣進行串行訪

溫馨提示

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

評論

0/150

提交評論