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

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

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

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