嵌入式 Linux面試基礎(chǔ)題

請(qǐng)問(wèn)uboot啟動(dòng)過(guò)程都做了些什么?

1、cpu剛開(kāi)始初始化的時(shí)候,還未設(shè)置棧,所以先使用匯編代碼,構(gòu)建異常項(xiàng)鏈表,然后設(shè)置cpu為svc(特權(quán))模式,同時(shí)關(guān)閉FIQ和IRQ(防止突發(fā)中斷程序跑飛了)
注:在跳轉(zhuǎn)到內(nèi)核之前,要滿(mǎn)足CPU出在SVC模式下。
2、對(duì)cp15協(xié)處理器進(jìn)行設(shè)置,這里主要是關(guān)閉MMU和cache
3、進(jìn)入到板級(jí)初始化階段,這里會(huì)進(jìn)行時(shí)鐘、內(nèi)存、串口的初始化。最后還要關(guān)閉看門(mén)狗。
4、接下來(lái)就是設(shè)置棧,為c語(yǔ)言準(zhǔn)備運(yùn)行環(huán)境,調(diào)用board_init_f,填充gd結(jié)構(gòu)體。
5、對(duì)代碼重定位,搬運(yùn)到內(nèi)存中去,搬運(yùn)之后,跳轉(zhuǎn)到內(nèi)存中去執(zhí)行board_init_r,這里就可以開(kāi)啟cache了,當(dāng)然也可以不開(kāi)啟。然后初始化其他設(shè)備。比如flash、網(wǎng)卡、emmc等。初始化完之后,在執(zhí)行main_loop

為什么uboot要關(guān)掉cache?

1、cpu剛開(kāi)始初始化的時(shí)候,還未設(shè)置棧,所以先使用匯編代碼,構(gòu)建異常項(xiàng)鏈表,然后設(shè)置cpu為svc(特權(quán))模式,同時(shí)關(guān)閉FIQ和IRQ(防止突發(fā)中斷程序跑飛了)
注:在跳轉(zhuǎn)到內(nèi)核之前,要滿(mǎn)足CPU出在SVC模式下。
2、對(duì)cp15協(xié)處理器進(jìn)行設(shè)置,這里主要是關(guān)閉MMU和cache
3、進(jìn)入到板級(jí)初始化階段,這里會(huì)進(jìn)行時(shí)鐘、內(nèi)存、串口的初始化。最后還要關(guān)閉看門(mén)狗。
4、接下來(lái)就是設(shè)置棧,為c語(yǔ)言準(zhǔn)備運(yùn)行環(huán)境,調(diào)用board_init_f,填充gd結(jié)構(gòu)體。
5、對(duì)代碼重定位,搬運(yùn)到內(nèi)存中去,搬運(yùn)之后,跳轉(zhuǎn)到內(nèi)存中去執(zhí)行board_init_r,這里就可以開(kāi)啟cache了,當(dāng)然也可以不開(kāi)啟。然后初始化其他設(shè)備。比如flash、網(wǎng)卡、emmc等。初始化完之后,在執(zhí)行main_loop

nandflash和norflash的區(qū)別,對(duì)norflash的操作方式的理解?

兩種芯片的結(jié)構(gòu)不同 NORflash之所以可以片內(nèi)執(zhí)行,就是因?yàn)樗螩PU去指令譯碼執(zhí)行的要求。CPU送一個(gè)地址出來(lái),NORflash就能給一個(gè)數(shù)據(jù)讓CPU執(zhí)行,中間不需要額外的處理操作。

NAND flash不一樣是因?yàn)閚andflash有地址,數(shù)據(jù),命令共用IO口的問(wèn)題,cpu把地址發(fā)出來(lái)之后,并不能直接得到數(shù)據(jù),還需要控制線的操作才能完成。就是他沒(méi)有專(zhuān)用的SRAM接口。

嵌入式系統(tǒng)中代碼的執(zhí)行方式主要有3種:
完全映射\按需分頁(yè)\eXecute In Place (XIP)片上執(zhí)行。

語(yǔ)句for( ;1 ;)有什么問(wèn)題?它是什么意思?

無(wú)限循環(huán),和while(1)相同。

do……while和while……do有什么區(qū)別?

前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán)。

代碼輸出結(jié)果是?

#include <stdio.h>
main()
{
  int a,b,c,d;
  a=10;
  b=a++;
  c=++a;
  d=10*a++;
  printf("b,c,d:%d,%d,%d",b,c,d);
  return 0;
} 

輸出結(jié)果:
b,c,d:10,12,120

Linux設(shè)備中字符設(shè)備與塊設(shè)備有什么主要的區(qū)別?

字符設(shè)備:字符設(shè)備是個(gè)能夠像字節(jié)流(類(lèi)似文件)一樣被訪問(wèn)的設(shè)備,由字符設(shè)備驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)這種特性。字符設(shè)備驅(qū)動(dòng)程序通常至少實(shí)現(xiàn)open,close,read和write系統(tǒng)調(diào)用。字符終端、串口、鼠標(biāo)、鍵盤(pán)、攝像頭、聲卡和顯卡等就是典型的字符設(shè)備。

