說明:本篇文章題庫來源于網(wǎng)絡(luò),目的在于共同學(xué)習(xí),共同進步,知識分享可以通過網(wǎng)絡(luò)平臺不斷提高自己
海康威視嵌入式驅(qū)動工程師的題目只包含選擇題和簡答題,沒有編程題。毫無疑問,C語言基礎(chǔ)題依然是最多的(c可是嵌入式的筆尖),又因為是驅(qū)動方向,所以關(guān)于linux操作系統(tǒng)和底層方面的題會比較多一點,但是就題目的總體難度而言,其實并不是特別難。但如果對Linux和驅(qū)動方面不是很了解的話,會比較吃虧。
選擇題
1、若有8個待排序元素,采用冒泡排序和插入排序最大時間復(fù)雜度分別是()
A.64、24
B.64、64
C.16、64
D.16、16
答案:B
解答:9大內(nèi)部排序的時間復(fù)雜度和空間復(fù)雜度如下表所示:
2、下面程序中b的值是()
int a[15] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
int *p = &a[5];
int b = p[7];
A.14
B.13
C.11
D.12
答案:B
3、下面哪個命令用來卸載一個內(nèi)核模塊?
A.modprobe
B.delmod
C.unmod
D.rmmod
答案:D
4、使用快速排序?qū)個數(shù)進行排序,其在最佳情況、平均情況、最差情況下的時間復(fù)雜度分別是()
A.n、nlogn、nlogn
B.nlogn、nlogn、n^2
C.nlogn、nlogn、nlogn
D.n、nlogn、n^2
答案:B
5、關(guān)于互斥鎖的如下表述錯誤的是()。
A.互斥鎖的加鎖和解鎖必須由同一線程分別對應(yīng)使用
B.互斥鎖只能為0/1
C.互斥鎖的解鎖過程不需要關(guān)心順序,只需要成對使用即可
D.互斥鎖用于線程的互斥
答案:C
解答:互斥量和信號量的區(qū)別:
互斥量用于線程的互斥,信號量用于線程的同步。這是互斥量和信號量的根本區(qū)別,也就是互斥和同步之間的區(qū)別;互斥量值只能為0/1,信號量值可以為非負(fù)整數(shù)。也就是說,一個互斥量只能用于一個資源的互斥訪問,它不能實現(xiàn)多個資源的多線程互斥問題。信號量可以實現(xiàn)多個同類資源的多線程互斥和同步。當(dāng)信號量為單值信號量是,也可以完成一個資源的互斥訪問;互斥量的加鎖和解鎖必須由同一線程分別對應(yīng)使用,信號量可以由一個線程釋放,另一個線程得到。
6、Linux在某目錄下查找某字符串通常如下哪個指令()
A.find
B.grep
C.cat
D.其他都不對
答案:A
解答:Linux的find命令用來在指定目錄下查找文件
7、多個進程按照順序逐一來訪問某個資源,這種制約關(guān)系稱之為()
A.調(diào)度
B.協(xié)同
C.互斥
D.同步
答案:D
8、支持多道程序的操作系統(tǒng)在運行過程中,不斷地選擇新進程運行來實現(xiàn)CPU的共享,但其中不是引起操作系統(tǒng)選擇新進程的直接原因的是()
A.運行進程要等待某一事件發(fā)生
B.運行進程的時間片用完
C.有新進程進入就緒狀態(tài)
D.運行進程出錯
答案:C
解答:運行進程時間片用完,進程運行出錯,進程進入阻塞狀態(tài)(也就是等待某一事件發(fā)生)都會使操作系統(tǒng)發(fā)生調(diào)度,但有新進程進入就緒狀態(tài)不會影響其他進程狀態(tài)變化
9、操作系統(tǒng)分配資源的基本單位是()
A.進程
B.程序
C.線程
D.指令
答案:A
10、執(zhí)行下述的main函數(shù)后,輸出結(jié)果是()
int main()
{
int i = 10;
switch(i) {
case 9:i++;
case 10:i++;
case 11:i++;
default:i++;
}
printf("result= %dn", i);
return 0;
}
A.12
B.13
C.11
D.14
答案:B
11、以下能對二維數(shù)組a進行完整初始化的語句是()
A.int a[2][3]=((0,1,2),(3,4,5));
B.int a[2][3]={{0,1,2},{3,4,5}};
C.int a[2][3]={{0,1},{2,3},{4,5}};
D.int a[2][3]={0,1,2,3,4};
答案:B
12、下面程序的輸出值,正確的是()
#define CALC(x,y) x*y+x
int main()
{
int a = CALC(2 * 3, 3 + 2);
printf("result= %dn", a);
return 0;
}
A.26
B.30
C.24
D.36
答案:A
13、下面程序的輸出值,正確的是()
void swap(int *a, int *b) {
int *t;
t = a;
a = b;
b = t;
}
int main()
{
int x = 1, y = 2;
int *p = &x, *q = &y;
swap(p, q);
printf("%d %dn", *p, *q);
return 0;
}
A.1 1
B.2 2
C.1 2
D.2 1
答案:C
解答:本題的swap函數(shù)是將形參中的a、b兩個指針指向的地址交換了,實參p、q并沒有變化。可以比對一下:
swap(&x, &y); //有效果
void swap(int *a, int *b) {
int t;
t = *a;
*a = *b;
*b = t;
}
14、假如test指針的值為0x12345678,則表達(dá)式test_p[1]的指針地址值是()
char test[8] = { 0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
int *test_p = (int*)test;
A.0x12345678
B.0x1234567C
C.0x12345679
D.0x1234567A
答案:B
15、下面的C語言程序運行后,n的值是()
int n = 0;
int f = 17;
n = 4 * f % 3 + 1;
A.3
B.9
C.2
D.0
答案:A
16、下面那個操作可以將flag的bit[2](假定bit[31...0]對應(yīng)flag的32位)置0()
A.flag|=4
B.flag^=4
C.flag&=~4
D.flag|=~4
答案:C
17、下面程序的運行結(jié)果為()
#define TEST(a,b) a*b
int main()
{
int a = TEST(1 + 2, 3);
printf("result= %dn", a);
return 0;
}
A.2
B.3
C.7
D.9
答案:C
18、對于堆、棧、隊列描述錯誤的是()
A.隊列空間緩沖由進程申請,棧的空間緩沖由OS分配
B.堆總是一棵完全二叉樹
C.堆的數(shù)據(jù)類型和隊列相似
D.隊列先進先出,棧后進先出
答案:B
19、以下對字符數(shù)組test賦值方式錯誤的是()
A.char test[10]; strcpy(test,"test");
B.char test[10]; test="test";
C.char test[]={'t','e','s','t'};
D.char test[10]={'t','e','s','t'};
答案:B
20、可用于中斷下半段處理的處理機制有()
A.tasklet
B.工作隊列
C.軟中斷
D.雙向鏈表
答案:ABC
解答:上半部是不能中斷的,僅僅是響應(yīng)中斷;下半部是可以中斷的。對于適時要求高的,必須放在上半部。下半部的實現(xiàn)主要是通過軟中斷、tasklet、工作隊列來實現(xiàn)的。上半部的功能是響應(yīng)中斷。當(dāng)中斷發(fā)生時,它就把設(shè)備驅(qū)動程序中中斷處理例程的下半部掛到設(shè)備的下半部執(zhí)行隊列中去,然后繼續(xù)等待新的中斷到來。這樣一來,上半部的執(zhí)行速度就會很快,它就可以接受更多它負(fù)責(zé)的設(shè)備所產(chǎn)生的中斷了。上半部之所以快,是因為它是完全屏蔽中斷的,如果它沒有執(zhí)行完,其他中斷就不能及時地處理,只能等到這個中斷處理程序執(zhí)行完畢以后。所以要盡可能多的對設(shè)備產(chǎn)生的中斷進行服務(wù)和處理,中斷處理程序就一定要快;下半部的功能是處理比較復(fù)雜的過程。下半部和上半部最大的區(qū)別是可中斷,而上半部卻不可中斷。下半部幾乎完成了中斷處理程序所有的事情,因為上半部只是將下半部排到了它們所負(fù)責(zé)的設(shè)備中斷的處理隊列中去,然后就不做其它的處理了。下半部所負(fù)責(zé)的工作一般是查看設(shè)備以獲得產(chǎn)生中斷的事件信息,并根據(jù)這些信息(一般通過讀設(shè)備上的寄存器得來)進行相應(yīng)的處理。下半部是可中斷的,所以在運行期間,如果其它設(shè)備產(chǎn)生了中斷,這個下半部可以暫時的中斷掉,等到那個設(shè)備的上半部運行完了,再回頭運行這個下半部。
21、有函數(shù)fun()定義如下,在main函數(shù)調(diào)用fun函數(shù)執(zhí)行過程中,使用了哪些函數(shù)參數(shù)傳遞方式()
int fun(int a[], short *ptr, int &c){
...
}
A.數(shù)組傳遞
B.指針傳遞
C.引用傳遞
D.值傳遞
答案-:BC
22、關(guān)于鏈表,描述正確的選項有()
A.在運行時可以動態(tài)添加
B.物理空間不連續(xù),空間開銷更大
C.查找元素不需要順序查找
D.可在任意節(jié)點位置插入元素
答案:ABD
23、對運算符優(yōu)先級的判斷,正確的是()
A.取余運算符%高于加運算符+
B.邏輯與運算符&&高于賦值運算符=
C.數(shù)組下標(biāo)[]高于自增運算符++
D.左移運算符<<高于大于運算符>
答案:ABCD
24、能在Linux內(nèi)核態(tài)執(zhí)行的是()。
A.缺頁中斷
B.時鐘中斷
C.命令解釋
D.進程調(diào)度
答案:ABD
解答:缺頁中斷和時鐘中斷都屬于中斷,在內(nèi)核態(tài)執(zhí)行。進程調(diào)度屬于系統(tǒng)調(diào)用,在內(nèi)核態(tài)執(zhí)行,命令解釋程序?qū)儆诿罱涌冢谟脩魬B(tài)執(zhí)行。
簡答題
1、Linux驅(qū)動連接硬件與應(yīng)用,根據(jù)你對驅(qū)動加載的理解,回答如下問題:
(1)insmod和modprobe都可以用來加載驅(qū)動模塊,請描述這兩者的差異。
(2)請給出三種以上Linux驅(qū)動模塊加載失敗的可能原因。
解答:modprobe和insmod類似,都是用來動態(tài)加載驅(qū)動模塊的,區(qū)別在于modprobe可以解決加載模塊時的依賴關(guān)系,它是通過/lib/modules/#uname -r/modules.dep(.bb)文件來查找依賴關(guān)系的;而insmod不能解決依賴問題;也就是說,如果你確定你要加載的驅(qū)動模塊不依賴其他驅(qū)動模塊的話,既可以insmod也可以modprobe,當(dāng)然insmod可以在任何目錄下執(zhí)行,更方便一些。而如果你要加載的驅(qū)動模塊還依賴其他ko驅(qū)動模塊的話,就只能將模塊拷貝到上述的特定目錄,depmod后再modprobe。
2、設(shè)計或開發(fā)Linux操作系統(tǒng)的內(nèi)核時,你會考慮哪些基本的管理模塊,并描述其作用。
解答:Linux內(nèi)核的五大模塊:進程調(diào)度模塊、內(nèi)存管理模塊、文件系統(tǒng)模塊、進程間通信模塊、網(wǎng)絡(luò)接口模塊。
進程調(diào)度模塊:用來負(fù)責(zé)控制進程對CPU 資源的使用。所采取的調(diào)度策略是各進程能夠公平合理地訪問CPU,同時保證內(nèi)核能及時地執(zhí)行硬件操作;
內(nèi)存管理模塊:用于確保所有進程能夠安全地共享機器主內(nèi)存區(qū),同時,內(nèi)存管理模塊還支持虛擬內(nèi)存管理方式,使得Linux 支持進程使用比實際內(nèi)存空間更多的內(nèi)存容量。并可以利用文件系統(tǒng),對暫時不用的內(nèi)存數(shù)據(jù)塊交換到外部存儲設(shè)備上去,當(dāng)需要時再交換回來;
文件系統(tǒng)模塊:用于支持對外部設(shè)備的驅(qū)動和存儲。虛擬文件系統(tǒng)模塊通過向所有的外部存儲設(shè)備提供一個通用的文件接口,隱藏了各種硬件設(shè)備的不同細(xì)節(jié)。從而提供并支持與其它操作系統(tǒng)兼容的多種文件系統(tǒng)格式;
進程間通信模塊:用于支持多種進程間的信息交換方式;
網(wǎng)絡(luò)接口模塊:提供對多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問并支持許多網(wǎng)絡(luò)硬件。






