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