嵌入式操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第1頁
嵌入式操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第2頁
嵌入式操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第3頁
嵌入式操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第4頁
嵌入式操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1、下面先介紹實(shí)驗(yàn)的準(zhǔn)備工作:1)準(zhǔn)備好EduKit-IV實(shí)驗(yàn)平臺一套,Mini2410-IV核心子板一套,5V/2A 電源適配器一個(gè),交叉串口線一個(gè)(在PC機(jī)上),交叉網(wǎng)線一個(gè)。2)在測試臺擺放好EduKit-IV 實(shí)驗(yàn)平臺,小心打開EduKit-IV實(shí)驗(yàn)平臺上蓋,注意防止箱體向后傾倒(最好箱體上蓋后面靠著其他物品)。3)檢查EduKit-IV實(shí)驗(yàn)平臺出廠跳線,注意Mini2410-IV核心子板上的跳線為閉合狀態(tài),電源撥動開關(guān)撥向向下端的斷開狀態(tài)。4)連接5V/2A 電源適配器到EduKit-IV實(shí)驗(yàn)平臺的電源接口(電源插座供電為220V市電)。5)連接交叉串口線于PC機(jī)的串口端和EduKi

2、t-IV實(shí)驗(yàn)平臺的COM2端。6)連接交叉網(wǎng)線線于PC機(jī)端網(wǎng)卡和EduKit-IV實(shí)驗(yàn)平臺主板網(wǎng)卡接口。7)將EduKit-IV實(shí)驗(yàn)平臺的電源的撥動開關(guān)撥向向上端的加電狀態(tài),給實(shí)驗(yàn)平臺上電??梢钥吹絇OWER區(qū)的三個(gè)紅色電源指示燈會亮:1V8_LED、3V3_LED、5V0_LED。如果有任意電源指示燈不亮,請立刻關(guān)閉電源,檢查電路故障。2、每次實(shí)驗(yàn)開始需要做的工作(第七章及其后)1)(當(dāng)需要網(wǎng)絡(luò)傳輸時(shí),此步只需要在每次上機(jī)時(shí)運(yùn)行一次即可,以后就不再需要,之間進(jìn)行第二步)在ubuntu中的終端中輸入minicom回車,然后給實(shí)驗(yàn)平臺上電。實(shí)驗(yàn)平臺啟動完成后此終端即通過minicom可以對實(shí)驗(yàn)平

3、臺進(jìn)行操作。此時(shí)在此終端中通過輸入ifconfig命令來查看實(shí)驗(yàn)平臺的網(wǎng)絡(luò)配置情況。此時(shí)會顯示eth0和eth1兩個(gè)網(wǎng)絡(luò)相關(guān)信息,如果不知道當(dāng)前網(wǎng)口對應(yīng)的是eth0還是eth1,最簡單的辦法就是輕輕拔掉實(shí)驗(yàn)平臺上的網(wǎng)線,終端中會顯示eth* link down字樣,*可能是0或1。2)進(jìn)行IP地址等的設(shè)置,設(shè)置成與eth*的IP在同一網(wǎng)段。此時(shí)運(yùn)行ubuntu的另一個(gè)終端,在此終端中用下列兩條命令實(shí)現(xiàn)n ifconfig eth* 90 netmask 并在終端中輸入ifconfig命令查看當(dāng)前網(wǎng)絡(luò)設(shè)置。3)虛擬機(jī)(VM)-設(shè)置(Settin

4、g)-選擇NetWork Adapter-網(wǎng)絡(luò)連接-橋接。圖1 虛擬機(jī)橋連接的設(shè)置3、linux系統(tǒng)中的export命令的作用exports是設(shè)置NFS共享文件的Linux export命令功能說明:設(shè)置或顯示環(huán)境變量。語法:export -fnp變量名稱=變量設(shè)置值補(bǔ)充說明:在shell中執(zhí)行程序時(shí),shell會提供一組環(huán)境變量。export可新增,修改或刪除環(huán)境變量,供后續(xù)執(zhí)行的程序使用。export的效力僅局限于此登錄操作l -f 代表變量名稱中為函數(shù)名稱。l -n 刪除指定的變量。變量實(shí)際上并未刪除,只是不會輸出到后續(xù)指令的執(zhí)行環(huán)境中。l -p&

5、#160;列出所有的shell賦予程序的環(huán)境變量。一個(gè)變量創(chuàng)建時(shí),它不會自動地為在它之后創(chuàng)建的shell進(jìn)程所知。而命令export可以向后面的shell傳遞變量的值。當(dāng)一個(gè)shell腳本調(diào)用并執(zhí)行時(shí),它不會自動得到原為腳本(調(diào)用者)里定義的變量的訪問權(quán),除非這些變量已經(jīng)被顯式地設(shè)置為可用。export命令可以用于傳遞一個(gè)或多個(gè)變量的值到任何后繼腳本。登錄到系統(tǒng)后,系統(tǒng)將啟動一個(gè)用戶shell。在這個(gè)shell中,可以使用shell命令或聲明變量,也可以創(chuàng)建并運(yùn)行shell腳本程序。運(yùn)行shell腳本程序時(shí),系統(tǒng)將創(chuàng)建一個(gè)子shell。此時(shí),系統(tǒng)中將有兩個(gè)shell,一個(gè)是登錄時(shí)系統(tǒng)啟動的sh

6、ell,另一個(gè)是系統(tǒng)為運(yùn)行腳本程序創(chuàng)建的shell。當(dāng)一個(gè)腳本程序運(yùn)行完畢,它的腳本shell將終止,可以返回到執(zhí)行該腳本之前的shell。從這種意義上來說,用戶可以有許多shell,每個(gè)shell都是由某個(gè)shell(稱為父shell)派生的。在子shell中定義的變量只在該子shell內(nèi)有效。如果在一個(gè)shell腳本程序中定義了一個(gè)變量,當(dāng)該腳本程序運(yùn)行時(shí),這個(gè)定義的變量只是該腳本程序內(nèi)的一個(gè)局部變量,其他的shell不能引用它,要使某個(gè)變量的值可以在其他shell中被改變,可以使用export命令對已定義的變量進(jìn)行輸出。export命令將使系統(tǒng)在創(chuàng)建每一個(gè)新的shell時(shí)定義這個(gè)變量的一

7、個(gè)拷貝。這個(gè)過程稱之為變量輸出。#echo $PKG_PATH 在任何時(shí)候建立的變量都只是當(dāng)前shell的局部變量,所以不能被shell運(yùn)行的其他命令或shell程序所利用。 export ,是把你設(shè)置的環(huán)境變量傳給當(dāng)前SHELL的子SHELL,使其在子SHELL中有效。4、linux中source、bash命令區(qū)別1)source命令用法:source FileName作用:在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令。該filename文件可以無"執(zhí)行權(quán)限"    注:該命令通常用命令“.”來替代。&

8、#160;   如:source .bash_profile         . .bash_profile兩者等效。    source(或點(diǎn))命令通常用于重新執(zhí)行剛修改的初始化文檔。    source命令(從C Shell而來)是bash shell的內(nèi)置命令。    點(diǎn)命令,就是個(gè)點(diǎn)符號,(從Bourne Shell而來)。    source的程序主體是bash,腳本中的$0變量的值是bash,而且由于作用于當(dāng)前bash環(huán)境,腳本中set的變量將

9、直接起效2) sh, bash的命令用法:     sh/bash FileName     作用:打開一個(gè)子shell來讀取并執(zhí)行FileName中命令。該filename文件可以無"執(zhí)行權(quán)限"     注:運(yùn)行一個(gè)shell腳本時(shí)會啟動另一個(gè)命令解釋器.     每個(gè)shell腳本有效地運(yùn)行在父shell(parent shell)的一個(gè)子進(jìn)程里。這個(gè)父shell是指在一個(gè)控制終端或在一個(gè)xterm窗口中給你命令指示符的進(jìn)程。shell腳本也可以啟動他

10、自已的子進(jìn)程。這些子shell(即子進(jìn)程)使腳本并行地,有效率地地同時(shí)運(yùn)行腳本內(nèi)的多個(gè)子任務(wù)。    在ubuntu中sh只是bash的一個(gè)鏈接。    由于是在子shell中執(zhí)行,腳本設(shè)置的變量不會影響當(dāng)前shell。3) ./的命令用法:     ./FileName     作用:打開一個(gè)子shell來讀取并執(zhí)行FileName中命令。該filename文件需要"執(zhí)行權(quán)限"     注:運(yùn)行一個(gè)shell腳本時(shí)會啟動另一個(gè)命令解釋器.

11、60;    每個(gè)shell腳本有效地運(yùn)行在父shell(parent shell)的一個(gè)子進(jìn)程里。這個(gè)父shell是指在一個(gè)控制終端或在一個(gè)xterm窗口中給你命令指示符的進(jìn)程。shell腳本也可以啟動他自已的子進(jìn)程。這些子shell(即子進(jìn)程)使腳本并行地,有效率地地同時(shí)運(yùn)行腳本內(nèi)的多個(gè)子任務(wù)。    由于是在子shell中執(zhí)行,腳本設(shè)置的變量不會影響當(dāng)前shell。5、makefile文件中的一些說明#CFLAGS: C編譯器的選項(xiàng),無默認(rèn)值#GCC提供的代碼優(yōu)化功能非常強(qiáng)大,它通過編譯選項(xiàng)#-On來控制優(yōu)化代碼的生成,其中n是一個(gè)代表優(yōu)化級別的整

12、數(shù)。一般取值范圍是從0變化到2或3,其編譯速度較慢,占用的內(nèi)存較多。#-Wall: 允許發(fā)出gcc提供的所有有用的報(bào)警信息#$: 目標(biāo)文件的完整名稱6、實(shí)驗(yàn)源碼的默認(rèn)路徑WORKDIR="/usr/local/src/EduKit-IV" / EduKit-IV平臺的工作路徑EXPDIR="/home/example" / 實(shí)驗(yàn)生成映像存放路徑TFTPDIR="$EXPDIR/tftp" / tftp服務(wù)共享目錄NFSDIR="$EXPDIR/nfs" / nfs服務(wù)共享目錄KERNELDIR="$WOR

13、KDIR/Mini2410/bsp/linux-2.6.14" / 實(shí)驗(yàn)內(nèi)核包路徑VIVIDIR="$WORKDIR/Mini2410/bsp/vivi-0.1.4" / vivi實(shí)驗(yàn)源碼路徑ROOTBASEDIR="$WORKDIR/Mini2410/bsp/rootfs-eduk4-base" / 基礎(chǔ)根文件系統(tǒng)路徑ROOTTSPDIR="$WORKDIR/Mini2410/bsp/rootfs-eduk4-tsp" / 帶TSP的QT文件系統(tǒng)路徑ROOTMOUSEDIR="$WORKDIR/Mini2410/

14、bsp/rootfs-eduk4-mouse" /帶mouse的QT文件系統(tǒng)路徑SIMPLEDIR="$WORKDIR/Mini2410/simple" / 實(shí)驗(yàn)例程路徑實(shí)驗(yàn)指導(dǎo)書中的原代碼在:ubuntu8鏡像中的:/usr/local/src/EduKit-IV/Mini2410/simple-第六章基于 Mini2410 的Linux 內(nèi)核開發(fā)本章節(jié)主要介紹 Linux 內(nèi)核開發(fā)的基本過程,包括vivi 的編譯和固化,kernel 的編譯和固化,如何編譯busybox,制作根文件目錄以及搭建nfs 文件系統(tǒng),通過本章節(jié)的學(xué)習(xí),可以了解Linux 下內(nèi)核開發(fā)的

15、方法。6. 1 vivi 的編譯與運(yùn)行實(shí)驗(yàn)6. 1. 1 實(shí)驗(yàn)?zāi)康?#1048766; 熟悉 vivi 相關(guān)知識及應(yīng)用;􀂾 學(xué)會使用交叉編譯器編譯 vivi;􀂾 掌握 vivi 命令將文件固化到目標(biāo)板上。6. 1. 2 實(shí)驗(yàn)設(shè)備􀂾 硬件:EduKit-IV 嵌入式教學(xué)實(shí)驗(yàn)平臺、Mini2410 核心子板、PC 機(jī);􀂾 軟件:Windows 2000/NT/XP、Ubuntu 8.04、其他嵌入式軟件包。6. 1. 3 實(shí)驗(yàn)內(nèi)容􀂾 在 Ubuntu 系統(tǒng)下,使用交叉編譯器編譯vivi;􀂾

16、利用 vivi 命令固化Linux 文件到目標(biāo)板上。6. 1. 4 實(shí)驗(yàn)原理bootloader( 引導(dǎo)加載程序 ) 是系統(tǒng)加電后運(yùn)行的第一段代碼,一般運(yùn)行的時(shí)間非常短,但是對于嵌入式系統(tǒng)來說,這段代碼非常重要。在我們的臺式電腦當(dāng)中,引導(dǎo)加載程序由 BIOS (固件程序)和位于硬盤MBR 中的操作系統(tǒng)引導(dǎo)加載程序(比如NTLOADER,GRUB 和LILO)一起組成。在嵌入式系統(tǒng)當(dāng)中沒有像BIOS 這樣的固件程序,不過也有一些嵌入式CPU 會在芯片內(nèi)部嵌入一小段程序,一般用來將bootloader 裝進(jìn)RAM 中,有點(diǎn)類似BIOS,但是功能比BIOS 弱很多。在一般的典型系統(tǒng)中,整個(gè)系統(tǒng)的加載

17、啟動任務(wù)全由bootloader 來完成。在ARM 中,系統(tǒng)上電或復(fù)位時(shí)通常從地址0x00000000 處開始執(zhí)行,而在這個(gè)位置,通常安排的就是系統(tǒng)的 BOOTLOADER。通過這小段程序可以初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境設(shè)置到一個(gè)合適的狀態(tài),從而最終為調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。vivi 是由mizi 公司為ARM 處理器系列設(shè)計(jì)的一個(gè)bootloader,因?yàn)関ivi 目前只支持使用串口和主機(jī)通信,所以您必須使用一條串口電纜來連接目標(biāo)板和主機(jī)。主要功能為:復(fù)制并啟動內(nèi)核,初始化硬件,下載目標(biāo)板到flash 等。vivi 有兩種工作模式:啟動加載模式和下載模

18、式。啟動加載模式可以在一段時(shí)間后(這個(gè)時(shí)間可更改)自行啟動linux 內(nèi)核,這時(shí) vivi 的默認(rèn)模式。在下載模式下,vivi 為用戶提供一個(gè)命令行接口,通過接口可以使用vivi 提供的一些命令,見下表:表 6-1-1 vivi 使用命令表命令 功能Load 把二進(jìn)制文件載入 Flash 或 RAMPart 操作 MTD 分區(qū)信息。顯示、增加、刪除、復(fù)位、保存 MTD 分區(qū)Param 設(shè)置參數(shù)Boot 啟動系統(tǒng)Flash 管理 Flash ,如刪除 Flash 的數(shù)據(jù)6. 1. 5 實(shí)驗(yàn)步驟1編譯vivi1)在Ubuntu 中單擊菜單應(yīng)用程序->附件->終端打開終端,在終端中輸入命

19、令設(shè)置環(huán)境變量:$ source /usr/local/src/EduKit-IV/Mini2410/set_env_linux.sh$ source /usr/local/arm/2.95.3/path.sh2)進(jìn)入vivi 實(shí)驗(yàn)工作目錄:$ cd $VIVIDIR3)清除早前可能存在的配置信息:$ make distclean4)執(zhí)行配置命令:$ make menuconfig圖 6-1-1 vivi 配置界面選擇 Load an Alternate Configuration File 選項(xiàng),回車。在彈出的對話框中輸入配置文件,這里我們提供了vivi 的配置文件:config-eduk4

20、。圖 6-1-2 選擇配置文件選擇< Ok >,回車退出。接下來在選擇< Exit >退出配置,然后再在如圖6-1-3 中選擇< Yes>,保存并退出。圖 6-1-3 vivi 配置退出保存界面5)執(zhí)行make 命令生成可執(zhí)行文件,文件存放在當(dāng)前目錄下:$ make6)拷貝文件:$ make install執(zhí)行完命令后,將自動拷貝vivi 到/home/example/目錄下。2固化vivi用戶可以根據(jù)前面章節(jié)內(nèi)容(章節(jié)4.6.1)更新剛編譯的vivi 到Mini2410-IV 的Nand Flash 中,或者在Ubuntu 下采用minicom 終端更新,

21、下面的步驟將具體介紹:1)正確連接交叉串口于實(shí)驗(yàn)平臺的COM2 和PC 端的串口。2)運(yùn)行ubuntu 終端,在終端中輸入命令打開minicom(必須先按照第三章3.1.3 正確設(shè)置好minicom):$ sudo minicom圖 6-1-4 啟動minicom 終端3)給實(shí)驗(yàn)平臺上電,啟動內(nèi)置viv 并按空格鍵進(jìn)入到vivi 的命令行界面:圖 6-1-5 進(jìn)入vivi 命令行4)輸入命令使用xmodem 協(xié)議來傳送新編譯好的vivi(/home/example/vivi):vivi> load flash vivi x圖 6-1-6 進(jìn)入vivi 命令行輸入完命令后,回車,終端提示等

22、待 xmodem 協(xié)議傳送文件,此時(shí)按下“Ctrl + a”鍵,然后再輸入“z”鍵進(jìn)入到minicom 的功能菜單:圖 6-1-7 minicom 功能菜單從鍵盤輸入“s”,選擇發(fā)送文件選項(xiàng),出現(xiàn)協(xié)議選擇菜單:圖 6-1-8 minicom 傳送協(xié)議選擇通過鍵盤的上下方向鍵選中 xmodem 協(xié)議,回車進(jìn)入所需傳送文件的默認(rèn)路徑界面:圖 6-1-9 minicom 傳送默認(rèn)文件夾此時(shí)通過鍵盤的左右方向鍵,選中“ 轉(zhuǎn)到 ”選項(xiàng),回車,在彈出的界面輸入新的vivi 映像所在目錄路徑/home/example:圖 6-1-10 輸入目標(biāo)傳送文件所在目錄輸入完成后回車,將進(jìn)入到新 vivi 所在目錄:

23、圖 6-1-11 進(jìn)入到目標(biāo)傳送文件所在目錄通過鍵盤方向鍵選擇“ OK ”項(xiàng),彈出目標(biāo)傳送文件界面,輸入目標(biāo)文件名vivi:圖 6-1-12 進(jìn)入到目標(biāo)傳送文件名輸入正確的目標(biāo)傳送文件名后,回車,將開始傳送新的 vivi 映像,并顯示傳送進(jìn)度:圖 6-1-13 傳送中傳送完畢將提示傳送成功,按任意鍵退出:圖 6-1-13 傳送完成在 minicom 終端將打印出新vivi 的固化信息,并提示成功:圖 6-1-14 完成vivi 的傳送注意:等待傳送的時(shí)間不宜太久,否則就超時(shí),如果出現(xiàn)選中了所需傳輸?shù)奈募莻魉瓦M(jìn)度無反應(yīng)的,即時(shí)超時(shí),可按“Ctrl + c”退出,重新傳送。5)可以重啟實(shí)驗(yàn)系

