2016年嵌入式軟件助理工程師認(rèn)證考試試題題庫(kù)
答:
在Linux中啟動(dòng)一個(gè)進(jìn)程有手工啟動(dòng)和調(diào)度啟動(dòng)兩種方式:
(1)手工啟動(dòng)
用戶在輸入端發(fā)出命令,直接啟動(dòng)一個(gè)進(jìn)程的啟動(dòng)方式?梢苑譃椋
①前臺(tái)啟動(dòng):直接在SHELL中輸入命令進(jìn)行啟動(dòng)。
②后臺(tái)啟動(dòng):?jiǎn)?dòng)一個(gè)目前并不緊急的進(jìn)程,如打印進(jìn)程。
(2)調(diào)度啟動(dòng)
系統(tǒng)管理員根據(jù)系統(tǒng)資源和進(jìn)程占用資源的情況,事先進(jìn)行調(diào)度安排,指定任務(wù)運(yùn)行的時(shí)間和場(chǎng)合,到時(shí)候系統(tǒng)會(huì)自動(dòng)完成該任務(wù)。
27、簡(jiǎn)述Bootloader有何作用?
答案要點(diǎn):(1)首先,bootloader是在特定硬件平臺(tái)運(yùn)行的程序,嚴(yán)重依賴于硬件平臺(tái),需要移植;(2)是系統(tǒng)上電之后,第一個(gè)運(yùn)行的程序,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址 0x0 處開(kāi)始執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的 Boot Loader 程序;(3)bootloader程序的設(shè)計(jì)目標(biāo)是啟動(dòng)嵌入式操作系統(tǒng),嵌入式操作系統(tǒng)的啟動(dòng)需要一定的條件,這些條件由bootloader來(lái)滿足;(4)Bootloader一般具有對(duì)存儲(chǔ)器和網(wǎng)絡(luò)接口操作的功能;如擦除、讀寫Flash,通過(guò)USB、串口下載文件等
28、ARM處理器中,引起異常的原因是什么?
答:(1)、指令執(zhí)行引起的異常
軟件中斷、未定義指令(包括所要求的協(xié)處理器不存在是的協(xié)處理器指令)、預(yù)取址中止(存儲(chǔ)器故障)、數(shù)據(jù)中止。
(2)、外部產(chǎn)生的中斷
復(fù)位、FIQ、IRQ。
29、程序、進(jìn)程、線程有何區(qū)別?
答案要點(diǎn):程序是編譯后形成的可執(zhí)行代碼,是靜止的。進(jìn)程是程序的一次執(zhí)行,是活動(dòng)的。線程是進(jìn)程的可執(zhí)行單元,同一進(jìn)程的不同線程共享進(jìn)程的資源和地址空間。
30、Linux系統(tǒng)中線程的同步方式有互斥量、信號(hào)量和條件變量等。假設(shè)現(xiàn)在需要設(shè)計(jì)一個(gè)多線程的應(yīng)用程序,試分析一下以上幾種同步方式分別可在什么場(chǎng)合下使用(6分)。
參考答案:
Mutex互斥量,用于操作某個(gè)臨界資源時(shí)對(duì)該資源上鎖,以實(shí)現(xiàn)互斥地對(duì)獨(dú)占資源的使用(2分)
Semophore信號(hào)燈,信號(hào)燈內(nèi)有一計(jì)數(shù)器,可以用于對(duì)多個(gè)同類資源的分配。當(dāng)資源用完時(shí),申請(qǐng)資源的線程會(huì)在信號(hào)量上睡眠,有線程釋放資源時(shí),再將該線程喚醒繼續(xù)運(yùn)行。(2分)
Condition條件變量,條件變量用于等待信號(hào)。當(dāng)一個(gè)線程需要等待某個(gè)信號(hào)時(shí),就可到條件變量上等待,當(dāng)信號(hào)具備時(shí),系統(tǒng)會(huì)喚醒該線程繼續(xù)運(yùn)行。(2分)
31、簡(jiǎn)述嵌入式系統(tǒng)的幾個(gè)重要特征?
答案要點(diǎn):系統(tǒng)內(nèi)核小;專用性強(qiáng) ;系統(tǒng)精簡(jiǎn) ;高實(shí)時(shí)性的系統(tǒng)軟件 ;多任務(wù)的操作系統(tǒng) ;需要專用的開(kāi)發(fā)工具和環(huán)境。 答出上述4個(gè)并適當(dāng)闡述的即可給滿分。
32、什么是程序的局部性原理?
答案要點(diǎn):程序的局部性原理是指程序在執(zhí)行過(guò)程中的一個(gè)較短時(shí)期內(nèi),它所執(zhí)行的指令和訪問(wèn)的存儲(chǔ)空間分別局限在一定的區(qū)域內(nèi)。具體表現(xiàn)在時(shí)間局部性和空間局部性。時(shí)間局部性是指一條指令的一次執(zhí)行和下一次執(zhí)行、一個(gè)數(shù)據(jù)的一次訪問(wèn)和下一次訪問(wèn),都集中在一個(gè)較短的時(shí)間內(nèi)?臻g局部性是指程序執(zhí)行了某條指令,則它相鄰的幾條指令也可能馬上執(zhí)行。
33、簡(jiǎn)述Busybox的工作原理。(4分)
參考答案:Busybox是通過(guò)一個(gè)程序去實(shí)現(xiàn)原來(lái)Linux的眾多命令程序。這樣可使原來(lái)3.5MB左右的工具包壓縮大約200KB大小一個(gè)程序,這對(duì)嵌入式系統(tǒng)非常重要(2分)。
為了使用的方便,Busybox通過(guò)創(chuàng)建其原文件的符號(hào)連接來(lái)達(dá)到傳遞具體執(zhí)行命令的目的。例如,創(chuàng)建一個(gè)mv的符號(hào)連接,當(dāng)用戶鍵入mv后,mv實(shí)際上會(huì)以C語(yǔ)言中的argv[0]傳遞給Busybox的主程序。這樣Busybox就可據(jù)此跳轉(zhuǎn)到相應(yīng)的代碼去執(zhí)行。(2分)
34、Linux作為嵌入式操作系統(tǒng)的優(yōu)勢(shì)?
答:
Linux作為嵌入式操作系統(tǒng)的優(yōu)勢(shì)主要有以下幾點(diǎn):
1. 可應(yīng)用于多種硬件平臺(tái)。Linux已經(jīng)被移植到多種硬件平臺(tái),這對(duì)于經(jīng)費(fèi),時(shí)間受限制的研究與開(kāi)發(fā)項(xiàng)目是很有吸引力的。原型可以在標(biāo)準(zhǔn)平臺(tái)上開(kāi)發(fā)后移植到具體的硬件上,加快了軟件與硬件的開(kāi)發(fā)過(guò)程。Linux采用一個(gè)統(tǒng)一的框架對(duì)硬件進(jìn)行管理,從一個(gè)硬件平臺(tái)到另一個(gè)硬件平臺(tái)的改動(dòng)與上層應(yīng)用無(wú)關(guān)。(1分)
2. Linux的高度模塊化使添加部件非常容易。本身內(nèi)置網(wǎng)絡(luò)支持,而目前嵌入式系統(tǒng)對(duì)網(wǎng)絡(luò)支持要求越來(lái)越高。(1分)
3. Linux是一個(gè)和Unix相似、以內(nèi)核為基礎(chǔ)的、具有完全的內(nèi)存訪問(wèn)控制,支持大量硬件(包括X86,Alpha、ARM和Motorola等現(xiàn)有的大 部分芯片)等特性的一種通用操作系統(tǒng)。(1分)
4. Linux可以隨意地配置,不需要任何的許可證或商家的合作關(guān)系。其程序源碼全部公開(kāi),任何人可以修改并在GUN通用公共許可證(GNU General Public License)下發(fā)行。這樣,開(kāi)發(fā)人員可以對(duì)操作系統(tǒng)進(jìn)行定制,適應(yīng)其特殊需要。(1分)
5. Linux帶有Unix用戶熟悉的完善的開(kāi)發(fā)工具,幾乎所有的Unix系統(tǒng)的應(yīng)用軟件都已移植到了Linux上。其強(qiáng)大的語(yǔ)言編譯器GCC,C++等也可以很容易得到,不但成熟完善,而且使用方便。(分)
35、簡(jiǎn)述Linux需要進(jìn)行進(jìn)程調(diào)度的時(shí)機(jī)(6分)
參考答案:(每小點(diǎn)1分)
Linux執(zhí)行進(jìn)程調(diào)度一般是在以下情況發(fā)生的:
(1)正在執(zhí)行的進(jìn)程運(yùn)行完畢;
(2)正在執(zhí)行的進(jìn)程調(diào)用阻塞原語(yǔ)將自己阻塞起來(lái)進(jìn)入等待狀態(tài);
(3)正在執(zhí)行的進(jìn)程調(diào)用了P原語(yǔ)操作,從而因資源不足而被阻塞;或調(diào)用了V原語(yǔ)操作激活了等待資源的進(jìn)程隊(duì)列;
(4)執(zhí)行中的進(jìn)程提出I/O請(qǐng)求后被阻塞;
(5)系統(tǒng)分配的時(shí)間片已經(jīng)用完;
以上都是CPU為不可剝奪方式下的引起進(jìn)程調(diào)度的原因。在CPU方式是可剝奪時(shí),還有下面的原因:
(6)就緒隊(duì)列中的某個(gè)進(jìn)程的優(yōu)先級(jí)變得高于當(dāng)前運(yùn)行進(jìn)程的優(yōu)先級(jí),從而也將引起進(jìn)程調(diào)度。
37、什么是符號(hào)鏈接,什么是硬鏈接?符號(hào)鏈接與硬鏈接的區(qū)別是什么?(6分)
參考答案:
鏈接分硬鏈接和符號(hào)鏈接。
符號(hào)鏈接可以建立對(duì)于文件和目錄的鏈接。符號(hào)鏈接可以跨文件系統(tǒng),即可以跨磁盤分區(qū)。符號(hào)鏈接的文件類型位是l,鏈接文件具有新的i節(jié)點(diǎn)。(3分)
硬鏈接不可以跨文件系統(tǒng)。它只能建立對(duì)文件的鏈接,硬鏈接的文件類型位是-,且硬鏈接文件的i節(jié)點(diǎn)同被鏈接文件的i節(jié)點(diǎn)相同。(3分)
38、簡(jiǎn)述Boot Loader 的兩種操作模式 (Operation Mode)?
答:
啟動(dòng)加載(Boot loading)模式:這種模式也稱為"自主"(Autonomous)模式。也即 Boot Loader 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)過(guò)程并沒(méi)有用戶的介入。這種模式是 Boot Loader 的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)侯,Boot Loader 顯然必須工作在這種模式下。 (2.5分)
下載(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的 Boot Loader 將通過(guò)串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被 Boot Loader 保存到目標(biāo)機(jī)的 RAM 中,然后再被 Boot Loader 寫到目標(biāo)機(jī)上的FLASH 類固態(tài)存儲(chǔ)設(shè)備中。Boot Loader 的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時(shí)被使用;此外,以后的系統(tǒng)更新也會(huì)使用 Boot Loader 的這種工作模式。工作于這種模式下的 Boot Loader 通常都會(huì)向它的終端用戶提供一個(gè)簡(jiǎn)單的命令行接口。(2.5分)
39、模塊的編程和普通程序的編程有哪些區(qū)別?(6分)
參考答案:
主要區(qū)別為:
(1)因?yàn)閮?nèi)核模塊運(yùn)行在內(nèi)核態(tài),所以包含的頭文件是內(nèi)核程序相關(guān)的頭文件,而普通程序則包含的是glibc的頭文件(1分)
(2)模塊程序沒(méi)有main函數(shù),而是通過(guò)init_module函數(shù)在加載后初始化。(2分)
(3)模塊程序內(nèi)可直接調(diào)用內(nèi)核函數(shù),而普通程序則只能通過(guò)系統(tǒng)調(diào)用使用內(nèi)核函數(shù)。(2分)
(4)普通用戶程序可運(yùn)行多次,而內(nèi)核函數(shù)通常則只能加載1次(1分)。
41、 已知C語(yǔ)言程序有主程序模塊prog.c,prog.h,其中調(diào)用了另一模塊subr.c, subr.h中的功能。試寫出一個(gè)可將這兩個(gè)模塊編譯成可執(zhí)行文件pr1的makefile。(5分)
參考答案:
[每行1分]
pr1: prog.o subr.o
gcc –o pr1 prog.o subr.o
prog.o: prog.c prog.h
gcc –c –o prog.o prog.c
subr.o: subr.c subr.h
gcc –c –o subr.o subr.c
43、簡(jiǎn)述Linux的VFS機(jī)制及其特點(diǎn)?(5分)
參考答案:
VFS是一種抽象的文件機(jī)制,內(nèi)核中對(duì)文件系統(tǒng)的相關(guān)操作系統(tǒng)實(shí)際上都通過(guò)操作VFS實(shí)現(xiàn),也就是說(shuō)VFS是對(duì)各具體文件系統(tǒng)的'抽象。(3分)
VFS使得內(nèi)核其他部分無(wú)須關(guān)心不同文件系統(tǒng)之間的差異,使得Linux可以支持多種類型的文件系統(tǒng)。當(dāng)然,因?yàn)樵黾恿顺橄髮樱瑫?huì)有類型轉(zhuǎn)換的開(kāi)銷。(2分)
44、模塊的編程和普通程序的編程有哪些區(qū)別?(5分)
參考答案:
主要區(qū)別為:
(1)因?yàn)閮?nèi)核模塊運(yùn)行在內(nèi)核態(tài),所以包含的頭文件是內(nèi)核程序相關(guān)的頭文件,而普通程序則包含的是glibc的頭文件(1分)
(2)模塊程序沒(méi)有main函數(shù),而是通過(guò)init_module函數(shù)在加載后初始化。(2分)
(3)模塊程序內(nèi)可直接調(diào)用內(nèi)核函數(shù),而普通程序則只能通過(guò)系統(tǒng)調(diào)用使用內(nèi)核函數(shù)。(2分)
45、BootLoader有哪幾種工作模式?各有什么特點(diǎn)(5分)
參考答案:?jiǎn)?dòng)加載模式和下模式(2分)。前者“自主”,不需要用戶干預(yù),后者可響應(yīng)用戶的交互請(qǐng)求。(3分)
46、簡(jiǎn)述嵌入式系統(tǒng)調(diào)試有哪幾種方式(5分)
參考答案:
模擬器方式(1分)、在線仿真器方式(1分)、監(jiān)控器方式(1分)、在線調(diào)試器方式,如JTAG(2分)。
47、Qt/Embedded的主要特點(diǎn)是什么?(5分)
參考答案:
是一個(gè)專門為嵌入式系統(tǒng)設(shè)計(jì)的圖形用戶界面的工具包(1分)。支持UNIX和Windows平臺(tái)(1分)。采用面向?qū)ο蟮乃枷腴_(kāi)發(fā)(1分),開(kāi)發(fā)接口與桌面的Qt相同,因此桌面應(yīng)用程序可方便的移植到Qt/E(1分)。不分層的架構(gòu)使得其他運(yùn)行速度很快(1分)。
48、簡(jiǎn)述嵌入式系統(tǒng)的開(kāi)發(fā)流程。
參考答案:
需求分析階段(1分)
體系結(jié)構(gòu)設(shè)計(jì)(1分)
硬件/軟件設(shè)計(jì)(1分)
系統(tǒng)集成(1分)
代碼固化(1分)
49、簡(jiǎn)述C語(yǔ)言中數(shù)組和指針的異同點(diǎn)。
參考答案:
相同點(diǎn):(1)表達(dá)式中的數(shù)組名被編譯器當(dāng)作一個(gè)指向該數(shù)組第一個(gè)元素的指針(1分)
(2)下標(biāo)總是與指針偏移量相同(1分)
(3)在函數(shù)參數(shù)的聲明中,數(shù)組被編譯器當(dāng)作一個(gè)指向該數(shù)組第一個(gè)元素的指針(1分)
不同點(diǎn):(1)指針用于保存數(shù)據(jù)的地址,而數(shù)組用于保存數(shù)據(jù)(1分)
(2)指針是間接訪問(wèn)而數(shù)組是直接訪問(wèn)方式(1分)
50、什么是交叉編譯?為什么要采用交叉編譯(5分)
參考答案:所謂交叉編譯,是指在一個(gè)平臺(tái)上編譯生成在另一個(gè)平臺(tái)上運(yùn)行的可執(zhí)行程序。(3分)。之所以采用交叉編譯,是因?yàn)槟繕?biāo)平臺(tái)上不具備直接運(yùn)行開(kāi)發(fā)環(huán)境的條件。(2分)
。
51、什么是符號(hào)鏈接,什么是硬鏈接?符號(hào)鏈接與硬鏈接的區(qū)別是什么?
參考答案:
鏈接分硬鏈接和符號(hào)鏈接。
符號(hào)鏈接可以建立對(duì)于文件和目錄的鏈接。符號(hào)鏈接可以跨文件系統(tǒng),即可以跨磁盤分區(qū)。符號(hào)鏈接的文件類型位是l,鏈接文件具有新的i節(jié)點(diǎn)。(3分)
硬鏈接不可以跨文件系統(tǒng)。它只能建立對(duì)文件的鏈接,硬鏈接的文件類型位是-,且硬鏈接文件的i節(jié)點(diǎn)同被鏈接文件的i節(jié)點(diǎn)相同。(2分)
52、簡(jiǎn)述Boot Loader的主要功能。
參考答案:
基本硬件設(shè)備初始化。(1分)
設(shè)置好堆棧。 (1分)
檢測(cè)系統(tǒng)內(nèi)存映射(memory map)。 (1分)
將 kernel 映像和根文件系統(tǒng)映像從 flash 上讀到 RAM 空間中。(1分)
為內(nèi)核設(shè)置啟動(dòng)參數(shù),調(diào)用內(nèi)核。(1分)
53、嵌入式Linux系統(tǒng)的根文件系統(tǒng)通常應(yīng)該包括哪個(gè)內(nèi)容?
參考答案:
通常包括:init、libc庫(kù)、驅(qū)動(dòng)模塊、必需的應(yīng)用程序和系統(tǒng)配置腳本。(各1分)
54、
55、回答下面問(wèn)題:
a) 對(duì)于整形變量A=0x12345678,請(qǐng)畫出在little endian及big endian的方式下在內(nèi)存中是如何存儲(chǔ)的。
b) 在ARM系統(tǒng)中,函數(shù)調(diào)用的時(shí)候,參數(shù)是通過(guò)哪種方式傳遞的?
c) 中斷(interrupt,如鍵盤中斷)與異常(exception,如除零異常)有何區(qū)別?
答:
a) 0x12345678
little endian big endian 剛好反過(guò)來(lái)
高地址--〉 0x12 低地址--〉 0x12
0x34 0x34
0x56 0x56
低地址--〉 0x78 高地址--〉 0x78
b)
答:應(yīng)用程序中使用中間寄存器及數(shù)據(jù)棧來(lái)傳遞參數(shù)。
在arm匯編中,如果第1~4個(gè)參數(shù)通過(guò)r0 -r3寄存器來(lái)傳遞,超過(guò)4個(gè)的使用數(shù)據(jù)棧進(jìn)行傳遞,輸出函數(shù)由r0傳遞。
c)所謂中斷應(yīng)該是指外部硬件產(chǎn)生的一個(gè)電信號(hào),從cpu的中斷引腳進(jìn)入,打斷cpu當(dāng)前的運(yùn)行;
所謂異常,是指軟件運(yùn)行中發(fā)生了一些必須作出處理的事件,cpu自動(dòng)產(chǎn)生一個(gè)陷入來(lái)打斷當(dāng)前運(yùn)行,轉(zhuǎn)入異常處理流程。
56、某Linux主機(jī)的/etc/rc.d/rc.inet1文件中有如下語(yǔ)句,請(qǐng)修正錯(cuò)誤,并解釋其內(nèi)容。
/etc/rc.d/rc.inet1:
……
ROUTE add –net default gw 192.168.0.101 netmask 255.255.0.0 metric 1
ROUTE add –net 192.168.1.0 gw 192.168.0.250 netmask 255.255.0.0 metric 1
答:修正錯(cuò)誤:
(1)ROUTE應(yīng)改為小寫:route;(2)netmask 255.255.0.0應(yīng)改為:netmask 255.255.255.0;
(3)缺省路由的子網(wǎng)掩碼應(yīng)改為:netmask 0.0.0.0;
(4)缺省路由必須在最后設(shè)定,否則其后的路由將無(wú)效。
解釋內(nèi)容:
(1)route:建立靜態(tài)路由表的命令;(2)add:增加一條新路由;
(3)-net 192.168.1.0:到達(dá)一個(gè)目標(biāo)網(wǎng)絡(luò)的網(wǎng)絡(luò)地址;
(4)default:建立一條缺省路由;(5)gw 192.168.0.101:網(wǎng)關(guān)地址;
(6)metric 1:到達(dá)目標(biāo)網(wǎng)絡(luò)經(jīng)過(guò)的路由器數(shù)(跳數(shù))。
6.下述代碼取自u(píng)-boot,請(qǐng)對(duì)其加以逐行注釋和分析。
typedef int (init_fnc_t) (void);
init_fnc_t *init_sequence[] = {
cpu_init,
board_init,
env_init,
serial_init,
display_banner,
NULL,
};
init_fnc_t **init_fnc_ptr;
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
4.簡(jiǎn)述2.4與2.6內(nèi)核模塊機(jī)制的改變對(duì)編寫設(shè)備驅(qū)動(dòng)程序的影響?
答:2.4內(nèi)核中,模塊的編譯只需內(nèi)核源碼頭文件;需要在包含linux/modules.h之前定義MODULE;編譯、連接后生成的內(nèi)核模塊后綴為.o。2.6內(nèi)核中,模塊的編譯需要配置過(guò)的內(nèi)核源碼;編譯、連接后生成的內(nèi)核模塊后綴為.ko;
在2.6 內(nèi)核中,內(nèi)核模塊必須調(diào)用宏module_init 與module_exit() 去注冊(cè)初始化與退 出函數(shù)。在2.4內(nèi)核中,如果初始化函數(shù)命名為init_module()、退出函數(shù)命名為cleanup_module()。
2.4內(nèi)核中,模塊自身通過(guò)MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏來(lái)管理自己被使用的計(jì)數(shù)。2.6內(nèi)核提供了更健壯、靈活的模塊計(jì)數(shù)管理接口try_module_get(&module)及module_put (& module)取代2.4中的模塊使用計(jì)數(shù)管理宏;模塊的使用計(jì)數(shù)不必由自身管理,而且在管理模塊使用計(jì)數(shù)時(shí)考慮到SMP與 PREEMPT機(jī)制的影響。
2.4 內(nèi)核下,缺省情況時(shí)模塊中的非靜態(tài)全局變量及函數(shù)在模塊加載后會(huì)輸出到內(nèi)核空間。2.6內(nèi)核下,缺省情況時(shí)模塊中的非靜態(tài)全局變量及函數(shù)在模塊加載后不會(huì)輸出到內(nèi)核空間,需要顯式調(diào)用宏EXPORT_SYMBOL。
57、論述一下問(wèn)題
(1) ARM中引起異常的原因
(2) 在ARM體系中,異常中斷向量表的大小是多少,其中每個(gè)異常中斷占據(jù)多少字節(jié)
(3) 異常中斷的處理、返回過(guò)程。
答:(1)原因主要:
a.指令執(zhí)行引起的異常
軟件中斷、未定義指令(包括所要求的協(xié)處理器不存在是的協(xié)處理器指令)、預(yù)取址中止(存儲(chǔ)器故障)、數(shù)據(jù)中止。
b.外部產(chǎn)生的中斷
復(fù)位、FIQ、IRQ。
(2)在ARM體系中,異常中斷向量表的大小為32字節(jié),其中每個(gè)異常中斷占據(jù)4個(gè)字節(jié)大小,保留了4個(gè)字節(jié)空間。
(3)ARM處理器對(duì)異常中斷的響應(yīng)過(guò)程是首先保存處理器當(dāng)前狀態(tài)、中斷屏蔽位及CPSR寄存器中的各個(gè)條件標(biāo)志位。這是通過(guò)將當(dāng)前程序狀態(tài)寄存器CPSR的內(nèi)容保存到將要執(zhí)行的異常中斷對(duì)應(yīng)的SPSR寄存器中實(shí)現(xiàn)的。其次設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的位。再次將寄存器LR_mode(R14_mode)設(shè)置成返回地址。最后將PC設(shè)置成該異常中斷的中斷向量地址,從而跳轉(zhuǎn)到對(duì)應(yīng)的中斷處理程序處執(zhí)行。
ARM處理器從異常中斷程序中返回的過(guò)程:首先恢復(fù)被中斷程序的處理器狀態(tài),也就是將SPSR_mode 內(nèi)容復(fù)制到CPSR。然后返回到發(fā)生異常中斷指令的下一條指令處執(zhí)行,即將LR_mode(R14_mode)寄存器的內(nèi)容復(fù)制到PC中。
58、在linux中如何編譯C程序,使之成為可執(zhí)行文件(3分)?如何調(diào)試(3分)?
答案:
[問(wèn)題1](3分)
1)檢查程序中.h文件所在的目錄,將其加入系統(tǒng)PATH中;
2)執(zhí)行C編譯:#gcc [源文件名] -o [目標(biāo)文件名]
3)改變目標(biāo)文件為可執(zhí)行文件:#chmod +x [目標(biāo)文件名]
4)如需將多個(gè)可執(zhí)行文件連續(xù)執(zhí)行,可用vi生成批處理文件,最后記得將該批處理文件屬性改為可執(zhí)行(同上一步)
[問(wèn)題2](3分)
調(diào)試:在編譯時(shí)使用-g參數(shù),就可以使用gdb進(jìn)行調(diào)試。
59、時(shí)間片的大小對(duì)系統(tǒng)有什么影響?(3分)在選取時(shí)間片是應(yīng)考慮哪些因素?(3分)
參考答案:
[問(wèn)題1](3分)
在輪轉(zhuǎn)法中,時(shí)間片長(zhǎng)度的選取非常重要,將直接影響系統(tǒng)開(kāi)銷和響應(yīng)時(shí)間。如果時(shí)間片長(zhǎng)度很小,則調(diào)度程序剝奪處理機(jī)的次數(shù)頻繁,加重系統(tǒng)開(kāi)銷;反之,如果時(shí)間片長(zhǎng)度選擇過(guò)長(zhǎng),比方說(shuō)一個(gè)時(shí)間片就能保證就緒隊(duì)列中所有進(jìn)程都執(zhí)行完畢,則輪轉(zhuǎn)法就退化成先進(jìn)先出算法。
[問(wèn)題2](3分)
影響時(shí)間片大小的主要因素有:系統(tǒng)響應(yīng)時(shí)間、就緒進(jìn)程數(shù)目和計(jì)算機(jī)處理能力
60、模塊的編程和普通程序的編程有哪些區(qū)別?(6分)
參考答案:
主要區(qū)別為:
(1)因?yàn)閮?nèi)核模塊運(yùn)行在內(nèi)核態(tài),所以包含的頭文件是內(nèi)核程序相關(guān)的頭文件,而普通程序則包含的是glibc的頭文件(1分)
(2)模塊程序沒(méi)有main函數(shù),而是通過(guò)init_module函數(shù)在加載后初始化。(2分)
(3)模塊程序內(nèi)可直接調(diào)用內(nèi)核函數(shù),而普通程序則只能通過(guò)系統(tǒng)調(diào)用使用內(nèi)核函數(shù)。(2分)
(4)普通用戶程序可運(yùn)行多次,而內(nèi)核函數(shù)通常則只能加載1次(1分)。
61、什么是交叉編譯?為什么要采用交叉編譯(5分)
參考答案:所謂交叉編譯,是指在一個(gè)平臺(tái)上編譯生成在另一個(gè)平臺(tái)上運(yùn)行的可執(zhí)行程序。(3分)。之所以采用交叉編譯,是因?yàn)槟繕?biāo)平臺(tái)上不具備直接運(yùn)行開(kāi)發(fā)環(huán)境的條件。(2分)
62、簡(jiǎn)述嵌入式Linux系統(tǒng)的初始化過(guò)程(5分)
參考答案:
嵌入式Linux系統(tǒng)開(kāi)機(jī)首先運(yùn)行BootLoader,然后由BootLoader引導(dǎo)啟動(dòng)內(nèi)核,由內(nèi)核檢查和初始化硬件設(shè)備,載入設(shè)備的驅(qū)動(dòng)程序模塊,安裝root文件系統(tǒng),然后內(nèi)核將啟動(dòng)一個(gè)名為init的進(jìn)程(2分)。在init運(yùn)行完成并啟動(dòng)其它必要的后續(xù)進(jìn)程后,系統(tǒng)開(kāi)始運(yùn)行,引導(dǎo)過(guò)程結(jié)束。init進(jìn)程啟動(dòng)時(shí)需要讀取inittab配置文件,該文件確定init在系統(tǒng)啟動(dòng)和關(guān)機(jī)時(shí)的工作特性。(3分)
六、閱讀程序題
1. 管道是Linux中進(jìn)程通信的一種方式,以下程序在父進(jìn)程和子進(jìn)程之間創(chuàng)建了一個(gè)管道,然后建立它們之間的通信,實(shí)現(xiàn)父進(jìn)程向子進(jìn)程寫數(shù)據(jù)的功能。說(shuō)明標(biāo)號(hào)所在行代碼的功能。
#include
#include
#include
#include
#include
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char* p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r)); (1)
if(pipe(pipe_fd)<0) (2)
{
printf("pipe create error\n");
return -1;
}
if((pid=fork())==0) (3)
{
printf("\n");
close(pipe_fd[1]); (4)
sleep(2);
if((r_num=read(pipe_fd[0],buf_r,100))>0) (5)
{
printf( "%d numbers read from the pipe is %s\n",r_num,buf_r);
}
close(pipe_fd[0]); (6)
exit(0);
}
else if(pid>0) (7)
{
close(pipe_fd[0]); (8)
if(write(pipe_fd[1],"Hello",5)!=-1) (9)
printf("parent write1 success!\n");
if(write(pipe_fd[1]," Pipe",5)!=-1)
printf("parent write2 success!\n");
close(pipe_fd[1]); (10)
sleep(3);
waitpid(pid,NULL,0);
exit(0);
}
}
答案要點(diǎn):(1) 將數(shù)據(jù)緩沖區(qū)清0 (2) 創(chuàng)建管道 (3) 創(chuàng)建子進(jìn)程 (4) 關(guān)閉子進(jìn)程寫描述符 (5) 子進(jìn)程讀取管道內(nèi)容 (6) 關(guān)閉子進(jìn)程讀描述符 (7) 父進(jìn)程運(yùn)行控制語(yǔ)句 (8) 關(guān)閉父進(jìn)程的讀描述符 (9) 將數(shù)據(jù)寫入緩沖區(qū)
(10) 關(guān)閉父進(jìn)程寫描述符
2. 閱讀下面shell程序,寫出執(zhí)行結(jié)果:
#!/bin/sh
for name in Tom Jack Harry
do
echo "$name is my friend"
done
1、答:
Tom is my friend
Jack is my friend
Harry is my friend
3. 用變量a給出下面的定義
a) 一個(gè)指向整型數(shù)的指針(A pointer to an integer)
b) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer)
c) 一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers)
d) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(An array of 10 pointers to integers)
e) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)
2、答:
a) int *a; // A pointer to an integer
b) int **a; // A pointer to a pointer to an integer
c) int a[10]; // An array of 10 integers
d) int *a[10]; // An array of 10 pointers to integers
e) int (*a)[10]; // A pointer to an array of 10 integers
4. 根據(jù)下面給出的聲明和數(shù)據(jù),對(duì)每個(gè)表達(dá)式進(jìn)行求值并寫出他的值。在每個(gè)表達(dá)式進(jìn)行求值是使用原來(lái)給出的值(也就是說(shuō),某個(gè)表達(dá)式的結(jié)果不影響后面的表達(dá)式)。假定ints數(shù)組在內(nèi)存中的起始位置是100,整型值和指針的長(zhǎng)度都是4字節(jié)。