芯動(dòng)科技
一面
自我介紹然后簡(jiǎn)歷上寫(xiě)了用過(guò)gdb和git隨口問(wèn)了我?guī)讉€(gè)gdb和git的用法。
然后是提問(wèn)
Q1:Arm匯編中bl的意思
A:抱歉,arm匯編我沒(méi)深入研究過(guò),我用的平臺(tái)指令集是TI自研的,但我研究過(guò)X86的匯編我推測(cè)一下。B是跳轉(zhuǎn)的意思,bl的意思可能是小于跳轉(zhuǎn)等于X86匯編的jl,可也能是類(lèi)似x86的long jump。
這個(gè)題答案是小于跳轉(zhuǎn),沒(méi)答出來(lái)但是面試官說(shuō)還可以。
Q2:static 修飾的C語(yǔ)言變量存放在哪里,有什么作用
A:存放在data段,不會(huì)被重復(fù)初始化。
Q3:C語(yǔ)言變量有幾種儲(chǔ)存方式
A:存放在stack data heap bss
Q4:變量未初始化值是多少
A:stack是垃圾值,不確定,全局變量未初始化是0.
Q5: 什么是野指針
A:我認(rèn)為是存放了一個(gè)不應(yīng)該訪問(wèn)地址的指針,比如free之后的指針再次訪問(wèn),訪問(wèn)了一個(gè)未進(jìn)行初始化的指針,訪問(wèn)了一個(gè)函數(shù)返回的指向局部變量的指針。
Q6:外設(shè)和處理器交互的方式
A:中斷,DMA,普遍嵌入式設(shè)備的外設(shè)會(huì)被映射到地址空間中,所以可以直接通過(guò)讀寫(xiě)被映射的地址進(jìn)行交互。
Q7:使用gcc編譯一個(gè)hello.c的程序使用什么指令
A:gcc hello.c -o hello.out
反問(wèn)環(huán)節(jié):
Q:工作中會(huì)比較多的使用gdb嗎?
A:調(diào)試會(huì)用到,看你寫(xiě)了所以問(wèn)你一下
Q:還有有幾輪面試
A:一般就兩輪,特別優(yōu)秀的三輪。
二面
自我介紹然后:
Q1:看你簡(jiǎn)歷上寫(xiě)了使用fft進(jìn)行信號(hào)處理,講講吧
A:我們控制這邊是用來(lái)獲取對(duì)象的頻率響應(yīng)特性的,就是使用頻率成分豐富的信號(hào)作為被控對(duì)象的輸入然后獲取被控對(duì)象的輸出,對(duì)輸入輸出信號(hào)做fft分析。
Q2:在線還是離線
A:離線
Q3 簡(jiǎn)歷上寫(xiě)了解決了cache一致性維護(hù)講講這個(gè)
A:實(shí)驗(yàn)室用的DSP是八核的一款DSP,測(cè)試讀寫(xiě)的時(shí)候發(fā)現(xiàn)自讀自寫(xiě)沒(méi)有問(wèn)題,但是0核寫(xiě)1核讀讀取不到正確的數(shù)據(jù),查閱芯片手冊(cè)發(fā)現(xiàn)可能是cache的原因,寫(xiě)沒(méi)有寫(xiě)入下一級(jí)的內(nèi)存,讀沒(méi)有無(wú)效化cache。
去論壇看了一下相關(guān)的帖子,然后解決了這個(gè)問(wèn)題。主要通過(guò)官方提供的兩條指令cache_invalid cache_writeback。
讀的核需要無(wú)效化cache,寫(xiě)的核需要writeback寫(xiě)到下一級(jí)。
Q4:你還寫(xiě)了解決了多核同步問(wèn)題,怎么解決的
A:我用的芯片沒(méi)有像X86提供原子指令,轉(zhuǎn)而提供了一種原子外設(shè),官方叫做硬件信號(hào)量,訪問(wèn)這個(gè)外設(shè)的時(shí)候是原子的,我模擬實(shí)現(xiàn)了一把spinlock 訪問(wèn)臨界區(qū)的時(shí)候上鎖。
Q5:了解linux嗎
A:了解,增加模仿linux寫(xiě)過(guò)一個(gè)簡(jiǎn)易版本的操作系統(tǒng)內(nèi)核。
Q6:我看你簡(jiǎn)歷上沒(méi)寫(xiě)啊,講講你這個(gè)內(nèi)核吧,跑在什么平臺(tái)上的,都實(shí)現(xiàn)了什么功能
A:跑在i386平臺(tái),用qemu模擬器模擬的。可以實(shí)現(xiàn)內(nèi)存管理、進(jìn)程創(chuàng)建、Sytemcall、進(jìn)程調(diào)度還有一個(gè)簡(jiǎn)易版本的內(nèi)核調(diào)度
Q7:從Boot開(kāi)始吧,講講你的內(nèi)核啟動(dòng)過(guò)程和你實(shí)現(xiàn)的功能。
A:i386自導(dǎo)bios在啟動(dòng)之后會(huì)從0x7c80讀取第一條指令執(zhí)行,所以內(nèi)核需要使用鏈接器來(lái)修改鏡像的地址。
啟動(dòng)后會(huì)跳轉(zhuǎn)到鏡像entry處的地址,這是一個(gè)初始化函數(shù),首先會(huì)進(jìn)行內(nèi)存的初始化,探測(cè)剩余的內(nèi)存大小,申請(qǐng)一塊地址作為page directory,然后對(duì)剩余內(nèi)存按照4kb進(jìn)行分割,使用鏈表連接,實(shí)現(xiàn)內(nèi)存池。
需要時(shí)向內(nèi)核申請(qǐng)。我的進(jìn)程創(chuàng)建時(shí)模仿linux fork實(shí)現(xiàn)的,利用的是寫(xiě)時(shí)拷貝技術(shù),只創(chuàng)建一個(gè)新的棧,拷貝父進(jìn)程的page directory的映射,但是標(biāo)記頁(yè)表為只讀不寫(xiě),如果寫(xiě)會(huì)觸發(fā)缺頁(yè)中斷,然后進(jìn)行相應(yīng)的拷貝。
調(diào)度是就是在可以準(zhǔn)備運(yùn)行的進(jìn)程中挑選一個(gè)可以準(zhǔn)備運(yùn)行的進(jìn)程,簡(jiǎn)單的round-robin算法,后來(lái)加入了優(yōu)先級(jí)調(diào)度,利用hash-map尋找優(yōu)先級(jí)最高的進(jìn)程。
Q8:在內(nèi)存初始化中,怎么探測(cè)剩余內(nèi)存的。
A:鏡像在bss段的最后會(huì)創(chuàng)建的一個(gè)標(biāo)記叫做end,可以探測(cè)一個(gè)cmos管知道總共的內(nèi)存大小,可以間接知道剩余內(nèi)存的大小。
答案附在面經(jīng)中
自我介紹然后簡(jiǎn)歷上寫(xiě)了用過(guò)gdb和git隨口問(wèn)了我?guī)讉€(gè)gdb和git的用法。
然后是提問(wèn)
Q1:Arm匯編中bl的意思
A:抱歉,arm匯編我沒(méi)深入研究過(guò),我用的平臺(tái)指令集是TI自研的,但我研究過(guò)X86的匯編我推測(cè)一下。B是跳轉(zhuǎn)的意思,bl的意思可能是小于跳轉(zhuǎn)等于X86匯編的jl,可也能是類(lèi)似x86的long jump。
這個(gè)題答案是小于跳轉(zhuǎn),沒(méi)答出來(lái)但是面試官說(shuō)還可以。
Q2:static 修飾的C語(yǔ)言變量存放在哪里,有什么作用
A:存放在data段,不會(huì)被重復(fù)初始化。
Q3:C語(yǔ)言變量有幾種儲(chǔ)存方式
A:存放在stack data heap bss
Q4:變量未初始化值是多少
A:stack是垃圾值,不確定,全局變量未初始化是0.
Q5: 什么是野指針
A:我認(rèn)為是存放了一個(gè)不應(yīng)該訪問(wèn)地址的指針,比如free之后的指針再次訪問(wèn),訪問(wèn)了一個(gè)未進(jìn)行初始化的指針,訪問(wèn)了一個(gè)函數(shù)返回的指向局部變量的指針。
Q6:外設(shè)和處理器交互的方式
A:中斷,DMA,普遍嵌入式設(shè)備的外設(shè)會(huì)被映射到地址空間中,所以可以直接通過(guò)讀寫(xiě)被映射的地址進(jìn)行交互。
Q7:使用gcc編譯一個(gè)hello.c的程序使用什么指令
A:gcc hello.c -o hello.out
反問(wèn)環(huán)節(jié):
Q:工作中會(huì)比較多的使用gdb嗎?
A:調(diào)試會(huì)用到,看你寫(xiě)了所以問(wèn)你一下
Q:還有有幾輪面試
A:一般就兩輪,特別優(yōu)秀的三輪。
二面
自我介紹然后:
Q1:看你簡(jiǎn)歷上寫(xiě)了使用fft進(jìn)行信號(hào)處理,講講吧
A:我們控制這邊是用來(lái)獲取對(duì)象的頻率響應(yīng)特性的,就是使用頻率成分豐富的信號(hào)作為被控對(duì)象的輸入然后獲取被控對(duì)象的輸出,對(duì)輸入輸出信號(hào)做fft分析。
Q2:在線還是離線
A:離線
Q3 簡(jiǎn)歷上寫(xiě)了解決了cache一致性維護(hù)講講這個(gè)
A:實(shí)驗(yàn)室用的DSP是八核的一款DSP,測(cè)試讀寫(xiě)的時(shí)候發(fā)現(xiàn)自讀自寫(xiě)沒(méi)有問(wèn)題,但是0核寫(xiě)1核讀讀取不到正確的數(shù)據(jù),查閱芯片手冊(cè)發(fā)現(xiàn)可能是cache的原因,寫(xiě)沒(méi)有寫(xiě)入下一級(jí)的內(nèi)存,讀沒(méi)有無(wú)效化cache。
去論壇看了一下相關(guān)的帖子,然后解決了這個(gè)問(wèn)題。主要通過(guò)官方提供的兩條指令cache_invalid cache_writeback。
讀的核需要無(wú)效化cache,寫(xiě)的核需要writeback寫(xiě)到下一級(jí)。
Q4:你還寫(xiě)了解決了多核同步問(wèn)題,怎么解決的
A:我用的芯片沒(méi)有像X86提供原子指令,轉(zhuǎn)而提供了一種原子外設(shè),官方叫做硬件信號(hào)量,訪問(wèn)這個(gè)外設(shè)的時(shí)候是原子的,我模擬實(shí)現(xiàn)了一把spinlock 訪問(wèn)臨界區(qū)的時(shí)候上鎖。
Q5:了解linux嗎
A:了解,增加模仿linux寫(xiě)過(guò)一個(gè)簡(jiǎn)易版本的操作系統(tǒng)內(nèi)核。
Q6:我看你簡(jiǎn)歷上沒(méi)寫(xiě)啊,講講你這個(gè)內(nèi)核吧,跑在什么平臺(tái)上的,都實(shí)現(xiàn)了什么功能
A:跑在i386平臺(tái),用qemu模擬器模擬的。可以實(shí)現(xiàn)內(nèi)存管理、進(jìn)程創(chuàng)建、Sytemcall、進(jìn)程調(diào)度還有一個(gè)簡(jiǎn)易版本的內(nèi)核調(diào)度
Q7:從Boot開(kāi)始吧,講講你的內(nèi)核啟動(dòng)過(guò)程和你實(shí)現(xiàn)的功能。
A:i386自導(dǎo)bios在啟動(dòng)之后會(huì)從0x7c80讀取第一條指令執(zhí)行,所以內(nèi)核需要使用鏈接器來(lái)修改鏡像的地址。
啟動(dòng)后會(huì)跳轉(zhuǎn)到鏡像entry處的地址,這是一個(gè)初始化函數(shù),首先會(huì)進(jìn)行內(nèi)存的初始化,探測(cè)剩余的內(nèi)存大小,申請(qǐng)一塊地址作為page directory,然后對(duì)剩余內(nèi)存按照4kb進(jìn)行分割,使用鏈表連接,實(shí)現(xiàn)內(nèi)存池。
需要時(shí)向內(nèi)核申請(qǐng)。我的進(jìn)程創(chuàng)建時(shí)模仿linux fork實(shí)現(xiàn)的,利用的是寫(xiě)時(shí)拷貝技術(shù),只創(chuàng)建一個(gè)新的棧,拷貝父進(jìn)程的page directory的映射,但是標(biāo)記頁(yè)表為只讀不寫(xiě),如果寫(xiě)會(huì)觸發(fā)缺頁(yè)中斷,然后進(jìn)行相應(yīng)的拷貝。
調(diào)度是就是在可以準(zhǔn)備運(yùn)行的進(jìn)程中挑選一個(gè)可以準(zhǔn)備運(yùn)行的進(jìn)程,簡(jiǎn)單的round-robin算法,后來(lái)加入了優(yōu)先級(jí)調(diào)度,利用hash-map尋找優(yōu)先級(jí)最高的進(jìn)程。
Q8:在內(nèi)存初始化中,怎么探測(cè)剩余內(nèi)存的。
A:鏡像在bss段的最后會(huì)創(chuàng)建的一個(gè)標(biāo)記叫做end,可以探測(cè)一個(gè)cmos管知道總共的內(nèi)存大小,可以間接知道剩余內(nèi)存的大小。
答案附在面經(jīng)中
沒(méi)有標(biāo)題
https://gw-c.nowcoder.com/api/sparta/jump/link?link=http%3A%2F%2Fdaxprogram.com
全部評(píng)論
相關(guān)推薦
點(diǎn)贊 評(píng)論 收藏
分享
05-11 12:05
中國(guó)礦業(yè)大學(xué) Java 點(diǎn)贊 評(píng)論 收藏
分享
點(diǎn)贊 評(píng)論 收藏
分享