24、統(tǒng)驗(yàn)證新固化進(jìn)去的vivi,minicom 終端打印如下:VIVI version 0.1.4 (embestembest-laptop) (gcc version 2.95.3 20010315 (release) #0.1.4 2008騫?11 鏈?25 鏃?鏄熸湡浜?16:38:19 CSTMMU table base address = 0x33DFC000Succeed memory mapping.NAND device: Manufacture ID: 0xec, Chip ID: 0x76 (Samsung K9D1208V0M)Found saved vivi paramet

25、ers.Press Return to start the LINUX now, any other key for vivitype "help" for help.6. 2 內(nèi)核編譯與運(yùn)行實(shí)驗(yàn)6. 2. 1 實(shí)驗(yàn)?zāi)康?#1048766; 學(xué)習(xí)和掌握 Linux 編譯的基本步驟;􀂾 通過實(shí)驗(yàn)掌握 Linux 配置、編譯過程。6. 2. 2 實(shí)驗(yàn)設(shè)備􀂾 硬件:EduKit-IV 嵌入式教學(xué)實(shí)驗(yàn)平臺、Mini2410 核心子板、PC 機(jī);􀂾 軟件:Windows 2000/NT/XP、Ubuntu 8.04、其他嵌入式軟件

26、包。6. 2. 3 實(shí)驗(yàn)內(nèi)容􀂾 對 Linux 的內(nèi)核及用戶程序進(jìn)行配置;􀂾 編譯生成內(nèi)核映象文件;􀂾 把編譯的映象文件燒寫到 FALSH 中,查看運(yùn)行結(jié)果。6. 2. 4 實(shí)驗(yàn)原理內(nèi)核是Linux 操作系統(tǒng)的核心,它管理所有的系統(tǒng)線程、進(jìn)程、資源和資源分配。與其它操作系統(tǒng)不同的是,Linux 操作系統(tǒng)允許用戶對內(nèi)核進(jìn)行重新設(shè)置。用戶可以對內(nèi)核進(jìn)行“瘦身”,增加或消除對某些特定設(shè)備或子系統(tǒng)的支持。在開發(fā)嵌入式系統(tǒng)時(shí),開發(fā)人員經(jīng)常會減少系統(tǒng)對一些無用設(shè)備的支持,將節(jié)省下來的內(nèi)存分配給各種應(yīng)用軟件。Linux 內(nèi)核對各種硬件和端口的支持要靠各種

27、硬件驅(qū)動程序來實(shí)現(xiàn)。這些驅(qū)動程序可以被直接寫入內(nèi)核,也可以針對某些特定硬件在需要時(shí)自動加載。通常情況下,可以被自動加載進(jìn)內(nèi)核的內(nèi)核編碼稱為自動加載內(nèi)核模塊。Linux 內(nèi)核的設(shè)置是通過內(nèi)核設(shè)置編輯器完成的。內(nèi)核設(shè)置編輯器可對每個(gè)內(nèi)核設(shè)置變量進(jìn)行描述,幫助用戶決定哪些變量需要被清除,哪些需要寫入內(nèi)核,或者編成一個(gè)可加載內(nèi)核模塊在需要時(shí)進(jìn)行加載。內(nèi)核是為眾多應(yīng)用程序提供對計(jì)算機(jī)硬件的安全訪問的一部分軟件,這種訪問是有限的,并且內(nèi)核決定一個(gè)程序在什么時(shí)候?qū)δ巢糠钟布僮鞫嚅L時(shí)間。直接對硬件操作是非常復(fù)雜的,所以內(nèi)核通常提供一種硬件抽象的方法來完成這些操作。硬件抽象隱藏了復(fù)雜性,為應(yīng)用軟件和硬件提供了

28、一套簡潔,統(tǒng)一的接口,使程序設(shè)計(jì)更為簡單。用戶可以根據(jù)自己的需要編譯內(nèi)核。6. 2. 5 實(shí)驗(yàn)步驟1編譯內(nèi)核1)單擊菜單應(yīng)用程序->附件->終端打開終端,設(shè)置環(huán)境變量:$ source /usr/local/src/EduKit-IV/Mini2410/set_env_linux.sh$ source /usr/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/path.sh2)執(zhí)行命令切換到linux 內(nèi)核目錄下:$cd $KERNELDIR3)清除早前可能存在的配置信息:$ make distclean4)執(zhí)行配置命令:$ make menuc

29、onfig圖 6-2-1 kernel 配置界面選擇 Load an Alternate Configuration File 選項(xiàng),添加配置文件,回車。圖 6-2-2 選擇Load an Alternate Configuration File將彈出的窗體中的.config 替換成./config-eduk4。圖 6-2-3 選擇kernel 配置文件選擇< ok >,回車退出。在彈出的主配置界面中,選擇< Exit >,回車。圖 6-2-4 kernel 配置退出保存界面選擇< Yes >,回車。5)編譯內(nèi)核:$ make zImage編譯完成后將在ar

30、ch/arm/boot 目錄下生成zImage 文件,并自動拷貝到/home/example 目錄下。6)生成驅(qū)動模塊:$ make modules2固化內(nèi)核映像用戶可以根據(jù)前面章節(jié)內(nèi)容(章節(jié) 4.6.1)更新剛編譯生成的zImage 到Mini2410-IV 的Nand Flash 中,或者在Ubuntu 下采用minicom 終端更新。使用 minicom 固化內(nèi)核映像的方法跟前節(jié)固化vivi 映像的步驟相似,啟動vivi 后,輸入命令使用xmodem 協(xié)議來傳送新編譯好的內(nèi)核映像zImage(/home/example/zImage):vivi> load flash kernel

31、 x后面的步驟參考前節(jié)vivi 的傳送,僅需要把需要傳送的文件名替換為zImage 即可,傳送完畢minicom 串口終端打印信息如下:圖 6-2-5 內(nèi)核映像傳送完畢重啟實(shí)驗(yàn)系統(tǒng)將可以看到新的內(nèi)核引導(dǎo)信息。第七章基于Mini2410 的應(yīng)用程序開發(fā)本章節(jié)主要介紹嵌入式Linux 應(yīng)用程序的編寫,內(nèi)容涵蓋HelloWorld 入門操作,文件操作,進(jìn)程和線程控制,計(jì)時(shí)器實(shí)驗(yàn),tcp、udp 和webserver 實(shí)驗(yàn)等,通過本章節(jié)的學(xué)習(xí),可以了解Linux下基礎(chǔ)應(yīng)用程序的開發(fā)方法。7. 1 HelloWorld 運(yùn)行實(shí)驗(yàn)7. 1. 1 實(shí)驗(yàn)?zāi)康?#1048766; 掌握嵌入式應(yīng)用程序的編寫、編譯

