01 、前言
大家好,我是XX,來自湖南XX學(xué)院,電子信息18級(jí),也曾在創(chuàng)新基地控制組學(xué)習(xí)過兩三年,畢業(yè)后就職于一家芯片原廠的解決方案部,擔(dān)任驅(qū)動(dòng)工程師的職位,算上實(shí)習(xí)期,我的工作時(shí)長已有兩年。在此我想將這兩年期間學(xué)習(xí)與積累到的一些經(jīng)驗(yàn)輸出出來,與大家一同分享。
知識(shí)面有限,只能簡(jiǎn)單介紹一些驅(qū)動(dòng)開發(fā)方向的一些經(jīng)驗(yàn),且由于經(jīng)驗(yàn)尚淺,文中難免會(huì)有一些疏漏和錯(cuò)誤之處,還請(qǐng)大家積極地批評(píng)指正。
02 、Intro
工作之后我也時(shí)長回憶起在基地學(xué)習(xí)的時(shí)光,那時(shí)主要還是學(xué)習(xí)MCU相關(guān),使用的是ST和TI家族的芯片,移植庫函數(shù)或者自行編寫驅(qū)動(dòng)庫,燒錄到片內(nèi)flash上,驅(qū)動(dòng)不同的外設(shè),搭載一些如PID,卡爾曼濾波等算法,加入一些邏輯上的業(yè)務(wù)代碼,即可做出一些不錯(cuò)的“小產(chǎn)品”出來。
今天來看,這樣的開發(fā)歷程更像是“全棧式”的開發(fā),因?yàn)檫@個(gè)過程不僅覆蓋了驅(qū)動(dòng)部分的移植,也包括了功能,也即應(yīng)用部分的開發(fā),這種開發(fā)路子常見于個(gè)人開發(fā)者,或是規(guī)模非常小的公司。一般情況下,工程量到達(dá)一定規(guī)模時(shí),就會(huì)將二者分離到不同的崗位上來,各司其職。
然而,當(dāng)前大部分公司依然不會(huì)保留太多單純的驅(qū)動(dòng)開發(fā)崗位,更多得還是BSP和應(yīng)用部分,大多數(shù)驅(qū)動(dòng)開發(fā)崗位還是存在與供應(yīng)關(guān)系的上游,也即芯片原廠,不管是MCU還是其他高端的SoC,芯片驅(qū)動(dòng)多數(shù)都被原廠包圓了,下游的廠商多數(shù)都是在做BSP級(jí)別的開發(fā),以及應(yīng)用開發(fā)(甚至有些小公司連BSP都沒有,例如我司的一些客戶...,都讓原廠負(fù)責(zé)了)也就是說,過去我是Consumer,而現(xiàn)在,我是Provider,負(fù)責(zé)為我司設(shè)計(jì)出品的芯片提供所有的Firmware,驅(qū)動(dòng)代碼,以及SDK等。
總的來說,驅(qū)動(dòng)這個(gè)崗位所要負(fù)責(zé)的內(nèi)容以及工作難度,在不同的企業(yè)類型,呈現(xiàn)這樣的一個(gè)關(guān)系:芯片原廠 > 方案廠 > 模組廠 > 板卡廠 > ?其他應(yīng)用廠商。
03 、嘗試下細(xì)說原廠的驅(qū)動(dòng)開發(fā)
為了更加具體的體現(xiàn)出芯片原廠的驅(qū)動(dòng)開發(fā)在做些什么,下面我將逐步帶大家過一遍一顆芯片從設(shè)計(jì)到Bringup,再到交付完整的SDK包到客戶手中,到底經(jīng)歷了哪些環(huán)節(jié)。驅(qū)動(dòng)開發(fā)者,在其中又做了哪些努力。
一般性的芯片開發(fā)流程:
芯片定義:指定芯片的規(guī)格(芯片spec)
芯片設(shè)計(jì):硅片設(shè)計(jì)和封裝設(shè)計(jì)(主要關(guān)注硅片設(shè)計(jì))
芯片制造:設(shè)計(jì)好之后,就要送到foundry(代工廠)加工制造,(晶圓)
芯片測(cè)封:先對(duì)晶圓進(jìn)行中測(cè),然后進(jìn)行劃片封裝,最后對(duì)封裝后的芯片進(jìn)行成測(cè)。確保不會(huì)由生產(chǎn)環(huán)節(jié)引入錯(cuò)誤。
芯片驗(yàn)證:將芯片焊接到預(yù)先設(shè)計(jì)好的電路板上,裝配成機(jī)器并加載軟件,然后開始驗(yàn)證。
其中,我們十分關(guān)注芯片設(shè)計(jì)與芯片驗(yàn)證環(huán)節(jié)。芯片設(shè)計(jì)的周期通常來說會(huì)非常漫長,這個(gè)時(shí)間段是IC設(shè)計(jì)工程師大展拳腳的時(shí)候,他們也像軟件工程師一樣,需要對(duì)設(shè)計(jì)出的成果作調(diào)試,驗(yàn)證。隨著大規(guī)模集成電路設(shè)計(jì)復(fù)雜性的逐漸提升,芯片驗(yàn)證面臨的資金與時(shí)間的挑戰(zhàn)也變的越來越大,芯片的驗(yàn)證階段占據(jù)了整個(gè)芯片開發(fā)的大部分時(shí)間。從芯片需求定義、功能設(shè)計(jì)開發(fā)到物理實(shí)現(xiàn)制造,每個(gè)環(huán)節(jié)都需要進(jìn)行大量的驗(yàn)證。早期開發(fā)者想驗(yàn)證芯片的設(shè)計(jì)是否符合預(yù)設(shè),只有等待漫長的模擬結(jié)果,或是等待流片成果。時(shí)間成本和經(jīng)濟(jì)成本都較高。
現(xiàn)如今驗(yàn)證方法也越來越多,例如:邏輯仿真(功能驗(yàn)證),形式驗(yàn)證,原型驗(yàn)證。功能驗(yàn)證基于軟件,驗(yàn)證成本較低,驗(yàn)證環(huán)境方便,但性能較差;形式驗(yàn)證為靜態(tài)驗(yàn)證方式,但不可仿真DUT的一些動(dòng)態(tài)行為。其中,大多公司都會(huì)選擇先在SoC驗(yàn)證部門,進(jìn)行邏輯仿真驗(yàn)證,然后再交由基礎(chǔ)軟件開發(fā)部門,使用FPGA原型驗(yàn)證的手段,對(duì)其進(jìn)行二次驗(yàn)證覆蓋。
FPGA原型驗(yàn)證是一種成熟的技術(shù),用于通過將RTL移植到現(xiàn)場(chǎng)可編程門陣列(FPGA)來驗(yàn)證專門應(yīng)用的集成電路(ASIC),專用標(biāo)準(zhǔn)產(chǎn)品(ASSP)和片上系統(tǒng)(SoC)的功能和性能。FPGA和ASIC前端代碼都是基于 Verilog HDL 開發(fā)的,所以ASIC代碼理論上是可以在FPGA平臺(tái)上跑起來的,在流片之前,盡可能的去確定芯片功能的正確性的一種驗(yàn)證方式。
在我司,F(xiàn)PGA原型驗(yàn)證的任務(wù),交由驅(qū)動(dòng)部門執(zhí)行,通常芯片設(shè)計(jì)部門的小伙伴會(huì)給我們出攜帶各種IP功能的”bit文件“,F(xiàn)PGA平臺(tái)(HAPS 80)有一個(gè)附帶的燒錄軟件,為了讓FPGA平臺(tái)變成目標(biāo)SoC的”樣子“,需要使用這個(gè)燒錄軟件將bit文件燒錄到FPGA上。
SoC形成之后,我們會(huì)使用Arm的DS-5 IDE構(gòu)建一個(gè)Bare Metal(裸機(jī),不帶操作系統(tǒng))工程,編寫當(dāng)前驗(yàn)證SoC的初始化代碼,各個(gè)IP的驅(qū)動(dòng)代碼,各個(gè)IP的測(cè)試demo,以及多個(gè)IP之間共同工作時(shí)的方案性的demo。主要目的是覆蓋測(cè)試SoC在實(shí)際運(yùn)行時(shí)可能遇到的情況。
完成SoC本身的驗(yàn)證之后,還會(huì)進(jìn)行Bootrom的開發(fā),同樣也是在FPGA環(huán)境上進(jìn)行驗(yàn)證,這個(gè)環(huán)節(jié)非常關(guān)鍵,bootrom是芯片開始運(yùn)行的起點(diǎn),后期bringup是否可以成功,芯片的所用功能,性能,是否能夠有機(jī)會(huì)綻放出來,都得看bootrom的表現(xiàn)。有些企業(yè)會(huì)自己設(shè)計(jì)Bootrom的代碼,也有些企業(yè)則會(huì)基于安全啟動(dòng)的考慮,會(huì)去使用Arm推出的解決方案 -- ATF。
ARM TrustZone是ARM公司推出的SoC及CPU系統(tǒng)范圍的安全解決方案,具有基于硬件的安全功能。它通過對(duì)原有硬件架構(gòu)進(jìn)行修改,在處理器層次引入了兩個(gè)不同權(quán)限的保護(hù)域——安全世界和普通世界,任何時(shí)刻處理器僅在其中的一個(gè)環(huán)境內(nèi)運(yùn)行。
同時(shí)這兩個(gè)世界完全是硬件隔離的,并具有不同的權(quán)限,正常世界中運(yùn)行的應(yīng)用程序或操作系統(tǒng)訪問安全世界的資源受到嚴(yán)格的限制,反過來安全世界中運(yùn)行的程序可以正常訪問正常世界中的資源。ATF將啟動(dòng)過程分為三個(gè)階段:
Boot Loader stage 1 (BL1) AP Trusted ROM: 用于實(shí)現(xiàn)bootrom
Boot Loader stage 2 (BL2) Trusted Boot Firmware,二級(jí)loader
Boot Loader stage 3-1 (BL31) EL3 Runtime Software, 提供PSCI(電源管理等)、secure和nosecure切換等運(yùn)行時(shí)服務(wù)
Boot Loader stage 3-2 (BL32) Secure-EL1 Payload (optional), 第三方的secure OS,如TEE等
Boot Loader stage 3-3 (BL33) Non-trusted Firmware,一般是uboot
其中,二級(jí)loader中常常會(huì)執(zhí)行DDR的初始化,將該階段獨(dú)立出來是非常有必要的,因?yàn)橐活wSoC使用的DDR顆粒并不是永久一致的,如果將DDR初始化部分的代碼整合進(jìn)BOOT階段,那么這顆SoC就不能使用其他的DDR。
驅(qū)動(dòng)工程師在此的工作有許多,其中一部分為:
為基礎(chǔ)的部件,如GPIO,Pinctrl,Clock,Reset等模塊編寫驅(qū)動(dòng)。
將ATF的IO存儲(chǔ)抽象層中的存儲(chǔ)介質(zhì)相關(guān)的接口,適配為自家SoC上存儲(chǔ)介質(zhì)的驅(qū)動(dòng)。啟動(dòng)方式有很多,如耳熟能詳?shù)?,spi-nor,spi-nand,uart?;蛘遝mmc,sd card,xip啟動(dòng)等,通過Boot select的撥碼開關(guān)去選擇不同的啟動(dòng)方式。
適配DDR。
實(shí)現(xiàn)熱啟動(dòng)warm reset(直接從ATF階段跳轉(zhuǎn)到內(nèi)核運(yùn)行),各家SoC的warm reset實(shí)現(xiàn)手段不同,依托的硬件機(jī)制不同。
實(shí)現(xiàn)多分區(qū)啟動(dòng)等容災(zāi)手段
基于ATF提供的工具,實(shí)現(xiàn)安全啟動(dòng),對(duì)rom的鏡像進(jìn)行加密。
and soon...
這個(gè)階段的工作十分精密,需付出很多精力在FPGA平臺(tái)上,仔細(xì)驗(yàn)證啟動(dòng)功能,定時(shí)發(fā)送新的bootrom版本給到SoC驗(yàn)證部門,在他們的環(huán)境上進(jìn)行邏輯時(shí)序的仿真,SoC的驗(yàn)證更加精細(xì),在時(shí)序?qū)用嫔峡梢苑治龀鯟程序?qū)C(jī)器的每次操作,甚至是一次寄存器的讀寫,都可以進(jìn)行捕捉。
SoC驗(yàn)證也會(huì)對(duì)我們給出的bootrom程序進(jìn)行性能上的分析,建立benchmark。兩個(gè)部門的交互在此階段非常頻繁(所以一定要和SoC部門的人打好關(guān)系,在他們的層面上去理解硬件,對(duì)于我們的幫助會(huì)更大)
在Bootrom的驗(yàn)證成功之后,就會(huì)將文件發(fā)到代工廠進(jìn)行流片。利用流片的這個(gè)時(shí)間空隙,驅(qū)動(dòng)部門會(huì)進(jìn)行SDK的回片前的預(yù)開發(fā)。
原廠給出的SDK通常包括uboot,kernel,prebuilts,libs,apps以及build。其中驅(qū)動(dòng)部門所要負(fù)責(zé)的是uboot,build,prebuilts,以及最重要的kernel。(應(yīng)用開發(fā)部門主要負(fù)責(zé)libs以及apps,驅(qū)動(dòng)開發(fā)也會(huì)涉及一些libs目錄的責(zé)任,比如一些不對(duì)外開放的驅(qū)動(dòng)源碼,會(huì)放在libs目錄,編譯后就會(huì)刪除)
build目錄主要是一些編譯腳本,SDK支持的開發(fā)板非常多,支持一鍵切換編譯出不同的開發(fā)板的鏡像,構(gòu)建根文件系統(tǒng),lib,并進(jìn)行打包。
由于一些歷史原因,uboot中各個(gè)層次之間組織架構(gòu),和linux ?kernel的組織非常類似,都是board—>machine—>arch—>cpu這樣的框架:
為了移植性,更容易地跨平臺(tái)運(yùn)行,它倆的架構(gòu)逐漸變成了上圖這個(gè)樣子。這張圖(來自蝸窩科技)揭示了uboot和kernel對(duì)于多種CPU,多種體系結(jié)構(gòu),多種機(jī)器類型,以及多種板級(jí)的抽象層次。我粗淺地認(rèn)為,做嵌入式很難的一部分也正是在此(除開算法部分):
軟件工程中的抽象和封裝,力求以最簡(jiǎn)潔、最高效的方式,實(shí)現(xiàn)盡可能多的功能,通過軟件抽象來掩蓋硬件的差異。這一點(diǎn)上,uboot和kernel的結(jié)構(gòu)做得非常優(yōu)雅。
SDK的回片前的預(yù)開發(fā)也就是在這里CPU,Arch,Mach,Board四層次移植,適配目標(biāo)SoC的代碼以及配置,各個(gè)模塊的驅(qū)動(dòng)移植與開發(fā)(uboot也是需要開發(fā)驅(qū)動(dòng)的),以u(píng)boot為例:
CPU層次,如ARMv8的初始化代碼,在ARM體系結(jié)構(gòu)這個(gè)層次上對(duì)SoC進(jìn)行初始化,比如MMU的配置,Cache的配置,大小端,異常等級(jí)的設(shè)置,通用定時(shí)器配置等
Arch層次,如arm的公共代碼,為后期執(zhí)行板級(jí)的配置(board_init_f/r),初始化執(zhí)行環(huán)境。
Machine層次,實(shí)則是一個(gè)通用的庫
Board層次,板級(jí)的特殊代碼,著名的board_init_f和board_init_r就會(huì)在此處實(shí)現(xiàn)。
如我前面所言,這個(gè)階段屬于預(yù)開發(fā)階段,所有的操作都在FPGA上運(yùn)行,等到芯片實(shí)際流片回來,Bringup成功,就會(huì)將這段時(shí)間里的成果,遷移到實(shí)際的Evaluation board上去,以快速給到客戶實(shí)際的產(chǎn)品。
最后就來到SLT(system level test)了,這是芯片量產(chǎn)前的最后一個(gè)測(cè)試,可能也會(huì)由驅(qū)動(dòng)部門負(fù)責(zé),這一塊我了解的不多,驅(qū)動(dòng)這邊主要在為每個(gè)驅(qū)動(dòng)模塊編寫自動(dòng)化測(cè)試軟件。SLT所用的測(cè)試板會(huì)做的非常的龐大,因?yàn)樾枰獙?duì)所有模塊進(jìn)行統(tǒng)一的測(cè)試,通常需要上位機(jī)的支持,給測(cè)試板下達(dá)測(cè)試指令,以自動(dòng)化地測(cè)試芯片各個(gè)模塊是否正常。SLT是一種純粹通過運(yùn)行和使用來完成的測(cè)試。
到此處為止,還都是硅前階段,即行業(yè)黑話Pre-silicon,指硅片實(shí)際流片出之前的所有步驟,原則上驗(yàn)證人員需要將所有的Bug攔截在硅前階段。這個(gè)階段漫長且如履薄冰,必須小心翼翼,規(guī)格嚴(yán)格,功夫到家。相比而言,驅(qū)動(dòng)工程師在這段時(shí)間內(nèi)也一般來說不會(huì)很繁忙。
第二個(gè)階段是硅后驗(yàn)證階段(Post-Silicon),指的是在產(chǎn)品流片、發(fā)布以后查缺補(bǔ)漏的階段,這個(gè)階段對(duì)設(shè)計(jì)缺陷的修復(fù)成本將會(huì)變得非常高。
硅后階段,驅(qū)動(dòng)部門所需負(fù)責(zé)的工作:
對(duì)流片后的芯片進(jìn)行BringUp
遷移FPGA上預(yù)開發(fā)版本的各個(gè)庫到EVB版本,并在EVB板上實(shí)際調(diào)通
各個(gè)模塊的驅(qū)動(dòng)調(diào)通并驗(yàn)證,做性能測(cè)試
給每個(gè)驅(qū)動(dòng)寫測(cè)試Demo
支持客戶的疑難雜癥,支持應(yīng)用部門的疑問和需求,維護(hù)驅(qū)動(dòng)等
相比硅前而言,硅后的工作節(jié)奏會(huì)變得非???,壓力也會(huì)更大,Bringup失敗怎么辦,如何避免ECO?后期發(fā)現(xiàn)有一些非必現(xiàn)的BUG又怎么辦?特別是第5點(diǎn),這是一個(gè)長期的過程,對(duì)于每個(gè)原廠的驅(qū)動(dòng)開發(fā)者而言,這是一條永遠(yuǎn)存在的副本,每個(gè)人管理自己所負(fù)責(zé)的那些驅(qū)動(dòng)(有些比較復(fù)雜的驅(qū)動(dòng),如ISP,VPE等,則單獨(dú)交給某幾個(gè)人去負(fù)責(zé))。
客戶的問題會(huì)被相應(yīng)地路由到各自的Task List上來。內(nèi)核部分的異常屬于公共任務(wù),由leader判定哪些開發(fā)者來解決(驅(qū)動(dòng)開發(fā)者也需要非常理解linux內(nèi)核的工作機(jī)制)。一些大公司會(huì)有單獨(dú)的內(nèi)核部門解決內(nèi)核異常(如華為)。一般來說初創(chuàng)公司的SDK都會(huì)有很多問題。
比方說,有一次客戶反饋,我們的linux內(nèi)核,換了一個(gè)解壓算法后,性能表現(xiàn)特別差,約莫45s才能進(jìn)到內(nèi)核初始化部分。經(jīng)過我進(jìn)兩個(gè)月的定位與查找,發(fā)現(xiàn)是我們的uboot內(nèi)核中,沒有打開一個(gè)Errata項(xiàng),Arm Core中有一個(gè)寄存器中的一個(gè)bit沒有配置上,該bit管理著Cache的表現(xiàn),如果這個(gè)bit不打開,即使Cache已經(jīng)使能了,也不會(huì)生效。后來我在海思的Patch列表中,也看到了這一點(diǎn),看來各個(gè)IC公司都是一步步摸過來的。
04 、思考我們需要哪些?
上面簡(jiǎn)單地?cái)⑹隽艘幌乱粋€(gè)驅(qū)動(dòng)開發(fā)者在培育一顆芯片的過程中所付出的努力??偟膩碚f,原廠的驅(qū)動(dòng)開發(fā)者,特別是小廠的開發(fā)者,確實(shí)需要負(fù)責(zé)很多事務(wù)。
但我想說,透過現(xiàn)象看本質(zhì),在這個(gè)開發(fā)鏈條中,無論是Bare Metal,Uboot,Kernel,都是在配置寄存器,驅(qū)動(dòng)工程師也被戲稱為寄存器配置工程師,這一點(diǎn)也沒錯(cuò),驅(qū)動(dòng)開發(fā)就是在看手冊(cè),看懂手冊(cè)后去寫配置代碼,讓硬件按想要的方式運(yùn)行。這個(gè)過程也就是Bare Metal級(jí)別的開發(fā)邏輯,MCU開發(fā)者或許很熟悉ST的標(biāo)準(zhǔn)庫,HAL庫,LL庫,這些也就是在配置寄存器的基礎(chǔ)上套了一層框架,方便開發(fā)者對(duì)于驅(qū)動(dòng)代碼的使用。
對(duì)于Uboot和Kernel部分的驅(qū)動(dòng)開發(fā),底層邏輯依然是如此,只不過uboot與kernel為了統(tǒng)一開發(fā)者的行為,方便開發(fā)者將驅(qū)動(dòng)加入他們的代碼,制定了一系列規(guī)則與框架,只需看懂他們的規(guī)則,了解他們的框架是如何運(yùn)行,即可將驅(qū)動(dòng)插入到其中。
所以對(duì)于”驅(qū)動(dòng)怎么學(xué)習(xí)“這個(gè)命題來說,我想先往底層去討論,向底層,即探索硬件的運(yùn)行機(jī)制,最標(biāo)準(zhǔn),不走彎路的做法就是去啃芯片手冊(cè),這個(gè)過程初入手也許非常痛苦,茫茫手冊(cè),動(dòng)輒百千頁,如何去看?
無他,唯手熟爾。
有些同學(xué)可能過于依賴庫函數(shù)編程或者類似Cube IDE圖形化配置的這類模式,遇到一顆新的SoC就會(huì)覺得頭大。
其實(shí)手冊(cè)看多了也就習(xí)慣了,看著頁數(shù)很多,一大部分都是對(duì)寄存器的description,這部分當(dāng)作字典查就好了,重要的是手冊(cè)頭部到中間那些東西。關(guān)于如何去看一份手冊(cè),在宋寶華的《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》中有一些描述,可以作為參考:
寫好單一的模塊驅(qū)動(dòng),也許并不難,但如果將它與其他的模塊交互,與CPU的體系結(jié)構(gòu)有一些關(guān)系呢?
在OSPI控制器的INDAC (Indirect Access Controller)模式下訪問時(shí)數(shù)據(jù)由SRAM中轉(zhuǎn),Master通過AHB訪問讀寫SRAM中的數(shù)據(jù),這里SRAM的中轉(zhuǎn)地址的內(nèi)存屬性是否能夠隨意設(shè)置呢?
諸如這些問題也暗示驅(qū)動(dòng)開發(fā)不能只見樹木,不見森林,需要適當(dāng)?shù)厝W(xué)習(xí)整體的體系結(jié)構(gòu)的知識(shí),學(xué)習(xí)SoC各個(gè)部分的關(guān)系。這種需求在做電源域以及低功耗設(shè)計(jì),ATF的BL31,uboot和kernel的啟動(dòng)等部分時(shí),都會(huì)有深刻的感覺。如果有機(jī)會(huì)去做虛擬化,安全加解密部分的工作,相信這種體驗(yàn)會(huì)更加深刻。
向上探索,首先遇到的問題應(yīng)該是“框架”,這是一個(gè)比較大的話題,對(duì)于uboot來說就是它的DM模型,對(duì)于Kernel或者RTOS來說,就是整個(gè)操作系統(tǒng)的原理和設(shè)備驅(qū)動(dòng)程序機(jī)制這種驅(qū)動(dòng)開發(fā)必須面對(duì)的問題,這一塊沒辦法展開多講,以書籍和視頻資源為輔,多看源碼,多調(diào)試,多去寫一些針對(duì)性的測(cè)試demo。
針對(duì)操作系統(tǒng),最近兩年我個(gè)人看得比較多的是南京大學(xué)的操作系統(tǒng)課程(所用教材是operating system-three easy pieces)以及MIT 6.S081(RISC-V架構(gòu))(我們電氣學(xué)院幾乎沒有開設(shè)針對(duì)OS的課程,如果想做Linux或者FreeBSD這類操作系統(tǒng)下的開發(fā),還是有必要學(xué)習(xí)一下的)。
這兩門課主要講解操作系統(tǒng)的理論知識(shí),但其精髓還是在實(shí)驗(yàn)課上,如果能夠吃透這兩門課的實(shí)驗(yàn)課,進(jìn)行魔改,寫到簡(jiǎn)歷上也是個(gè)不錯(cuò)的項(xiàng)目經(jīng)驗(yàn)。
面對(duì)現(xiàn)代Linux這樣的操作系統(tǒng),直接去看它的源碼其實(shí)是非常吃力的,它在漫長的發(fā)展長河中進(jìn)化出了很多”額外“的特性,如支持了一些調(diào)試手段,還有一些面對(duì)編譯器優(yōu)化的特性(如likely和unlikely),直接去看源碼會(huì)迷失在這些細(xì)節(jié)當(dāng)中。可以先從RTOS或者RVOS,LMOS,Xv6這樣的小型OS來入手研究。
在我看來,學(xué)習(xí)操作系統(tǒng)要面對(duì)的困難主要是兩點(diǎn):
體系結(jié)構(gòu)部分。這部分對(duì)于大多數(shù)驅(qū)動(dòng)開發(fā)這里來說非常陌生,特別是只做BSP層以上的開發(fā)者(可以跳過對(duì)體系結(jié)構(gòu)的理解)。操作系統(tǒng)是建立在硬件上的,其多數(shù)重要的機(jī)制都依賴于體系結(jié)構(gòu)提供的支持。
對(duì)于同一功能如進(jìn)程管理,主流的體系結(jié)構(gòu)都是類似的。相對(duì)而言,RISC-V的難度比Arm的難度小很多,可以從RISC-V的手冊(cè)開始看,但是畢竟當(dāng)前崗位數(shù)量上還是ARM多,我們也可以功利一些,直接入手ARM,舊版本如ARMv7可以看杜春雷的ARM體系結(jié)構(gòu)與編程,MCU級(jí)別的可以看Cortex系列的權(quán)威指南,高版本如ARMv8以上可以看笨叔的《ARM64體系結(jié)構(gòu)與編程》。
算法。如內(nèi)存管理方面的算法,SLAB,Buddy。進(jìn)程調(diào)度方面的算法,CFS等。如果就業(yè)目標(biāo)并不是專精內(nèi)核的方向,這一塊無需做多深入,將更多的精力放在設(shè)備驅(qū)動(dòng)和體系結(jié)構(gòu)上會(huì)更有性價(jià)比。
再向上走,可能就是一些”形而上學(xué)“的東西:軟件架構(gòu)。這一點(diǎn)在上面談到linux ?kernel的組織時(shí)已經(jīng)談過一些。Linux kernel雖然是以C這樣的面向過程的語言去編寫,但也處處使用著面向?qū)ο蟮乃枷耄私庖恍┸浖軜?gòu)上的做法,如解耦,開閉,接口隔離等,有助于理解kernel中各個(gè)組件的代碼。
最后我想說,做嵌入式驅(qū)動(dòng),畢竟不是搞科研,而是工程學(xué),切莫只研究理論而丟失實(shí)際操作,學(xué)習(xí)一些調(diào)試手段,多去調(diào)試幾個(gè)工程是必要的。(但其實(shí)我也不會(huì)多少調(diào)試手段,當(dāng)然了,printk應(yīng)該算是玩的很6...,GDB在調(diào)試內(nèi)核時(shí)用的并不多,這是一個(gè)非常強(qiáng)大的工具但是我沒有heavliy地用過,倒是仿真器用得不少)
05 、閑談,一些淺薄的經(jīng)驗(yàn)
這兩年常有許多朋友向我吐槽當(dāng)前的就業(yè)環(huán)境,如果將剛畢業(yè)的我放在這個(gè)環(huán)境下,我應(yīng)該也沒有多少把握去拿到一個(gè)滿意的offer,所以我在此篇文章中所給出的建議只能說是我主觀上覺得有用,有意義的建議。
如果讓我回到基地再重新經(jīng)歷一遍,我還是會(huì)去參加各類比賽,利用課余時(shí)間多做一些自己感興趣的小玩意兒,本科階段畢竟不是在工程或科研上廝殺的時(shí)候,但環(huán)境總會(huì)逼著我們不斷前進(jìn)。
嵌入式,不管是驅(qū)動(dòng)還是應(yīng)用開發(fā),不管是做MCU還是ARM Linux,不管身處哪個(gè)方向:芯片,醫(yī)療,電機(jī)控制,運(yùn)動(dòng)控制,AI,協(xié)議?;蚴巧衔粰C(jī),都是需要不斷學(xué)習(xí),不斷專研,才能做得長久的。這需要我們擁有一些對(duì)行業(yè)的熱愛以及一些敢想敢做的極客精神。
當(dāng)然,在前行的過程中,應(yīng)該時(shí)刻記得最重要的,還是自己身心的健康愉悅。我的leader也曾這樣和我說過:能做好這一行的,無非就是兩種人。
第一種,天生就適合干這一行,我們組有個(gè)小哥,當(dāng)時(shí)芯片回來要做HDMI,全公司沒有人做過,交給他兩天后就將屏幕點(diǎn)亮了,這種可能就是骨骼驚奇。第二種,就是能夠坐得住的,不斷摸索,肯花時(shí)間。
最后我再將上面的一些tips羅列一下:
基礎(chǔ)知識(shí)(計(jì)算機(jī)四大件)一定要學(xué)好,計(jì)組,OS這些在原理層面上的基礎(chǔ)要打牢,網(wǎng)絡(luò)不做相關(guān)方向的工作的話可以放一放以后再學(xué)。
做驅(qū)動(dòng)的朋友,芯片手冊(cè)要認(rèn)真研究,遇到問題先找手冊(cè)。比如IIC延展這些問題其實(shí)在芯片手冊(cè)里也會(huì)提到,DMA的S-G模式在圖像數(shù)據(jù)搬運(yùn)時(shí)的應(yīng)用,諸如此類的很多知識(shí)在芯片手冊(cè)上都有,當(dāng)然ARM的核心手冊(cè)(TRM)也得好好專研。
學(xué)會(huì)調(diào)試,多動(dòng)手。
在項(xiàng)目中鍛煉自己通常是最快的。
兩句真言:Read The F**king Source Code/Read the Friendly Manual
06 、推薦學(xué)習(xí)資源
視頻:
韋東山的教程,不必多說了,祖師爺.
南京大學(xué)操作系統(tǒng):[操作系統(tǒng)概述 (為什么要學(xué)操作系統(tǒng)) 南京大學(xué)2022操作系統(tǒng)-蔣炎巖-P1]嗶哩嗶哩bilibili
MIT 6.S081:【操作系統(tǒng)工程】精譯【MIT 公開課 MIT6.S081】嗶哩嗶哩bilibili
計(jì)算機(jī)基礎(chǔ)課:南京大學(xué) - 計(jì)算機(jī)系統(tǒng)基礎(chǔ) 袁春風(fēng)(一)- 程序的表示、轉(zhuǎn)換與鏈接嗶哩嗶哩bilibili
一生一芯:[“一生一芯”概述 第六期“一生一芯”計(jì)劃 - P1]嗶哩嗶哩bilibili
中科大RVOS:https://www.bilibili.com/video/BV1Q5411w7z5/?spm_id_from=333.337.search-card.all.click
書籍:
C語言功底:
C prime Plus
C專家編程
C接口與實(shí)現(xiàn)
多看源碼,多動(dòng)手寫代碼,多抄優(yōu)質(zhì)的代碼
計(jì)算機(jī)體系結(jié)構(gòu):
計(jì)算機(jī)組成與設(shè)計(jì)-硬件軟件接口
深入理解計(jì)算機(jī)系統(tǒng)(CSAPP)
笨叔的《ARM64體系結(jié)構(gòu)與編程》
操作系統(tǒng)部分
操作系統(tǒng)導(dǎo)論 operating system-three easy pieces
深度探索嵌入式操作系統(tǒng)(LMOS)
《Understanding the linux kernel 3edt》
《linux設(shè)計(jì)與實(shí)現(xiàn)》
編譯原理部分:程序員的自我修養(yǎng) - 編譯 裝載 鏈接
博客:
蝸窩科技的博客Linux內(nèi)核分析 - 蝸窩科技 (wowotech.net)
面向Linux驅(qū)動(dòng)開發(fā):
linux設(shè)備驅(qū)動(dòng)程序內(nèi)核機(jī)制 -- 陳學(xué)松
linux設(shè)備驅(qū)動(dòng)開發(fā)詳解 -- 宋寶華
Mastering Linux Kernel Development -- ?Robert Love
面向?qū)崙?zhàn):
韋東山的一些項(xiàng)目還挺不錯(cuò)的
蝸窩科技的博客上有一個(gè)X-project項(xiàng)目,很貼近實(shí)際企業(yè)的開發(fā)模式與開發(fā)內(nèi)容
07 、最后
對(duì)于選擇參加工作的同學(xué),找工作前可以利用寒暑假找一份實(shí)習(xí)。拿到offer后最好仔細(xì)甄別,做好背調(diào)。例如,對(duì)于那些面試難度與薪酬待遇不成正比的公司應(yīng)保持謹(jǐn)慎。信息收集可以通過脈脈,看準(zhǔn),知乎這類軟件,也可以詢問身邊的學(xué)長學(xué)姐。
希望大家都能找到滿意的工作,身體健康,工作順利,學(xué)業(yè)進(jìn)步。
最后,最近在做嵌入式就業(yè)零基礎(chǔ)入門手把手教學(xué),有興趣的朋友加vx聊: