嵌入式筆試面試題目系列(四)
本系列將按照類別對(duì)題目進(jìn)行分類整理,重要的地方標(biāo)上星星,這樣有利于大家打下堅(jiān)實(shí)的基礎(chǔ)。
第五章Linux操作系統(tǒng)題目
1、 Linux內(nèi)核的組成部分
Linux內(nèi)核主要由五個(gè)子系統(tǒng)組成:進(jìn)程調(diào)度,內(nèi)存管理,虛擬文件系統(tǒng),網(wǎng)絡(luò)接口,進(jìn)程間通信。

2、Linux系統(tǒng)的組成部分
Linux系統(tǒng)一般有4個(gè)主要部分:
內(nèi)核、shell、文件系統(tǒng)和應(yīng)用程序。

3、用戶空間與內(nèi)核通信方式有哪些?
1)系統(tǒng)調(diào)用。用戶空間進(jìn)程通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核空間,訪問指定的內(nèi)核空間數(shù)據(jù);
2)驅(qū)動(dòng)程序。用戶空間進(jìn)程可以使用封裝后的系統(tǒng)調(diào)用接口訪問驅(qū)動(dòng)設(shè)備節(jié)點(diǎn),以和運(yùn)行在內(nèi)核空間的驅(qū)動(dòng)程序通信;
3)共享內(nèi)存mmap。在代碼中調(diào)用接口,實(shí)現(xiàn)內(nèi)核空間與用戶空間的地址映射,在實(shí)時(shí)性要求很高的項(xiàng)目中為首選,省去拷貝數(shù)據(jù)的時(shí)間等資源,但缺點(diǎn)是不好控制;
4)copy_to_user()、copy_from_user(),是在驅(qū)動(dòng)程序中調(diào)用接口,實(shí)現(xiàn)用戶空間與內(nèi)核空間的數(shù)據(jù)拷貝操作,應(yīng)用于實(shí)時(shí)性要求不高的項(xiàng)目中。
以及:
- procfs(/proc)
- sysctl (/proc/sys)
- sysfs(/sys)
- netlink 套接口
4、系統(tǒng)調(diào)用與普通函數(shù)調(diào)用的區(qū)別
系統(tǒng)調(diào)用:
1.使用INT和IRET指令,內(nèi)核和應(yīng)用程序使用的是不同的堆棧,因此存在堆棧的切換,從用戶態(tài)切換到內(nèi)核態(tài),從而可以使用特權(quán)指令操控設(shè)備
2.依賴于內(nèi)核,不保證移植性
3.在用戶空間和內(nèi)核上下文環(huán)境間切換,開銷較大
4.是操作系統(tǒng)的一個(gè)入口點(diǎn)
普通函數(shù)調(diào)用:
1.使用CALL和RET指令,調(diào)用時(shí)沒有堆棧切換
2.平臺(tái)移植性好
3.屬于過程調(diào)用,調(diào)用開銷較小
4.一個(gè)普通功能函數(shù)的調(diào)用
5、內(nèi)核態(tài),用戶態(tài)的區(qū)別
內(nèi)核態(tài),操作系統(tǒng)在內(nèi)核態(tài)運(yùn)行——運(yùn)行操作系統(tǒng)程序
用戶態(tài),應(yīng)用程序只能在用戶態(tài)運(yùn)行——運(yùn)行用戶程序
當(dāng)一個(gè)進(jìn)程在執(zhí)行用戶自己的代碼時(shí)處于用戶運(yùn)行態(tài)(用戶態(tài)),此時(shí)特權(quán)級(jí)最低,為3級(jí),是普通的用戶進(jìn)程運(yùn)行的特權(quán)級(jí),大部分用戶直接面對(duì)的程序都是運(yùn)行在用戶態(tài)。Ring3狀態(tài)不能訪問Ring0的地址空間,包括代碼和數(shù)據(jù);當(dāng)一個(gè)進(jìn)程因?yàn)橄到y(tǒng)調(diào)用陷入內(nèi)核代碼中執(zhí)行時(shí)處于內(nèi)核運(yùn)行態(tài)(內(nèi)核態(tài)),此時(shí)特權(quán)級(jí)最高,為0級(jí)。執(zhí)行的內(nèi)核代碼會(huì)使用當(dāng)前進(jìn)程的內(nèi)核棧,每個(gè)進(jìn)程都有自己的內(nèi)核棧。
6、 bootloader、內(nèi)核 、根文件的關(guān)系
啟動(dòng)順序:bootloader->linux kernel->rootfile->app
Bootloader全名為啟動(dòng)引導(dǎo)程序,是第一段代碼,它主要用來初始化處理器及外設(shè),然后調(diào)用Linux內(nèi)核。Linux內(nèi)核在完成系統(tǒng)的初始化之后需要掛載某個(gè)文件系統(tǒng)作為根文件系統(tǒng)(RootFilesystem),然后加載必要的內(nèi)核模塊,啟動(dòng)應(yīng)用程序。(一個(gè)嵌入式Linux系統(tǒng)從軟件角度看可以分為四個(gè)部分:引導(dǎo)加載程序(Bootloader),Linux內(nèi)核,文件系統(tǒng),應(yīng)用程序。)
7 、Bootloader啟動(dòng)的兩個(gè)階段:
Stage1:匯編語言
1)基本的硬件初始化(關(guān)閉看門狗和中斷,MMU(帶操作系統(tǒng)),CACHE。配置系統(tǒng)工作時(shí)鐘)
2)為加載stage2準(zhǔn)備RAM空間
3)拷貝內(nèi)核映像和文件系統(tǒng)映像到RAM中
4)設(shè)置堆棧指針sp
5)跳到stage2的入口點(diǎn)
Stage2:c語言
1)初始化本階段要使用到的硬件設(shè)備(led uart等)
2)檢測(cè)系統(tǒng)的內(nèi)存映射
3)加載內(nèi)核映像和文件系統(tǒng)映像
4)設(shè)置內(nèi)核的啟動(dòng)參數(shù)
嵌入式系統(tǒng)中廣泛采用的非易失性存儲(chǔ)器通常是Flash,而Bootloader就位于該存儲(chǔ)器的最前端,所以系統(tǒng)上電或復(fù)位后執(zhí)行的第一段程序便是Bootloader。
8、 linux下檢查內(nèi)存狀態(tài)的命令
- 1)查看進(jìn)程:top
- 2)查看內(nèi)存:free
- 3)cat /proc/meminfo
- 4)vmstat
假如一個(gè)公司服務(wù)器有很多用戶,你使用top命令,可以看到哪個(gè)同事在使用什么命令,做什么事情,占用了多少CPU。
9 、一個(gè)程序從開始運(yùn)行到結(jié)束的完整過程(四個(gè)過程)
預(yù)處理(Pre-Processing)、編譯(Compiling)、匯編(Assembling)、鏈接(Linking)
10、什么是堆,棧,內(nèi)存泄漏和內(nèi)存溢出?
棧由系統(tǒng)操作,程序員不可以操作。
所以內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序運(yùn)行期決定),使用完后必須顯式釋放的內(nèi)存。應(yīng)用程序一般使用malloc,new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負(fù)責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用。
內(nèi)存溢出:你要求分配的內(nèi)存超出了系統(tǒng)能給你的,系統(tǒng)不能滿足需求,于是產(chǎn)生溢出。
內(nèi)存越界:向系統(tǒng)申請(qǐng)了一塊內(nèi)存,而在使用內(nèi)存時(shí),超出了申請(qǐng)的范圍(常見的有使用特定大小數(shù)組時(shí)發(fā)生內(nèi)存越界)
內(nèi)存溢出問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查數(shù)組邊界,又不檢查類型可靠性(type-safety)。眾所周知,用 C/C++ 語言開發(fā)的程序由于目標(biāo)代碼非常接近機(jī)器內(nèi)核,因而能夠直接訪問內(nèi)存和寄存器,這種特性大大提升了 C/C++ 語言代碼的性能。只要合理編碼,C/C++ 應(yīng)用程序在執(zhí)行效率上必然優(yōu)于其它高級(jí)語言。然而,C/C++ 語言導(dǎo)致內(nèi)存溢出問題的可能性也要大許多。
11、死鎖的原因、條件
產(chǎn)生死鎖的原因主要是:
(1) 因?yàn)橄到y(tǒng)資源不足。
(2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適。
(3) 資源分配不當(dāng)?shù)取?/p>
如果系統(tǒng)資源充足,進(jìn)程的資源請(qǐng)求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則就會(huì)因爭(zhēng)奪有限的資源而陷入死鎖。其次,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖
這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。
(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。
(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
12、硬鏈接與軟鏈接
鏈接操作實(shí)際上是給系統(tǒng)中已有的某個(gè)文件指定另外一個(gè)可用于訪問它的名稱。對(duì)于這個(gè)新的文件名,我們可以為之指定不同的訪問權(quán)限,以控制對(duì)信息的共享和安全性的問題。如果鏈接指向目錄,用戶就可以利用該鏈接直接進(jìn)入被鏈接的目錄而不用打一大堆的路徑名。而且,即使我們刪除這個(gè)鏈接,也不會(huì)破壞原來的目錄。
1>硬鏈接
硬鏈接只能引用同一文件系統(tǒng)中的文件。它引用的是文件在文件系統(tǒng)中的物理索引(也稱為inode)。當(dāng)您移動(dòng)或刪除原始文件時(shí),硬鏈接不會(huì)被破壞,因?yàn)樗玫氖俏募奈锢頂?shù)據(jù)而不是文件在文件結(jié)構(gòu)中的位置。硬鏈接的文件不需要用戶有訪問原始文件的權(quán)限,也不會(huì)顯示原始文件的位置,這樣有助于文件的安全。如果您刪除的文件有相應(yīng)的硬鏈接,那么這個(gè)文件依然會(huì)保留,直到所有對(duì)它的引用都被刪除。
2>軟鏈接(符號(hào)鏈接)
軟連接,其實(shí)就是新建立一個(gè)文件,這個(gè)文件就是專門用來指向別的文件的(那就和windows 下的快捷方式的那個(gè)文件有很接近的意味)。軟連接產(chǎn)生的是一個(gè)新的文件,但這個(gè)文件的作用就是專門指向某個(gè)文件的,刪了這個(gè)軟連接文件,那就等于不需要這個(gè)連接,和原來的存在的實(shí)體原文件沒有任何關(guān)系,但刪除原來的文件,則相應(yīng)的軟連接不可用。
13、計(jì)算機(jī)中,32bit與64bit有什么區(qū)別
64bit計(jì)算主要有兩大優(yōu)點(diǎn):可以進(jìn)行更大范圍的整數(shù)運(yùn)算;可以支持更大的內(nèi)存。
64位操作系統(tǒng)下的虛擬內(nèi)存空間大?。旱刂房臻g大小不是2^32,也不是2^64,而一般是2^48。因?yàn)椴⒉恍枰?^64那么大的尋址空間,過大的空間只會(huì)造成資源的浪費(fèi)。所以64位Linux一般使用48位表示虛擬空間地址,40位標(biāo)識(shí)物理地址。
14、中斷和異常的區(qū)別
內(nèi)中斷:同步中斷(異常)是由cpu內(nèi)部的電信號(hào)產(chǎn)生的中斷,其特點(diǎn)為當(dāng)前執(zhí)行的指令結(jié)束后才轉(zhuǎn)而產(chǎn)生中斷,由于有cpu主動(dòng)產(chǎn)生,其執(zhí)行點(diǎn)必然是可控的。
外中斷:異步中斷是由cpu的外設(shè)產(chǎn)生的電信號(hào)引起的中斷,其發(fā)生的時(shí)間點(diǎn)不可預(yù)期。
15、中斷怎么發(fā)生,中斷處理流程
請(qǐng)求中斷→響應(yīng)中斷→關(guān)閉中斷→保留斷點(diǎn)→中斷源識(shí)別→保護(hù)現(xiàn)場(chǎng)→中斷服務(wù)子程序→恢復(fù)現(xiàn)場(chǎng)→中斷返回。