32、和運(yùn)行。7. 1. 2 實(shí)驗(yàn)設(shè)備􀂾 硬件:EduKit-IV 嵌入式教學(xué)實(shí)驗(yàn)平臺、Mini2410 核心子板、PC 機(jī);􀂾 軟件:Windows 2000/NT/XP、Ubuntu 8.04、其他嵌入式軟件包。7. 1. 3 實(shí)驗(yàn)內(nèi)容􀂾 編寫、編譯并運(yùn)行HelloWorld 程序。7. 1. 4 實(shí)驗(yàn)步驟􀁺 編譯:1)單擊菜單應(yīng)用程序->附件->終端,打開終端:圖7-1-1 終端運(yùn)行界面2)在終端中輸入以下命令行設(shè)置開發(fā)所需的環(huán)境變量:$ source /usr/local/src/EduKit-IV/Mini

33、2410/set_env_linux.sh$ source /usr/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/path.sh3)進(jìn)入7.1-helloWorld 實(shí)驗(yàn)例程目錄:$ cd $SIMPLEDIR/7.1-helloworld4)編譯并拷貝HelloWorld 程序:$ make$ make install$ make clean并自動拷貝hello 到/home/example/tftp/。􀁺 運(yùn)行:1)準(zhǔn)備好EduKit-IV + Mini2410-IV 平臺,注意Mini2410-IV 板上的跳線為閉合狀態(tài),且確保M

34、ini2410-IV 板載Linux 映像為實(shí)驗(yàn)映像(請參照下冊開篇:實(shí)驗(yàn)環(huán)境構(gòu)建),連接好交叉串口線于板載COM2 和PC 端串口,連接好交叉網(wǎng)線與板載主板網(wǎng)卡接口和PC 端網(wǎng)口。2)在終端執(zhí)行以下命令打開minicom 串口終端:$ sudo minicom圖7-1-2 啟動minicom 終端3)給實(shí)驗(yàn)平臺加電,進(jìn)入Linux 系統(tǒng),可以看到minicom 終端的啟動打印信息。4)啟動完成后,在minicom 下執(zhí)行以下命令將hello 下載到tmp 目錄下:# cd /tmp# tftp -g 90 -r./hello -l./hello附:請用交叉網(wǎng)線連接主

35、機(jī)和實(shí)驗(yàn)平臺,注意實(shí)驗(yàn)平臺上的網(wǎng)卡是打開的,并核對主機(jī)網(wǎng)卡的ip 地址是否為90,設(shè)置方法可參照上冊第六章節(jié)6.5。5)給hello 添加可執(zhí)行權(quán)限:# chmod 777 hello6)運(yùn)行hello:# ./helloHelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!7. 1. 5 參考程序#include <stdio.h>/* Function name: main()* Descriptions : printf "HelloWorld" on srceen.* In

36、put : NONE* Output : NONE* Created by : Chenxibing* Created Date : 2005-12-29*-* Modified by :* Modified Date:*-*/int main(int argc, char *argv)int i;for (i=0; i<5; i+)printf("HelloWorld!n");return 0;7. 1. 6 練習(xí)題利用所學(xué)知識自己編寫一個(gè)Linux 下簡單的應(yīng)用程序。7. 2 文件操作實(shí)驗(yàn)7. 2. 1 實(shí)驗(yàn)?zāi)康?#1048766; 學(xué)習(xí)和掌握文件操作具體過程。7

37、. 2. 2 實(shí)驗(yàn)設(shè)備􀂾 硬件:EduKit-IV 嵌入式教學(xué)實(shí)驗(yàn)平臺、Mini2410 核心子板、PC 機(jī);􀂾 軟件:Windows 2000/NT/XP、Ubuntu 8.04、其他嵌入式軟件包。7. 2. 3 實(shí)驗(yàn)內(nèi)容􀂾 利用系統(tǒng)提供的文件操作函數(shù),打開、讀寫、關(guān)閉文件,并創(chuàng)建一個(gè)新的文件夾。7. 2. 4 實(shí)驗(yàn)原理標(biāo)準(zhǔn)I/O 庫以及其他的頭文件,提供了一個(gè)到底層I/O 系統(tǒng)調(diào)用的一個(gè)萬能接口,這個(gè)庫并不是ANSI 標(biāo)準(zhǔn)C 的一部分,但是這個(gè)庫卻提供了許多復(fù)雜的函數(shù)用來處理格式化輸出以及描述輸入,同時(shí)也會小心的處理設(shè)備所要求的緩沖區(qū)。

38、在許多方式上,可以用使用低層文件描述符的方式來使用這個(gè)庫。當(dāng)需要打開文件建立訪問路徑時(shí),會返回一個(gè)值,并會作為一個(gè)調(diào)用其他I/O 庫函數(shù)的參數(shù)。這個(gè)與低層文件描述符等同的被稱之類流(stream),并且是作為一個(gè)指向結(jié)構(gòu)的指針FILE*來實(shí)現(xiàn)的。當(dāng)一個(gè)程序啟動時(shí)會自動打開三個(gè)文件流。他們是stdin,stdout,stderr。這些是在stdio.h 中定義,分別代表標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出。相對的,他們分別與低層的文件描述符0,1,2 相對應(yīng)。􀂾 fopenfopen庫函數(shù)是低層的open 系統(tǒng)調(diào)用的模擬。我們主要將它用于文件或是終端輸入與輸出。然而在我們需要顯示的

39、控制設(shè)備的地方,我們最好是使用低層的系統(tǒng)調(diào)用,因?yàn)樗鼈兛梢韵蓭焖斐傻臐撛诘牟涣家蛩?,如輸?輸出緩沖區(qū)。其語法格式如下:#include <stdio.h>FILE *fopen(const char *filename, const char *mode);fopen 打開由filename 參數(shù)所指定的文件,并建立一個(gè)與其相關(guān)的流。mode 參數(shù)指出如何來打開這個(gè)文件,它可以是下列字符串中的一個(gè):“r”或“rb”:以只讀方式打開;“w”或“wb”:以只寫方式打開;“a”或“ab”:以讀方式打開,添加到文件的結(jié)尾處;“r+”或“rb+”或“r+b”:打開更新(讀和寫);“w

