|
面試某公司嵌入式底層,由于還在上班,所以是電話面試。原本以為會(huì)考很難的題目,但是問的都很基礎(chǔ)。有些自己明明懂的也蒙圈了,所以有必要做個(gè)記錄。
1、自我介紹。
答:-------------------
2、請(qǐng)問uboot啟動(dòng)過程都做了些什么?
答:
1、cpu剛開始初始化的時(shí)候,還未設(shè)置棧,所以先使用匯編代碼,構(gòu)建異常項(xiàng)鏈表,然后設(shè)置cpu為svc(特權(quán))模式,同時(shí)關(guān)閉FIQ和IRQ(防止突發(fā)中斷程序跑飛了)
注:在跳轉(zhuǎn)到內(nèi)核之前,要滿足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)閉看門狗。
4、接下來就是設(shè)置棧,為c語言準(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,這里就可以開啟cache了,當(dāng)然也可以不開啟。然后初始化其他設(shè)備。比如flash、網(wǎng)卡、emmc等。初始化完之后,在執(zhí)行main_loop
3、為什么uboot要關(guān)掉cache?
答: 根據(jù)cache的定位可以看出來,它是用來加快cpu從內(nèi)存中取出指令的速度,但我們都知道,在設(shè)備上電之初,我們的內(nèi)存初始化比較慢一拍,當(dāng)cpu初始化了,但內(nèi)存還沒準(zhǔn)備好之后,就對(duì)內(nèi)存進(jìn)行數(shù)據(jù)讀,那么勢必會(huì)造成了指令取址異常,系統(tǒng)就會(huì)掛了。所以,在u-boot的上電之初,就得關(guān)閉掉數(shù)據(jù)cache,指令的cache關(guān)閉與不關(guān)閉沒有太大的關(guān)系。
注:Dcache只能在MMU開啟之后使用,因?yàn)闆]有MMU就沒法完成虛實(shí)地址映射,也就不能索引Dcache了。
4、nandflash和norflash的區(qū)別,對(duì)norflash的操作方式的理解
答:兩種芯片的結(jié)構(gòu)不同 NORflash之所以可以片內(nèi)執(zhí)行,就是因?yàn)樗螩PU去指令譯碼執(zhí)行的要求。CPU送一個(gè)地址出來,NORflash就能給一個(gè)數(shù)據(jù)讓CPU執(zhí)行,中間不需要額外的處理操作。
NAND flash不一樣是因?yàn)閚andflash有地址,數(shù)據(jù),命令共用IO口的問題,cpu把地址發(fā)出來之后,并不能直接得到數(shù)據(jù),還需要控制線的操作才能完成。就是他沒有專用的SRAM接口。
嵌入式系統(tǒng)中代碼的執(zhí)行方式主要有3種:
完全映射\按需分頁\eXecute In Place (XIP)片上執(zhí)行。
5、uboot怎么傳參給內(nèi)核的
答: 簡單的講,uboot利用函數(shù)指針及傳參規(guī)范,它將
R0: 0x0
R1: 機(jī)器號(hào)
R2: 參數(shù)地址
三個(gè)參數(shù)傳遞給內(nèi)核。
其中,R2寄存器傳遞的是一個(gè)指針,這個(gè)指針指向一個(gè)TAG區(qū)域。
6、linux怎么進(jìn)行內(nèi)存管理
早期計(jì)算機(jī)中,由于應(yīng)用程序比較小,可以直接在物理內(nèi)存中運(yùn)行,但現(xiàn)在計(jì)算機(jī)里面程序那么多又那么大,所以就需要對(duì)內(nèi)存進(jìn)行管理。
1、對(duì)內(nèi)存的分配和管理,也就是平時(shí)應(yīng)用層malloc和內(nèi)核層vmalloc、kmalloc之類的內(nèi)存申請(qǐng)的管理。
2、虛擬內(nèi)存和物理內(nèi)存之間的轉(zhuǎn)換。
7、說說進(jìn)程和線程的區(qū)別
答: 簡單的來說,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。
第一點(diǎn)、進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程,系統(tǒng)就會(huì)為它分配地址空間,建立數(shù)據(jù)表來維護(hù)代碼段、堆棧段和數(shù)據(jù)段,這種操作非常昂貴。而線程是共享進(jìn)程中的數(shù)據(jù)的,使用相同的地址空間,因此CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多,同時(shí)創(chuàng)建一個(gè)線程的開銷也比進(jìn)程要小很多。
但這樣帶來的缺點(diǎn)就是,多線程程序只要有一個(gè)線程掛掉了,那么整個(gè)進(jìn)程也就掛掉了,而進(jìn)程則不會(huì)影響另外一個(gè)進(jìn)程,它有自己的獨(dú)立地址空間。
第二點(diǎn)、線程之間的通信更方便,同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行。
8、進(jìn)程間通信都有些什么?
答: 1、無名管道通信
內(nèi)核維護(hù)一塊內(nèi)存,有讀端和寫端。只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
2、有名管道通信
內(nèi)核維護(hù)一塊內(nèi)存,表現(xiàn)形式為一個(gè)有名字的文件。傳輸方式:半雙工
3、消息隊(duì)列通信
4、信號(hào)量通信
5、信號(hào) 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
6、共享內(nèi)存通信
7、套接字通信
套接口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信。
9、在應(yīng)用層調(diào)用一個(gè)read,是怎么傳到內(nèi)核中去的,流程是啥。
答: 應(yīng)用程序通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核,然后 (這個(gè)回答的比較亂。。。)
10、ext4的文件系統(tǒng)單層目錄可以創(chuàng)建多少文件?
答:按網(wǎng)上查資料來看:Ext3 目前只支持 32,000 個(gè)子目錄,而 Ext4 本身支持無限數(shù)量的子目錄
11、創(chuàng)建一個(gè)文件的時(shí)候,會(huì)創(chuàng)建一個(gè)怎么樣的節(jié)點(diǎn)。
答:一個(gè)文件被創(chuàng)建后至少要占用一個(gè)inode和一個(gè)block
12、進(jìn)程有幾種狀態(tài)
一般來說,進(jìn)程有三個(gè)狀態(tài),即就緒狀態(tài),運(yùn)行狀態(tài),阻塞狀態(tài)
總結(jié):fork一個(gè)進(jìn)程之后,進(jìn)程加入隊(duì)列,處在就緒態(tài),等待被調(diào)用,此時(shí)如果得到運(yùn)行就進(jìn)入運(yùn)行態(tài),這時(shí)如果遇到阻塞狀態(tài)就進(jìn)入等待態(tài)等待再條件滿足后再次進(jìn)入就緒態(tài),如果運(yùn)氣不好,在運(yùn)行態(tài)時(shí)直接被結(jié)束了,就進(jìn)入了僵尸態(tài),如果被信號(hào)給終止了,就進(jìn)入停止態(tài)。
13、對(duì)內(nèi)核各種鎖的了解
內(nèi)核鎖
1、原子操作(atomic):
2、自旋鎖(spinlock/spinlock_irqsave):
3、讀寫自旋鎖(rwlock):
4、順序自旋鎖(seqlock):
5、RCU(讀-拷貝-更新):
6、信號(hào)量(semaphore):
7、讀寫信號(hào)量:
信盈達(dá)免費(fèi)試聽C語言、電子、PCB、STM32、Linux、FPGA、Python等課程。
想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽課了。宋工Q35--24-65--90-88 Tel/WX:173--17--95--19--08
|
|