嵌入式面試高頻(實(shí)戰(zhàn)場景2)
此部分不只包含面經(jīng)內(nèi)容,均是實(shí)戰(zhàn)類型不必全文背誦,有思路即可
后續(xù)收錄于專欄:嵌入式/C++面試八股文
實(shí)戰(zhàn)場景2
1 linux中內(nèi)核空間及用戶空間的區(qū)別?用戶空間與內(nèi)核通信方式有哪些??????
Linux 中內(nèi)核空間和用戶空間存在多方面區(qū)別,用戶空間與內(nèi)核的通信方式也多種多樣,具體如下:
內(nèi)核空間與用戶空間的區(qū)別
- 權(quán)限級別:內(nèi)核空間具有最高權(quán)限,能訪問所有硬件資源和執(zhí)行特權(quán)指令。用戶空間權(quán)限較低,只能訪問受限的資源,以防止用戶程序破壞系統(tǒng)
- 功能職責(zé):內(nèi)核空間負(fù)責(zé)管理硬件、調(diào)度進(jìn)程、分配內(nèi)存等核心任務(wù)。用戶空間用于運(yùn)行用戶程序和應(yīng)用,通過系統(tǒng)調(diào)用請求內(nèi)核服務(wù)。
- 內(nèi)存布局:內(nèi)核空間占用特定的內(nèi)存區(qū)域,有自己的內(nèi)存管理機(jī)制,存儲(chǔ)內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)。用戶空間的每個(gè)進(jìn)程都有獨(dú)立的虛擬地址空間,包含代碼、數(shù)據(jù)、堆、棧等區(qū)域。
用戶空間與內(nèi)核的通信方式
- 系統(tǒng)調(diào)用:用戶程序通過系統(tǒng)調(diào)用接口進(jìn)入內(nèi)核空間,請求內(nèi)核提供服務(wù),如文件讀寫、進(jìn)程創(chuàng)建等。
- 信號:內(nèi)核可以向用戶進(jìn)程發(fā)送信號,通知進(jìn)程發(fā)生了特定事件,如進(jìn)程終止、定時(shí)器到期等,用戶進(jìn)程可以通過信號處理函數(shù)來響應(yīng)信號。
- 共享內(nèi)存:內(nèi)核和用戶空間可以通過共享內(nèi)存區(qū)域進(jìn)行數(shù)據(jù)交互,需要使用同步機(jī)制來確保數(shù)據(jù)的一致性和完整性。
- 管道和消息隊(duì)列:管道用于具有親緣關(guān)系的進(jìn)程間通信,消息隊(duì)列可用于不同進(jìn)程間按消息進(jìn)行數(shù)據(jù)傳遞,內(nèi)核在其中負(fù)責(zé)管理和維護(hù)通信機(jī)制。
2 字符設(shè)備和塊設(shè)備的區(qū)別,請分別列舉一些實(shí)際的設(shè)備說出它們是屬于哪一類設(shè)備????
區(qū)別
數(shù)據(jù)傳輸方式
- 字符設(shè)備:以字符為單位進(jìn)行數(shù)據(jù)傳輸,數(shù)據(jù)的讀寫是按順序逐個(gè)字符進(jìn)行的,通常不支持隨機(jī)訪問。
- 塊設(shè)備:以數(shù)據(jù)塊為單位進(jìn)行數(shù)據(jù)傳輸,支持隨機(jī)訪問,可以直接訪問設(shè)備上的任意數(shù)據(jù)塊。
訪問速度
- 字符設(shè)備:訪問速度相對較慢,常用于低速的、對數(shù)據(jù)傳輸實(shí)時(shí)性要求不高的場景。
- 塊設(shè)備:訪問速度相對較快,適合大量數(shù)據(jù)的快速讀寫操作。
數(shù)據(jù)緩存
- 字符設(shè)備:一般不使用緩存或者只有很小的緩存,因?yàn)槠鋽?shù)據(jù)傳輸通常是實(shí)時(shí)的、順序的。
- 塊設(shè)備:通常有較大的緩存,以提高數(shù)據(jù)的讀寫性能,減少對物理設(shè)備的訪問次數(shù)。
常見設(shè)備舉例
- 字符設(shè)備:鍵盤、鼠標(biāo)、串口設(shè)備、打印機(jī)等。例如鍵盤,用戶按下按鍵時(shí),字符會(huì)逐個(gè)被系統(tǒng)接收,系統(tǒng)按字符流的方式處理輸入信息。
- 塊設(shè)備:硬盤、固態(tài)硬盤、U 盤、光盤等。以硬盤為例,操作系統(tǒng)可以直接讀取或?qū)懭胗脖P上的任意一個(gè)數(shù)據(jù)塊,實(shí)現(xiàn)快速的數(shù)據(jù)存儲(chǔ)和檢索。
3 linux中系統(tǒng)調(diào)用過程?如應(yīng)用程序中read()在linux中執(zhí)行過程即從用戶空間到內(nèi)核空間?????
Linux 中系統(tǒng)調(diào)用read()的執(zhí)行過程,即從用戶空間到內(nèi)核空間的過程如下:
- 用戶空間發(fā)起調(diào)用:應(yīng)用程序在用戶空間中執(zhí)行到read()函數(shù)時(shí),會(huì)將所需的參數(shù)(如文件描述符、緩沖區(qū)指針、讀取字節(jié)數(shù)等)按照規(guī)定的調(diào)用約定放入寄存器或棧中,準(zhǔn)備發(fā)起系統(tǒng)調(diào)用。
- 陷入內(nèi)核:通過執(zhí)行特定的指令(如 x86 架構(gòu)中的int 0x80或sysenter指令),產(chǎn)生一個(gè)軟件中斷,使 CPU 從用戶態(tài)切換到內(nèi)核態(tài),程序的執(zhí)行流跳轉(zhuǎn)到內(nèi)核中系統(tǒng)調(diào)用的入口點(diǎn)。
- 內(nèi)核處理:內(nèi)核根據(jù)系統(tǒng)調(diào)用號(read()有對應(yīng)的系統(tǒng)調(diào)用號)在系統(tǒng)調(diào)用表中找到read()對應(yīng)的內(nèi)核函數(shù)sys_read(),并開始執(zhí)行。sys_read()會(huì)對文件描述符進(jìn)行合法性檢查等操作,然后根據(jù)文件類型等調(diào)用相應(yīng)的驅(qū)動(dòng)程序的讀函數(shù)從設(shè)備或文件中讀取數(shù)據(jù)到指定的緩沖區(qū)。
- 返回用戶空間:數(shù)據(jù)讀取完成后,內(nèi)核將讀取到的字節(jié)數(shù)等結(jié)果放入指定的寄存器中,通過執(zhí)行特定指令完成從內(nèi)核態(tài)到用戶態(tài)的切換,將控制權(quán)交還給應(yīng)用程序,應(yīng)用程序繼續(xù)執(zhí)行read()調(diào)用后的代碼,使用讀取到的數(shù)據(jù)。
4 查看驅(qū)動(dòng)模塊中打印信息應(yīng)該使用什么命令?如何查看內(nèi)核中已有的字符設(shè)備的信息?如何查看正在使用的有哪些中斷號????
查看驅(qū)動(dòng)模塊打印信息
- 可使用dmesg命令,它能顯示內(nèi)核環(huán)形緩沖區(qū)的信息,驅(qū)動(dòng)模塊加載、運(yùn)行時(shí)打印的信息會(huì)記錄在內(nèi)核日志里,執(zhí)行dmesg即可查看。若想查看最新信息,可加-T參數(shù)顯示時(shí)間戳,用-H以人類可讀格式輸出。
查看內(nèi)核中已有字符設(shè)備信息
- 使用cat /proc/devices命令,它會(huì)列出內(nèi)核中已注冊的字符設(shè)備和塊設(shè)備及其對應(yīng)的主設(shè)備號。字符設(shè)備部分能看到設(shè)備名和主設(shè)備號,便于了解系統(tǒng)里字符設(shè)備的注冊情況。
查看正在使用的中斷號
- 用cat /proc/interrupts命令,該文件記錄了系統(tǒng)中每個(gè)中斷號對應(yīng)的使用情況,包括中斷類型、使用該中斷的設(shè)備等信息,能清晰了解哪些中斷號正在被使用。
5 copy_to_user()和copy_from_user()主要用于實(shí)現(xiàn)什么功能?一般用于file_operations結(jié)構(gòu)的哪些函數(shù)里面?????
主要功能
- copy_to_user():用于將內(nèi)核空間的數(shù)據(jù)復(fù)制到用戶空間。通常在需要向用戶程序返回?cái)?shù)據(jù)時(shí)使用,比如內(nèi)核完成某個(gè)操作后,將結(jié)果數(shù)據(jù)通過copy_to_user()復(fù)制到用戶指定的緩沖區(qū)中,以便用戶程序能夠訪問這些數(shù)據(jù)。
- copy_from_user():作用是將用戶空間的數(shù)據(jù)復(fù)制到內(nèi)核空間。當(dāng)用戶程序向內(nèi)核傳遞參數(shù)或數(shù)據(jù)時(shí),內(nèi)核需要使用copy_from_user()來獲取用戶空間的數(shù)據(jù),例如用戶程序通過系統(tǒng)調(diào)用向設(shè)備驅(qū)動(dòng)傳遞配置信息等。
在 file_operations 結(jié)構(gòu)中的應(yīng)用
file_operations是 Linux 內(nèi)核中用于描述文件操作的結(jié)構(gòu)體,copy_to_user()和copy_from_user()一般用于以下函數(shù):
- read():從設(shè)備或文件讀取數(shù)據(jù)到用戶空間時(shí),內(nèi)核先從設(shè)備讀取數(shù)據(jù)到內(nèi)核空間緩沖區(qū),再通過copy_to_user()將數(shù)據(jù)從內(nèi)核空間緩沖區(qū)復(fù)制到用戶提供的緩沖區(qū)。
- write():用戶程序向設(shè)備或文件寫入數(shù)據(jù)時(shí),copy_from_user()會(huì)將用戶空間緩沖區(qū)中的數(shù)據(jù)復(fù)制到內(nèi)核空間,然后內(nèi)核再將數(shù)據(jù)寫入設(shè)備或文件。
- ioctl():在執(zhí)行一些自定義的控制操作時(shí),可能需要從用戶空間獲取參數(shù)或者向用戶空間返回結(jié)果,此時(shí)也會(huì)用到copy_from_user()和copy_to_user()來進(jìn)行數(shù)據(jù)的傳遞。
6 設(shè)備驅(qū)動(dòng)程序中如何注冊一個(gè)字符設(shè)備?分別解釋一下它的幾個(gè)參數(shù)的含義。????
在 Linux 設(shè)備驅(qū)動(dòng)里注冊字符設(shè)備,可按以下步驟:
- 分配設(shè)備號:用alloc_chrdev_region動(dòng)態(tài)分配,或register_chrdev_region靜態(tài)分配。alloc_chrdev_region(dev, baseminor, count, name)中,dev存儲(chǔ)分配到的設(shè)備號;baseminor是起始次設(shè)備號;count是要分配的次設(shè)備號數(shù)量;name是設(shè)備名。
- 初始化 cdev 結(jié)構(gòu)體:用cdev_init關(guān)聯(lián)設(shè)備操作函數(shù)。cdev_init(cdev, fops)里,cdev是struct cdev類型指針,代表字符設(shè)備;fops指向file_operations結(jié)構(gòu)體,含設(shè)備操作函數(shù)。
- 添加字符設(shè)備:使用cdev_add把cdev添加到內(nèi)核。cdev_add(cdev, dev, count)中,cdev為要添加的字符設(shè)備;dev是設(shè)備號;count是設(shè)備數(shù)量。
- 最后在驅(qū)動(dòng)卸載時(shí),用cdev_del移除cdev,unregister_chrdev_region釋放設(shè)備號。
7 字符型驅(qū)動(dòng)設(shè)備怎么創(chuàng)建設(shè)備文件????
在 Linux 中,為字符型驅(qū)動(dòng)設(shè)備創(chuàng)建設(shè)備文件通常有手動(dòng)和自動(dòng)兩種方式:
手動(dòng)創(chuàng)建設(shè)備文件
- 使用mknod命令,其基本格式為mknod [設(shè)備文件名] c [主設(shè)備號] [次設(shè)備號]。例如,若主設(shè)備號為 200,次設(shè)備號為 0,要?jiǎng)?chuàng)建名為mychar的設(shè)備文件,可執(zhí)行mknod /
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
#承諾提供免費(fèi)技術(shù)答疑# 本專欄主要是介紹嵌入式開發(fā)崗位相關(guān)知識和學(xué)習(xí)攻略。“C/C++軟件開發(fā)崗位”也可以參考。 該專欄覆蓋了嵌入式求職過程中99%常見面試題,詳細(xì)講解了嵌入式軟件開發(fā)崗位、學(xué)習(xí)攻略、項(xiàng)目經(jīng)驗(yàn)分享、面試心得,從技術(shù)面,HR面,主管面,談薪一站式服務(wù)。訂閱即贈(zèng)送簡歷模板、內(nèi)推機(jī)會(huì),需要的同學(xué)點(diǎn)擊我頭像私信即可!