40、+”或“wb+”或“w+b”:打開更新,將其長度變?yōu)榱?;“a+”或“ab+”或“a+b”:打開更新,添加到文件結(jié)尾處;b 表明這個(gè)文件是二進(jìn)制文件而不是文本文件。在這里我們要注意,與MS-DOS 不同,Unix 和Linux 并不會在文本文件與二進(jìn)制文件之間進(jìn)行區(qū)別。Unix 與Linux 將所有文件看成是一樣的,尤其是二進(jìn)制文件。另外要注意的一點(diǎn)就是mode參數(shù)必須是一個(gè)字符串,而不是一個(gè)字符。我們要總是使用“r”,而絕不可以是r。如果函數(shù)調(diào)用成功,fopen 會返回一個(gè)非空的文件指針。如果失敗,它會返回NULL,這是在stdio.h中定義的。􀂾 freadfread 庫函

41、數(shù)可以用來從一個(gè)文件流中讀取數(shù)據(jù)。由stream 流中讀取的數(shù)據(jù)將會放在由prt 所指定的數(shù)據(jù)緩沖區(qū)中。fread 和fwrite 都處理數(shù)據(jù)記錄。這些是由塊的尺寸size,讀取的次數(shù)nitems來指定要傳送的記錄塊的。如果成功則返回值為實(shí)際讀入到數(shù)據(jù)緩沖區(qū)中的塊數(shù),而不是字節(jié)數(shù)。在文件的結(jié)尾處,也許會返回少于nitems 的值,包括零。其語法格式如下:#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);與所有要寫入到緩沖區(qū)中的標(biāo)準(zhǔn)I/O 函數(shù)一樣,程序員要負(fù)責(zé)分配數(shù)

42、據(jù)空間以及檢查錯誤。􀂾 fwritefwrite 調(diào)用一個(gè)與fread 相類似的函數(shù)接口,它將會從指定的數(shù)據(jù)區(qū)讀取數(shù)據(jù)記錄并寫入到輸出流中。它的返回值為成功寫入的記錄數(shù)。其語法格式如下:#include <stdio.h>size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);在這里我們要注意就是我們并不推薦在使用結(jié)構(gòu)數(shù)據(jù)時(shí)使用fread 與fwrite。一部分的原因就是因?yàn)橛胒write 寫入的文件潛在的存在著在不同的機(jī)器間不兼容的問題。􀂾 fclose

43、fclose 庫函數(shù)關(guān)閉指定的文件流,并將所有未寫入的數(shù)據(jù)寫入文件中。使用fclose 是相當(dāng)重要的,因?yàn)閟tdio 庫會緩存數(shù)據(jù)。如果程序需要確定已經(jīng)完整的寫入了所有的數(shù)據(jù),這時(shí)就應(yīng)調(diào)用fclose。然而,當(dāng)一個(gè)程序正常結(jié)束時(shí),fclose 就自動調(diào)用,從而關(guān)閉所有仍然打開的文件流。當(dāng)然,在這樣的情況下,我們就沒有機(jī)會來檢查由fclose 報(bào)告的錯誤。與文件描述符所有的限制一樣,可用的流數(shù)目也是有限制的。實(shí)際的限制是FOPEN_MAX,這是在stdio.h 中定義,而且至少為8 個(gè)。其語法格式如下:#include <stdio.h>int fclose(FILE *stream

44、);􀂾 mkdir可以使用mkdir 和rmdir 來創(chuàng)建和移除目錄。其語法如下:#include <sys/stat.h>int mkdir(const char *path, mode_t mode);mkdir 系統(tǒng)調(diào)用可以用來創(chuàng)建目錄,而這是與mkdir 程序相等同的。mkdir 以path 為名字創(chuàng)建一個(gè)新的目錄。目錄的權(quán)限是由參數(shù)mode 來指定的,而這也與open 系統(tǒng)調(diào)用中的O_CREAT 的選項(xiàng)是一樣的,而且這也是要受到umask 的影響。7. 2. 5 實(shí)驗(yàn)步驟􀁺 編譯:1)單擊菜單應(yīng)用程序->附件->終端,打開終

45、端。2)在終端中輸入以下命令行設(shè)置開發(fā)所需的環(huán)境變量:$ source /usr/local/src/EduKit-IV/Mini2410/set_env_linux.sh$ source /usr/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/path.sh3)進(jìn)入file 工作目錄:$ cd $SIMPLEDIR/7.2-file4)編譯并拷貝File 程序:$ make$ make install$ make clean并自動拷貝file 到/home/example/tftp/。􀁺 運(yùn)行:1)準(zhǔn)備好EduKit-IV + Mini

46、2410-IV 平臺,注意Mini2410-IV 板上的跳線為閉合狀態(tài),且確保Mini2410-IV 板載Linux 映像為實(shí)驗(yàn)映像(請參照下冊開篇:實(shí)驗(yàn)環(huán)境構(gòu)建),連接好交叉串口線于板載COM2 和PC 端串口,連接好交叉網(wǎng)線與板載主板網(wǎng)卡接口和PC 端網(wǎng)口。2)在終端執(zhí)行以下命令打開minicom 串口終端:$ sudo minicom3)給實(shí)驗(yàn)平臺加電,進(jìn)入Linux 系統(tǒng),可以看到minicom 終端的啟動打印信息。4)啟動完成后,在minicom 下執(zhí)行以下命令將file 下載到tmp 目錄下:# cd /tmp# tftp -g 90 -r./file -

47、l./file附:請用交叉網(wǎng)線連接主機(jī)和實(shí)驗(yàn)平臺,注意實(shí)驗(yàn)平臺上的網(wǎng)卡是打開的,并核對主機(jī)網(wǎng)卡的ip 地址是否為90,設(shè)置方法可參照上冊第六章節(jié)6.5。5)給file 添加可執(zhí)行權(quán)限:# chmod 777 file6)運(yùn)行file,并查看文件內(nèi)容:# ./file17 byte data has written to linux.txtFolder linux created success!# lsfile linux linux.txt# cat linux.txtHello ARM Linux!7. 2. 6 參考程序#include <stdio.h&

48、gt;#include <fcntl.h>int main(void)FILE *fp;int num;int folder;char a = "Hello ARM Linux!"fp = fopen("/tmp/Linux.txt","w+"); / 打開文件/tmp/Linux.txtif(fp = NULL)printf("nFail to open Linux.txt!n");exit(-1);num = fwrite(a, sizeof(a), 1, fp); / 將字符串"Hell