塊設(shè)備:和字符設(shè)備類(lèi)似,塊設(shè)備也是通過(guò)/dev目錄下的文件系統(tǒng)節(jié)點(diǎn)來(lái)訪問(wèn)。塊設(shè)備上能夠容納文件系統(tǒng),如:u盤(pán),SD卡,磁盤(pán)等。

字符設(shè)備和塊設(shè)備的區(qū)別僅僅在于內(nèi)核內(nèi)部管理數(shù)據(jù)的方式,也就是內(nèi)核及驅(qū)動(dòng)程序之間的軟件接口,而這些不同對(duì)用戶(hù)來(lái)講是透明的。在內(nèi)核中,和字符驅(qū)動(dòng)程序相比,塊驅(qū)動(dòng)程序具有完全不同的接口。

查看驅(qū)動(dòng)模塊中打印信息應(yīng)該使用什么命令?如何查看內(nèi)核中已有的字符設(shè)備的信息?如何查看正在使用的有哪些中斷號(hào)?

  1. 查看驅(qū)動(dòng)模塊中打印信息的命令:dmesg
  2. 查看字符設(shè)備信息可以用lsmod 和modprobe,lsmod可以查看模塊的依賴(lài)關(guān)系,modprobe在加載模塊時(shí)會(huì)加載其他依賴(lài)的模塊。
  3. 顯示當(dāng)前使用的中斷號(hào)cat /proc/interrupt

Linux中引入模塊機(jī)制有什么好處?

首先,模塊是預(yù)先注冊(cè)自己以便服務(wù)于將來(lái)的某個(gè)請(qǐng)求,然后他的初始化函數(shù)就立即結(jié)束。換句話說(shuō),模塊初始化函數(shù)的任務(wù)就是為以后調(diào)用函數(shù)預(yù)先作準(zhǔn)備。

好處:

  1. 應(yīng)用程序在退出時(shí),可以不管資源的釋放或者其他的清除工作,但是模塊的退出函數(shù)卻必須仔細(xì)此撤銷(xiāo)初始化函數(shù)所作的一切。
  2. 該機(jī)制有助于縮短模塊的開(kāi)發(fā)周期。即:注冊(cè)和卸載都很靈活方便。

MMU的作用有( )?

[A] 內(nèi)存保護(hù)  
[B] 地址轉(zhuǎn)換
[C] 加快存取速度
[D] 安全保密
[E] 內(nèi)存分配
答案 : AB

以下屬于DMA特點(diǎn)的有( )

[A]占用CPU  
[B]占用總線
[C]不占用CPU
[D]不占用總線
答案: BC

FIQ的什么特點(diǎn)使得它處理的速度比IRQ快?

1)FIQ優(yōu)先級(jí)比IRQ高,不會(huì)被中斷
2)FIQ有自己的專(zhuān)屬寄存器:r8~r12,不用對(duì)通用寄存器入棧保護(hù),可以加快速度
3)FIQ位于異常向量表的末尾0x1c,故無(wú)需跳轉(zhuǎn),可以在這里直接放置異常處理函數(shù)

全局變量、局部變量、靜態(tài)全局變量、靜態(tài)局部變量的區(qū)別和引用方式?

初始化的全局變量在.data段,可以外部文本加extern引用;
未初始化的全局變量在.bss段,可以外部文本加extern引用;
靜態(tài)全局變量區(qū)別是不能在外部文件引用;
局部變量在運(yùn)行時(shí),棧區(qū)分配空間;
靜態(tài)局部變量在靜態(tài)區(qū)分配空間,函數(shù)調(diào)用后內(nèi)存不釋放;

內(nèi)存的分配方式有哪三種,請(qǐng)簡(jiǎn)單介紹一下。

內(nèi)存分配有三種:靜態(tài)存儲(chǔ)區(qū)、堆區(qū)和棧區(qū)。他們的功能不同,他們使用方式也就不同。

  1. 靜態(tài)存儲(chǔ)區(qū):內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。它主要存放靜態(tài)數(shù)據(jù)、全局?jǐn)?shù)據(jù)和常量。
  2. 棧區(qū):在執(zhí)行函數(shù)時(shí),函數(shù)(包括main函數(shù))內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。(任何變量都處于站區(qū),例如int a[] = {1, 2},變量a處于棧區(qū)。數(shù)組的內(nèi)容也存在于棧區(qū)。)
  3. 堆區(qū):亦稱(chēng)動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc或new申請(qǐng)任意大小的內(nèi)存,程序員自己負(fù)責(zé)在適當(dāng)?shù)臅r(shí)候用free或delete釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期可以由我們決定,如果我們不釋放內(nèi)存,程序?qū)⒃谧詈蟛裴尫诺魟?dòng)態(tài)內(nèi)存。 但是,良好的編程習(xí)慣是:如果某動(dòng)態(tài)內(nèi)存不再使用,需要將其釋放掉,并立即將指針置位NULL,防止產(chǎn)生野指針。

