- 相關(guān)推薦
C /C 筆試題-linux內(nèi)核驅(qū)動(dòng)開發(fā)筆試題
在社會(huì)的各個(gè)領(lǐng)域,我們很多時(shí)候都會(huì)有考試,接觸到試題,通過試題可以檢測(cè)參試者所掌握的知識(shí)和技能。大家知道什么樣的試題才是規(guī)范的嗎?下面是小編為大家整理的C /C 筆試題-linux內(nèi)核驅(qū)動(dòng)開發(fā)筆試題,僅供參考,歡迎大家閱讀。
C /C 筆試題-linux內(nèi)核驅(qū)動(dòng)開發(fā)筆試題
一、C/C++語言
1.頭文件中的ifndef/define/endif 干什么用?
答:防止該頭文件被重復(fù)引用
2.數(shù)據(jù)類型判斷
typedefint (*test) ( float * , float*)
test tmp;
tmp 的類型是:___C___。
(a) 函數(shù)的指針,該函數(shù)以 兩個(gè)指向浮點(diǎn)數(shù)(float)的指針(pointer)作為參數(shù)(arguments),并且函數(shù)的返回值類型是整型指針
(b) 整型指針
(c) 函數(shù)的指針,該函數(shù)以兩個(gè)指向浮點(diǎn)數(shù)(float)的指針(pointer)作為參數(shù)(arguments),并且函數(shù)的返回值類型是整型
(d) 以上都不是
3.C++的類和C里面的struct有什么區(qū)別?
struct中的成員默認(rèn)是public的,class中的默認(rèn)是private
class有默認(rèn)的構(gòu)造、析構(gòu)函數(shù),struct沒有
class中可以有虛函數(shù),struct不行
class可以被繼承,struct不
4.閱讀并作答
下面的代碼輸出是什么,為什么?
void test(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<=6");
}
答:”>6”,因?yàn)橛蟹?hào)和無符號(hào)混合運(yùn)算時(shí),有符號(hào)數(shù)自動(dòng)轉(zhuǎn)換為無符號(hào)數(shù)值進(jìn)行運(yùn)算
5.閱讀并作答
int counter (int i)
{
static int count =0;
count = count +i;
return (count );
}
main()
{
int i , j;
for (i=0; i <=5; i++)
j = counter(i);
}
本程序執(zhí)行到最后,j的值是:__B___。
(a) 10
(b) 15
(c) 6
(d) 7
6.閱讀并作答
main()
{
int a[][3] = { 1,2,3 ,4,5,6};
int (*ptr)[3] =a;
printf("%d %d " ,(*ptr)[1], (*ptr)[2] );
++ptr;
printf("%d %d" ,(*ptr)[1], (*ptr)[2] );
}
這段程序的輸出是: __A___。
(a) 2 3 5 6
(b) 2 3 4 5
(c) 4 5 0 0
(d) 以上均不對(duì)
7..以下表達(dá)式符合規(guī)范的是___D__。
a. while (p && *p) // p為指針變量
b. if (1 == flag) // flag為布爾變量
c. if (0.0 == x) // x為浮點(diǎn)變量
d. if (strlen(strName) != 0) // strName為字符串變量
8.給定一個(gè)4字節(jié)整型變量a,以bit0~bit31標(biāo)識(shí)二進(jìn)制位,寫兩段代碼,第一個(gè)設(shè)置a的bit 3,第二個(gè)清除a 的bit 3。在以上兩個(gè)操作中,要保持其它位不變。#define BIT3 (1<<3)
a |= BIT3;
a ^= ~BIT3;
9.編碼實(shí)現(xiàn)以下幾個(gè)小功能
(1) 編寫兩個(gè)宏實(shí)現(xiàn)一個(gè)字節(jié)無符號(hào)整數(shù)的16進(jìn)制與壓縮bcd碼進(jìn)行互相轉(zhuǎn)換。假設(shè)數(shù)值大小不超過99
例如:“0x12”是16進(jìn)制表示法,10進(jìn)制數(shù)為“18”,記為“0x18”
#define BYT_HEX2BCD(x) ( (x/10 )<<4) + (x%10)
#define BYT_BCD2HEX(x) ( (x>>4)*10 ) + (x&0x0f)
(2) 寫個(gè)函數(shù)實(shí)現(xiàn)將ASCII碼串轉(zhuǎn)換為16進(jìn)制數(shù)組
例:ASCII串為“8e349bcd45”轉(zhuǎn)換為
0x8e,0x34,0x9b,0xcd,0x45
intStrAsc2Hex(unsigned char *dst,const char * src, int len)
{
int i;
unsigned char dtemp,stemp;
char *ptr;
ptr=const_cast
if(len%2) return 0;
len/=2;
for(i=0;i if( (*ptr) >=0 &&(*ptr)<=9 )stemp=*ptr-0; if( (*ptr) >=A &&(*ptr)<=F )stemp=*ptr-A+0x0a; if( (*ptr) >=a &&(*ptr)<=f )stemp=*ptr-a+0X0a; dtemp=stemp<<4; ptr++; if( (*ptr) >=0 &&(*ptr)<=9 )stemp=*ptr-0; if( (*ptr) >=A &&(*ptr)<=F )stemp=*ptr-A+0x0a; if( (*ptr) >=a &&(*ptr)<=f )stemp=*ptr-a+0X0a; *dst++=dtemp|stemp; ptr++; } return len; } 二、Linux應(yīng)用開發(fā) 1.Linux操作系統(tǒng) 。1)解釋linux下常用命令: rm刪除 cp復(fù)制 mount掛載 chmod更改權(quán)限 ls輸出目錄信息 (2)遇到不熟悉的命令,你會(huì)? 使用man命令查找?guī)椭?/p> 2. 段錯(cuò)誤調(diào)試 。1)什么是段錯(cuò)誤? 所謂的段錯(cuò)誤就是指訪問的內(nèi)存超出了系統(tǒng)所給這個(gè)程序的內(nèi)存空間,一旦程序發(fā)生了越界訪問,CPU就會(huì)產(chǎn)生相應(yīng)的異常保護(hù),于是segmentationfault就出現(xiàn)了。 (2)舉例說明編程中通常碰到段錯(cuò)誤的地方有哪些? 例1 往受到系統(tǒng)保護(hù)的內(nèi)存地址寫數(shù)據(jù)(如內(nèi)核占用的或者是其他程序正在使用的) #include intmain() { int i = 0; scanf ("%d", i); /* should have used &i */ printf ("%d\n", i); return 0; } 例2 內(nèi)存越界(數(shù)組越界,變量類型不一致等) #include intmain() { int b = 10; printf("%s\n", b); return 0; } (3)如何發(fā)現(xiàn)程序中的段錯(cuò)誤并處理掉? (a)在程序內(nèi)部的關(guān)鍵部位輸出信息,可以跟蹤段錯(cuò)誤在代碼中可能的位置。使用這種調(diào)試方法,可以用條件編譯指令#ifdef DEBUG和#endif把printf函數(shù)給包含起來,編譯的時(shí)候加上-D DEBUG參數(shù)就可以查看調(diào)試信息。 (b)用gdb來調(diào)試,在編譯的時(shí)候加上-g參數(shù),用來顯示調(diào)試信息,程序在運(yùn)行到段錯(cuò)誤的地方,會(huì)自動(dòng)停下來并顯示出錯(cuò)的行和行號(hào) (c)使用catchsegv命令來撲獲段錯(cuò)誤 C /C 筆試題-linux內(nèi)核驅(qū)動(dòng)開發(fā)筆試題 一、基礎(chǔ)知識(shí) 1、Linux內(nèi)核的主要組成部分有哪些? 2、內(nèi)核配置是何時(shí)進(jìn)行的重要操作? 3、系統(tǒng)交換分區(qū)的作用是什么? 二、數(shù)據(jù)結(jié)構(gòu) Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)有哪些? 簡(jiǎn)述紅黑樹的特點(diǎn)及其在Linux內(nèi)核中的應(yīng)用。 三、內(nèi)存管理 1、Linux內(nèi)核中如何進(jìn)行內(nèi)存分配和釋放? 2、DMA(直接內(nèi)存訪問)在Linux內(nèi)核中的作用是什么? 四、中斷處理 1、簡(jiǎn)述Linux內(nèi)核中的中斷處理流程。 2、如何編寫Linux內(nèi)核的中斷處理函數(shù)? 五、并發(fā)控制 1、Linux內(nèi)核中如何保證并發(fā)訪問的安全性? 2、簡(jiǎn)述自旋鎖和互斥鎖的區(qū)別。 答案 一、1、Linux內(nèi)核主要由進(jìn)程管理系統(tǒng)、內(nèi)存管理系統(tǒng)、I/O管理系統(tǒng)和文件管理系統(tǒng)等四個(gè)子系統(tǒng)組成。 2、內(nèi)核配置是系統(tǒng)管理員在改變系統(tǒng)配置或硬件時(shí)要進(jìn)行的重要操作。 3、系統(tǒng)交換分區(qū)是作為系統(tǒng)虛擬存儲(chǔ)器的一塊區(qū)域,用于當(dāng)物理內(nèi)存不足時(shí),將部分內(nèi)存中的數(shù)據(jù)交換到磁盤上。 二、紅黑樹是一種自平衡的二叉查找樹,它確保了從根到葉子的最長(zhǎng)的可能路徑不多于最短的可能路徑的兩倍長(zhǎng)。在Linux內(nèi)核中,紅黑樹被用于多種場(chǎng)景,如管理進(jìn)程調(diào)度器的運(yùn)行隊(duì)列、實(shí)現(xiàn)文件系統(tǒng)(如ext4)中的目錄索引等。 三、1、Linux內(nèi)核提供了多種內(nèi)存分配機(jī)制,如slab分配器、kmalloc/kfree、vmalloc/vfree等。slab分配器用于分配小塊內(nèi)存,而kmalloc/kfree和vmalloc/vfree則分別用于物理內(nèi)存和虛擬內(nèi)存的分配與釋放。 2、DMA允許某些硬件子系統(tǒng)(如網(wǎng)絡(luò)接口卡、磁盤控制器等)直接訪問系統(tǒng)內(nèi)存,而無需CPU的干預(yù)。這可以提高數(shù)據(jù)傳輸?shù)男,減少CPU的負(fù)擔(dān)。在Linux內(nèi)核中,DMA被廣泛用于各種設(shè)備的驅(qū)動(dòng)開發(fā)中。 四、1、當(dāng)硬件設(shè)備產(chǎn)生中斷時(shí),CPU會(huì)暫停當(dāng)前正在執(zhí)行的程序,轉(zhuǎn)而執(zhí)行中斷處理程序。在Linux內(nèi)核中,中斷處理流程通常包括中斷接收、中斷分發(fā)、中斷處理和中斷返回等步驟。中斷處理函數(shù)會(huì)注冊(cè)到內(nèi)核中,并在中斷發(fā)生時(shí)被調(diào)用。 2、編寫Linux內(nèi)核的中斷處理函數(shù)需要了解中斷處理函數(shù)的注冊(cè)和注銷機(jī)制。通常,中斷處理函數(shù)會(huì)作為內(nèi)核模塊的一部分進(jìn)行編寫和加載。在編寫中斷處理函數(shù)時(shí),需要注意函數(shù)的入口參數(shù)、返回值以及中斷處理過程中的同步和互斥問題。 五、1、自旋鎖和互斥鎖都是用于同步和互斥的鎖機(jī)制,但它們的實(shí)現(xiàn)和使用場(chǎng)景有所不同。自旋鎖在獲取鎖失敗時(shí)會(huì)不斷循環(huán)等待,適用于短時(shí)間的鎖持有和等待;而互斥鎖在獲取鎖失敗時(shí)會(huì)將線程或進(jìn)程掛起,適用于長(zhǎng)時(shí)間的鎖持有和等待。 2、Linux內(nèi)核通過多種機(jī)制來保證并發(fā)訪問的安全性,包括自旋鎖、互斥鎖、讀寫鎖等。這些鎖機(jī)制用于在多個(gè)線程或進(jìn)程同時(shí)訪問共享資源時(shí),保護(hù)數(shù)據(jù)的一致性和完整性。 【C /C 筆試題-linux內(nèi)核驅(qū)動(dòng)開發(fā)筆試題】相關(guān)文章: Linux內(nèi)核和驅(qū)動(dòng)考試題03-08 華為C/C++筆經(jīng)10-11 C筆試題04-05 部分c/c++筆試題10-26 c 面試題10-14 C++筆試題03-25 C#筆試題02-24 C/C++筆試題目常見題目03-26