49、o ARM Linux!"寫入到文件中printf("%d byte data has written to Linux.txtn", num*sizeof(a);folder = mkdir("/tmp/Linux", 1); / 創(chuàng)建目錄"/tmp/Linux"if(folder = -1)printf("n Fail to create folder Linux!nIt has existed or the path is error!n");exit(-1);printf("Folder

50、 Linux created success!n");close(fp); / 關(guān)閉文件return 0;7. 2. 7 練習(xí)題利用所學(xué)的知識自己建立一個(gè)目錄,在該目錄中創(chuàng)建一個(gè)文本文件,并對該文本文件進(jìn)行讀寫操作。7. 3 進(jìn)程控制實(shí)驗(yàn)7. 3. 1 實(shí)驗(yàn)?zāi)康?#1048766; 通過實(shí)驗(yàn)理解Linux 下進(jìn)程的概念;􀂾 通過該實(shí)驗(yàn)掌握進(jìn)程的編程方法。7. 3. 2 實(shí)驗(yàn)設(shè)備􀂾 硬件:EduKit-IV 嵌入式教學(xué)實(shí)驗(yàn)平臺、Mini2410 核心子板、PC 機(jī);􀂾 軟件:Windows 2000/NT/XP、Ubuntu 8.0

51、4、其他嵌入式軟件包。7. 3. 3 實(shí)驗(yàn)內(nèi)容􀂾 編寫一個(gè)程序,父進(jìn)程創(chuàng)建子進(jìn)程,并得到相關(guān)信息并打印之后退出。7. 3. 4 實(shí)驗(yàn)原理1. Linux 進(jìn)程基礎(chǔ)知識進(jìn)程作為構(gòu)成系統(tǒng)的基本細(xì)胞,不僅是系統(tǒng)內(nèi)部獨(dú)立運(yùn)行的實(shí)體,而且是獨(dú)立競爭資源的基本實(shí)體。了解進(jìn)程的本質(zhì),對于理解、描述和設(shè)計(jì)操作系統(tǒng)有著極為重要的意義。了解進(jìn)程的活動、狀態(tài),也有利于編制復(fù)雜程序。首先我們看看進(jìn)程的定義,進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次可以并發(fā)執(zhí)行的運(yùn)行活動,是處于活動狀態(tài)的計(jì)算機(jī)程序。1)進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換現(xiàn)在我們來看看,進(jìn)程在生存周期中的各種狀態(tài)及狀態(tài)的轉(zhuǎn)換。下面是Linux

52、 系統(tǒng)的進(jìn)程狀態(tài)模型的各種狀態(tài):􀂾 用戶狀態(tài):進(jìn)程在用戶狀態(tài)下運(yùn)行的狀態(tài);􀂾 內(nèi)核狀態(tài):進(jìn)程在內(nèi)核狀態(tài)下運(yùn)行的狀態(tài);􀂾 內(nèi)存中就緒:進(jìn)程沒有執(zhí)行,但處于就緒狀態(tài),只要內(nèi)核調(diào)度它,就可以執(zhí)行;􀂾 內(nèi)存中睡眠:進(jìn)程正在睡眠并且進(jìn)程存儲在內(nèi)存中,沒有被交換到SWAP 設(shè)備;􀂾 就緒且換出:進(jìn)程處于就緒狀態(tài),但是必須把它換入內(nèi)存,內(nèi)核才能再次調(diào)度它進(jìn)行運(yùn)行;􀂾 睡眠且換出:進(jìn)程正在睡眠,且被換出內(nèi)存;􀂾 被搶先:進(jìn)程從內(nèi)核狀態(tài)返回用戶狀態(tài)時(shí),內(nèi)核搶先于它,做了上下文切換,調(diào)度了

53、另一個(gè)進(jìn)程。原先這個(gè)進(jìn)程就處于被搶先狀態(tài);􀂾 創(chuàng)建狀態(tài):進(jìn)程剛被創(chuàng)建。該進(jìn)程存在,但既不是就緒狀態(tài),也不是睡眠狀態(tài)。這個(gè)狀態(tài)是除了進(jìn)程0 以外的所有進(jìn)程的最初狀態(tài);􀂾 僵死狀態(tài)(zombie):進(jìn)程調(diào)用exit 結(jié)束,進(jìn)程不再存在,但在進(jìn)程表項(xiàng)中仍有紀(jì)錄,該紀(jì)錄可由父進(jìn)程收集?,F(xiàn)在我們從進(jìn)程的創(chuàng)建到退出來看看進(jìn)程的狀態(tài)轉(zhuǎn)化。需要說明的是,進(jìn)程在它的生命周期里并不一定要經(jīng)歷所有的狀態(tài)。首先父進(jìn)程通過系統(tǒng)調(diào)用fork()來創(chuàng)建子進(jìn)程,調(diào)用fork()時(shí),子進(jìn)程首先處于創(chuàng)建態(tài),fork()調(diào)用為子進(jìn)程配置好內(nèi)核數(shù)據(jù)結(jié)構(gòu)和子進(jìn)程私有數(shù)據(jù)結(jié)構(gòu)后,子進(jìn)程就要進(jìn)入就緒態(tài)3

54、 或5,即在內(nèi)存中就緒,或者因?yàn)閮?nèi)存不夠,而導(dǎo)致在SWAP 設(shè)備中就緒。假設(shè)進(jìn)程在內(nèi)存中就緒,這時(shí)子進(jìn)程就可以被內(nèi)核調(diào)度程序調(diào)度上CPU 運(yùn)行。內(nèi)核調(diào)度該進(jìn)程進(jìn)入內(nèi)核狀態(tài),再由內(nèi)核狀態(tài)返回用戶狀態(tài)執(zhí)行。該進(jìn)程在用戶狀態(tài)運(yùn)行一定時(shí)間后,又會被調(diào)度程序所調(diào)度而進(jìn)入內(nèi)核狀態(tài),由此轉(zhuǎn)入就緒態(tài)。有時(shí)進(jìn)程在用戶狀態(tài)運(yùn)行時(shí),也會因?yàn)樾枰獌?nèi)核服務(wù),使用系統(tǒng)調(diào)用而進(jìn)入內(nèi)核狀態(tài),服務(wù)完畢,會由內(nèi)核狀態(tài)轉(zhuǎn)回用戶狀態(tài)。要注意的是,進(jìn)程在從內(nèi)核狀態(tài)向用戶狀態(tài)返回時(shí)可能被搶占,進(jìn)入狀態(tài)7,這是由于有優(yōu)先級更高的進(jìn)程急需使用CPU,不能等到下一次調(diào)度時(shí)機(jī),從而造成搶占。進(jìn)程還會因?yàn)檎埱蟮馁Y源不能得到滿足,進(jìn)入睡眠狀態(tài),直到