16、 Linux 操作系統(tǒng)掛起、休眠、關(guān)機(jī)相關(guān)命令
關(guān)機(jī)命令有halt, init 0, poweroff ,shutdown -h 時(shí)間,其中shutdown是最安全的
重啟命令有reboot,init 6,,shutdow -r時(shí)間
在linux命令中reboot是重新啟動(dòng),shutdown -r now是立即停止然后重新啟動(dòng)
具體可用參數(shù)可以百度。
17、說一個(gè)linux下編譯優(yōu)化選項(xiàng):
加:-o
18、在有數(shù)據(jù)cache情況下,DMA數(shù)據(jù)鏈路為:
外設(shè)-DMA-DDR-cache-CPU
19、linux命令
1、改變文件屬性的命令:chmod (chmod 777 /etc/squid 運(yùn)行命令后,squid文件夾(目錄)的權(quán)限就被修改為777(可讀可寫可執(zhí)行))
2、查找文件中匹配字符串的命令:grep
3、查找當(dāng)前目錄:pwd
4、刪除目錄:rm -rf 目錄名
5、刪除文件:rm 文件名
6、創(chuàng)建目錄(文件夾):mkdir
7、創(chuàng)建文件:touch
8、vi和vim 文件名也可以創(chuàng)建
9、查看進(jìn)程對(duì)應(yīng)的端口號(hào)
- 1、先查看進(jìn)程pid
- ps -ef | grep 進(jìn)程名
- 2、通過pid查看占用端口
- netstat -nap | grep 進(jìn)程pid
20、硬實(shí)時(shí)系統(tǒng)和軟實(shí)時(shí)系統(tǒng)
軟實(shí)時(shí)系統(tǒng):
Windows、Linux系統(tǒng)通常為軟實(shí)時(shí),當(dāng)然有補(bǔ)丁可以將內(nèi)核做成硬實(shí)時(shí)的系統(tǒng),不過商用沒有這么做的。
硬實(shí)時(shí)系統(tǒng):
對(duì)時(shí)間要求很高,限定時(shí)間內(nèi)不管做沒做完必須返回。
VxWorks,uCOS,F(xiàn)reeRTOS,WinCE,RT-thread等實(shí)時(shí)系統(tǒng);
21、MMU基礎(chǔ)
現(xiàn)代操作系統(tǒng)普遍采用虛擬內(nèi)存管理(Virtual Memory Management) 機(jī)制,這需要MMU( Memory Management Unit,內(nèi)存管理單元) 的支持。有些嵌入式處理器沒有MMU,則不能運(yùn)行依賴于虛擬內(nèi)存管理的操作系統(tǒng)。
也就是說:操作系統(tǒng)可以分成兩類,用MMU的、不用MMU的。
用MMU的是:Windows、MacOS、Linux、Android;不用MMU的是:FreeRTOS、VxWorks、UCOS……
與此相對(duì)應(yīng)的:CPU也可以分成兩類,帶MMU的、不帶MMU的。
帶MMU的是:Cortex-A系列、ARM9、ARM11系列;
不帶MMU的是:Cortex-M系列……(STM32是M系列,沒有MMU,不能運(yùn)行Linux,只能運(yùn)行一些UCOS、FreeRTOS等等)。
MMU就是負(fù)責(zé)虛擬地址(virtual address)轉(zhuǎn)化成物理地址(physical address),轉(zhuǎn)換過程比較復(fù)雜,可以自行百度。