天天看點

2018年第一次嵌入式底層面試記錄

        面試某公司嵌入式底層,由于還在上班,是以是電話面試。原本以為會考很難的題目,但是問的都很基礎。有些自己明明懂的也蒙圈了,是以有必要做個記錄。

        1、自我介紹。

        答:-------------------

      2、請問uboot啟動過程都做了些什麼?

答:

     1、cpu剛開始初始化的時候,還未設定棧,是以先使用彙編代碼,建構異常項連結清單,然後設定cpu為svc(特權)模式,同時關閉FIQ和IRQ(防止突發中斷程式跑飛了)

     注:在跳轉到核心之前,要滿足CPU出在SVC模式下。 

     2、對cp15協處理器進行設定,這裡主要是關閉MMU和cache

     3、進入到闆級初始化階段,這裡會進行時鐘、記憶體、序列槽的初始化。最後還要關閉看門狗。

     4、接下來就是設定棧,為c語言準備運作環境,調用board_init_f,填充gd結構體。

     5、對代碼重定位,搬運到記憶體中去,搬運之後,跳轉到記憶體中去執行board_init_r,這裡就可以開啟cache了,當然也可以不開啟。然後初始化其他裝置。比如flash、網卡、emmc等。初始化完之後,在執行main_loop

3、為什麼uboot要關掉cache?

    答: 根據cache的定位可以看出來,它是用來加快cpu從記憶體中取出指令的速度,但我們都知道,在裝置上電之初,我們的記憶體初始化比較慢一拍,當cpu初始化了,但記憶體還沒準備好之後,就對記憶體進行資料讀,那麼勢必會造成了指令取址異常,系統就會挂了。是以,在u-boot的上電之初,就得關閉掉資料cache,指令的cache關閉與不關閉沒有太大的關系。

    注:Dcache隻能在MMU開啟之後使用,因為沒有MMU就沒法完成虛實位址映射,也就不能索引Dcache了。

4、nandflash和norflash的差別,對norflash的操作方式的了解

    答:兩種晶片的結構不同 NORflash之是以可以片内執行,就是因為他符合CPU去指令譯碼執行的要求。CPU送一個位址出來,NORflash就能給一個資料讓CPU執行,中間不需要額外的處理操作。    

       NAND flash不一樣是因為nandflash有位址,資料,指令共用IO口的問題,cpu把位址發出來之後,并不能直接得到資料,還需要控制線的操作才能完成。就是他沒有專用的SRAM接口。

        嵌入式系統中代碼的執行方式主要有3種:

        完全映射\按需分頁\eXecute In Place (XIP)片上執行。

 參考:http://blog.csdn.net/amberman/article/details/8122300

http://blog.csdn.net/qq_30866297/article/details/72622107

5、uboot怎麼傳參給核心的

答:

     簡單的講,uboot利用函數指針及傳參規範,它将

     R0: 0x0

     R1: 機器号

     R2: 參數位址

     三個參數傳遞給核心。

     其中,R2寄存器傳遞的是一個指針,這個指針指向一個TAG區域。

6、linux怎麼進行記憶體管理

      早期計算機中,由于應用程式比較小,可以直接在實體記憶體中運作,但現在計算機裡面程式那麼多又那麼大,是以就需要對記憶體進行管理。

      1、對記憶體的配置設定和管理,也就是平時應用層malloc和核心層vmalloc、kmalloc之類的記憶體申請的管理。

      2、虛拟記憶體和實體記憶體之間的轉換。

     參考:https://www.linuxidc.com/Linux/2016-01/127538.htm

     參考:http://blog.csdn.net/u013616945/article/details/77435607

     參考:https://www.jianshu.com/p/52df413f9e74

7、說說程序和線程的差別

    答:  簡單的來說,一個程式至少有一個程序,一個程序至少有一個線程。

       第一點、程序有自己的獨立位址空間,每啟動一個程序,系統就會為它配置設定位址空間,建立資料表來維護代碼段、堆棧段和資料段,這種操作非常昂貴。而線程是共享程序中的資料的,使用相同的位址空間,是以CPU切換一個線程的花費遠比程序要小很多,同時建立一個線程的開銷也比程序要小很多。

       但這樣帶來的缺點就是,多線程程式隻要有一個線程挂掉了,那麼整個程序也就挂掉了,而程序則不會影響另外一個程序,它有自己的獨立位址空間。

       第二點、線程之間的通信更友善,同一程序下的線程共享全局變量、靜态變量等資料,而程序之間的通信需要以通信的方式(IPC)進行。

8、程序間通信都有些什麼?

答:

     1、無名管道通信

      核心維護一塊記憶體,有讀端和寫端。隻能在具有親緣關系的程序間使用。程序的親緣關系通常是指父子程序關系。

     2、有名管道通信

      核心維護一塊記憶體,表現形式為一個有名字的檔案。傳輸方式:半雙工

     3、消息隊列通信

     4、信号量通信

     5、信号     信号量是一個計數器,可以用來控制多個程序對共享資源的通路。它常作為一種鎖機制,防止某程序正在通路共享資源時,其他程序也通路該資源。是以,主要作為程序間以及同一程序内不同線程之間的同步手段。

     6、共享記憶體通信

     7、套接字通信

      套接口也是一種程序間通信機制,與其他通信機制不同的是,它可用于不同機器間的程序通信。

 參考:http://blog.csdn.net/violet_echo_0908/article/details/51201278

9、在應用層調用一個read,是怎麼傳到核心中去的,流程是啥。

答:

     應用程式通過系統調用進入核心,然後

 (這個回答的比較亂。。。)

10、ext4的檔案系統單層目錄可以建立多少檔案?

答:

     按網上查資料來看:Ext3 目前隻支援 32,000 個子目錄,而 Ext4 本身支援無限數量的子目錄

     https://www.jianshu.com/p/b28ed82a56a6

11、建立一個檔案的時候,會建立一個怎麼樣的節點。

答:

     一個檔案被建立後至少要占用一個inode和一個block

12、程序有幾種狀态

     一般來說,程序有三個狀态,即就緒狀态,運作狀态,阻塞狀态

     總結:fork一個程序之後,程序加入隊列,處在就緒态,等待被調用,此時如果得到運作就進入運作态,這時如果遇到阻塞狀态就進入等待态等待再條件滿足後再次進入就緒态,如果運氣不好,在運作态時直接被結束了,就進入了僵屍态,如果被信号給終止了,就進入停止态。

13、對核心各種鎖的了解

 核心鎖

 1、原子操作(atomic):

 2、自旋鎖(spinlock/spinlock_irqsave):

 3、讀寫自旋鎖(rwlock):

 4、順序自旋鎖(seqlock):

 5、RCU(讀-拷貝-更新):

 6、信号量(semaphore):

 7、讀寫信号量:

 https://www.cnblogs.com/tolimit/p/4624070.html

 http://blog.csdn.net/FreeeLinux/article/details/54267446

 

繼續閱讀