IRQ和FIQ有什么區(qū)別?

FIQ和IRQ是兩種不同類(lèi)型的中斷,ARM為了支持這兩種不同的中斷,提供了對(duì)應(yīng)的叫做FIQ和IRQ處理器模式(ARM有7種處理模式)。
1、FIQ比IRQ快;2、FIQ比IRQ有更高優(yōu)先級(jí);3、FIQ的入口地址是0x1c,IRQ的入口地址是0x18。

驅(qū)動(dòng)里面為什么要有并發(fā)、互斥的控制?如何實(shí)現(xiàn)?講個(gè)例子?

并發(fā)(concurrency)指的是多個(gè)執(zhí)行單元同時(shí)、并行被執(zhí)行,而并發(fā)的執(zhí)行單元對(duì) 共 享資源(硬件資源和軟件上的全局變量、靜態(tài)變量等)的訪問(wèn)則很容易導(dǎo)致競(jìng)態(tài)(race conditions) 。 解決競(jìng)態(tài)問(wèn)題的途徑是保證對(duì)共享資源的互斥訪問(wèn), 所謂互斥訪問(wèn)就是指一個(gè)執(zhí)行單 元 在訪問(wèn)共享資源的時(shí)候,其他的執(zhí)行單元都被禁止訪問(wèn)。 訪問(wèn)共享資源的代碼區(qū)域被稱(chēng)為臨界區(qū), 臨界區(qū)需要以某種互斥機(jī) 制加以保護(hù), 中斷屏蔽, 原子操作,自旋鎖,和信號(hào)量都是 linux 設(shè)備驅(qū)動(dòng)中可采用的互斥途徑。

什么是GPIO?

general purpose input/output
GPIO是相對(duì)于芯片本身而言的,如某個(gè)管腳是芯片的GPIO腳,則該腳可作為輸入或輸出高或低電平使用,當(dāng)然某個(gè)腳具有復(fù)用的功能,即可做GPIO也可做其他用途。 也就是說(shuō)你可以把這些引腳拿來(lái)用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來(lái)控制它的亮滅,也可以用一根(一些)引腳連到一個(gè)傳感器上以獲得該傳感器的狀態(tài),這給cpu提供了一個(gè)方便的控制周邊設(shè)備的途經(jīng)。如果沒(méi)有足夠多的gpio管腳,在控制一些外圍設(shè)備時(shí)就會(huì)力有不逮,這時(shí)可采取的方案是使用CPLD來(lái)幫助管理。

字符型驅(qū)動(dòng)設(shè)備怎么創(chuàng)建設(shè)備文件?

手動(dòng)創(chuàng)建:mknod /dev/led c 250 0 其中dev/led 為設(shè)備節(jié)點(diǎn) c 代表字符設(shè)備 250代表主設(shè)備號(hào) 0代表次設(shè)備號(hào)

還有UDEV/MDEV自動(dòng)創(chuàng)建設(shè)備文件的方式,UDEV/MDEV是運(yùn)行在用戶(hù)態(tài)的程序,可以動(dòng)態(tài)管理設(shè)備文件,包括創(chuàng)建和刪除設(shè)備文件,運(yùn)行在用戶(hù)態(tài)意味著系統(tǒng)要運(yùn)行之后。在 /etc/init.d/rcS 腳本文件中會(huì)執(zhí)行mdev -s 自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)。

寫(xiě)一個(gè)中斷服務(wù)需要注意哪些?如果中斷產(chǎn)生之后要做比較多的事情你是怎么做的?

中斷處理例程應(yīng)該盡量短,把能放在后半段(tasklet,等待隊(duì)列等)的任務(wù)盡量放在后半段。

寫(xiě)一個(gè)中斷服務(wù)程序要注意快進(jìn)快出,在中斷服務(wù)程序里面盡量快速采集信息,包括硬件信息,然后退出中斷,要做其它事情可以使用工作隊(duì)列或者tasklet方式。也就是中斷上半部和下半部。

第二:中斷服務(wù)程序中不能有阻塞操作。應(yīng)為中斷期間是完全占用CPU的(即不存在內(nèi)核調(diào)度),中斷被阻塞住,其他進(jìn)程將無(wú)法操作;

第三:中斷服務(wù)程序注意返回值,要用操作系統(tǒng)定義的宏做為返回值,而不是自己定義的OK,F(xiàn)AIL之類(lèi)的。

自旋鎖和信號(hào)量在互斥使用時(shí)需要注意哪些?在中斷服務(wù)程序里面的互斥是使用自旋鎖還是信號(hào)量?還是兩者都能用?為什么?

使用自旋鎖的進(jìn)程不能睡眠,使用信號(hào)量的進(jìn)程可以睡眠。

中斷服務(wù)例程中的互斥使用的是自旋鎖,原因是在中斷處理例程中,硬中斷是關(guān)閉的;但是要注意這樣會(huì)丟失可能到來(lái)的中斷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容