亚洲一级免费看,特黄特色大片免费观看播放器,777毛片,久久久久国产一区二区三区四区,欧美三级一区二区,国产精品一区二区久久久久,人人澡人人草

嵌入式培訓(xùn) 百分網(wǎng)手機(jī)站

嵌入式軟件助理工程師認(rèn)證考試試題題庫(kù)(4)

時(shí)間:2018-04-01 11:42:31 嵌入式培訓(xùn) 我要投稿

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é)。