55、它請求的資源被釋放,才會被內(nèi)核喚醒而進(jìn)入就緒態(tài)。如果進(jìn)程在內(nèi)存中睡眠時(shí),內(nèi)存不足,當(dāng)進(jìn)程睡眠時(shí)間達(dá)到一個(gè)閥值,進(jìn)程會被SWAP 出內(nèi)存,使得進(jìn)程在SWAP 設(shè)備上睡眠。這種狀況同樣可能發(fā)生在就緒的進(jìn)程上。進(jìn)程調(diào)用exit 系統(tǒng)調(diào)用,將使得進(jìn)程進(jìn)入內(nèi)核狀態(tài),執(zhí)行exit 調(diào)用,進(jìn)入僵死狀態(tài)而結(jié)束。以上就是進(jìn)程狀態(tài)轉(zhuǎn)換的簡單描述。進(jìn)程的上下文是由用戶級上下文、寄存器上下文以及系統(tǒng)級上下文組成。主要內(nèi)容是該進(jìn)程用戶空間內(nèi)容、寄存器內(nèi)容以及與該進(jìn)程有關(guān)的內(nèi)核數(shù)據(jù)結(jié)構(gòu)。當(dāng)系統(tǒng)收到一個(gè)中斷,執(zhí)行系統(tǒng)調(diào)用或內(nèi)核做上下文切換時(shí),就會保存進(jìn)程的上下文。一個(gè)進(jìn)程是在它的上下文中運(yùn)行的,若要調(diào)度進(jìn)程,就要進(jìn)行上下文

56、切換。內(nèi)核在四種情況下允許發(fā)生上下文切換:􀂾 當(dāng)進(jìn)程自己進(jìn)入睡眠時(shí);􀂾 當(dāng)進(jìn)程執(zhí)行完系統(tǒng)調(diào)用要返回用戶狀態(tài),但發(fā)現(xiàn)該進(jìn)程不是最有資格運(yùn)行的進(jìn)程時(shí);􀂾 當(dāng)內(nèi)核完成中斷處理后要返回用戶狀態(tài),但發(fā)現(xiàn)該進(jìn)程不是最有資格運(yùn)行的進(jìn)程時(shí);􀂾 當(dāng)進(jìn)程退出(執(zhí)行系統(tǒng)調(diào)用exit 后)時(shí)。有時(shí)內(nèi)核要求必須終止當(dāng)前的執(zhí)行,立即從先前保存的上下文處執(zhí)行。這可由setjmp 和longjmp實(shí)現(xiàn),setjmp 將保存的上下文存入進(jìn)程自身的數(shù)據(jù)空間(u 區(qū))中,并繼續(xù)在當(dāng)前的上下文中執(zhí)行,一旦碰到了longjmp,內(nèi)核就從該進(jìn)程的u 區(qū),取出先前保存

57、的上下文,并恢復(fù)該進(jìn)程的上下文為原先保存的。這時(shí)內(nèi)核將使得進(jìn)程從setjmp 處執(zhí)行,并給setjmp 返回1。進(jìn)程因等待資源或其他原因,進(jìn)入睡眠態(tài)是通過內(nèi)核的sleep 算法。該算法與本章后面要講到的sleep 函數(shù)是兩個(gè)概念。算法sleep 記錄進(jìn)程原先的處理機(jī)優(yōu)先級,置進(jìn)程為睡眠態(tài),將進(jìn)程放入睡眠隊(duì)列,記錄睡眠的原因,給該進(jìn)程進(jìn)行上下文切換。內(nèi)核通過算法wakeup 來喚醒進(jìn)程,如某資源被釋放,則喚醒所有因等待該資源而進(jìn)入睡眠的進(jìn)程。如果進(jìn)程睡眠在一個(gè)可以接收軟中斷信號(signal)的級別上,則進(jìn)程的睡眠可由軟中斷信號的到來而被喚醒。2)進(jìn)程控制現(xiàn)在我們開始講述一下進(jìn)程的控制,主要介紹

58、內(nèi)核對fork、exec、wait、exit 的處理過程,為學(xué)習(xí)這些調(diào)用打下概念上的基礎(chǔ),并介紹系統(tǒng)啟動(boot)的過程以及進(jìn)程init 的作用。在Linux 系統(tǒng)中,用戶創(chuàng)建一個(gè)進(jìn)程的唯一方法就是使用系統(tǒng)調(diào)用fork。內(nèi)核為完成系統(tǒng)調(diào)用fork 要進(jìn)行幾步操作。第一步,為新進(jìn)程在進(jìn)程表中分配一個(gè)表項(xiàng)。系統(tǒng)對一個(gè)用戶可以同時(shí)運(yùn)行的進(jìn)程數(shù)是有限制的,對超級用戶沒有該限制,但也不能超過進(jìn)程表的最大表項(xiàng)的數(shù)目。第二步,給子進(jìn)程一個(gè)唯一的進(jìn)程標(biāo)識號(PID)。該進(jìn)程標(biāo)識號其實(shí)就是該表項(xiàng)在進(jìn)程表中的索引號。第三步,復(fù)制一個(gè)父進(jìn)程的進(jìn)程表項(xiàng)的副本給子進(jìn)程。內(nèi)核初始化子進(jìn)程的進(jìn)程表項(xiàng)時(shí),是從父進(jìn)程處拷貝的。所以子進(jìn)程擁有與父進(jìn)程一樣的uid、euid、gid、用于計(jì)算優(yōu)先權(quán)的nice 值、當(dāng)前目錄、當(dāng)前根、用戶文件描述符表等。第四步,把與父進(jìn)程相連的文件表和索引節(jié)點(diǎn)表的引用數(shù)加1。這些文件自動地與該子進(jìn)程相連。第五步,內(nèi)核為子進(jìn)程創(chuàng)建用戶級上下文。內(nèi)核為子進(jìn)程的u 區(qū)及輔助頁表分配內(nèi)存,并復(fù)制父進(jìn)程的區(qū)內(nèi)容。這樣生成的是進(jìn)程的靜態(tài)部分。第六步,生成進(jìn)程的動態(tài)部分,內(nèi)核復(fù)制父進(jìn)

溫馨提示

  • 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

提交評論