Linux開發七
linux核心移植
象棋小子 1048272975
Linux是一套免費使用和自由傳播的作業系統,吸收了來自全世界無數程式員的精華,不斷完善壯大。Linux核心高度可移植,其可以運作在各種硬體裝置中,如路由器、遊戲機、智能手表、手機、台式計算機、超級計算機。筆者此處就s3c2416的Linux核心移植作一個簡單的介紹。
1. Linux核心移植分類
1.1. 架構級移植
Linux核心源碼把處理器架構相關的代碼放到arch目錄,Linux核心支援目前市面上絕大部分的處理器架構,如x86,arm,mips。對于特定架構的代碼由專門的社群進行維護,一般使用者無需做這部分代碼的移植工作。
1.2. CPU級移植
arm通過授權的方式,得到了衆多半導體廠商的支援,成為當今最流行的一種處理器架構。即使同一種arm核心,不同半導體廠商設計出來的晶片規格都是千差萬别的。是以這部分Linux核心沒法統一去實作,隻能靠使用者進行CPU級的移植。arm社群對于一些較流行的CPU,已經直接提供了移植支援,該部分的代碼可以參考arch->arm下各個mach-xxx目錄,包括本文所論的s3c2416,都可以直接支援。一般來說,上遊的晶片廠商會提供其對應的CPU級移植,也無需使用者做這方面的移植工作。如果沒有相關的CPU級移植代碼,或者需要把晶片廠商提供的Linux核心遷移到更高版本的核心等等,則需要參考已有的同類CPU級移植代碼進行移植。
1.3. 闆級移植
Linux核心針對某款CPU已經提供了一些開發闆的具體實作,此外,晶片廠商也會提供對應其CPU的Linux闆級實作。但實際使用者針對不同的應用,其闆級外設是千差萬别的。這部分隻能由使用者對比自身的闆極硬體配置以及現有的開發闆硬體配置,進行代碼的删減增加。
2. s3c2416闆級移植
Linux核心已經完整支援s3c2416,在arch->arm目錄下plat-samsung以及mach-s3c24xx這兩個目錄代碼實作了s3c24xx系列的CPU級代碼。其中,plat-samsung目錄代碼為所有samsung平台晶片的公共實作部分,mach-s3c24xx目錄代碼為s3c24xx系列晶片公共實作部分。這些代碼基本上用于CPU核心以及CPU外設的設定,對于同一款CPU,這些代碼都是通用的,一般目标闆無需進行更改。從Linux官網下載下傳最新版本的核心源碼,s3c2416移植Linux核心步驟如下:
2.1. 修改主目錄Makefile
Makefile預設擷取得是主機的架構以及編譯環境,我們的核心是要運作在arm平台上,是以修改ARCH=arm,CROSS_COMPILE=arm-linux-。
2.2. 闆級代碼mach-home2416.c
在mach-s3c24xx目錄下已支援多個開發闆的闆級代碼,如mach-qt2410.c、mach-mini2440.c、mach-smdk2416.c等等。其中smdk為samsung官方開發闆,我們以smdk闆級代碼檔案作為參考,建構我們自己的闆級代碼檔案。
在mach-s3c24xx目錄下跟smdk2416相關的闆級代碼有common-smdk.c以及mach-smdk2416.c。其中common-smdk.c為所有smdk闆的闆級公共實作部分,mach-smdk2416為smdk2416獨有的闆級實作部分。我們隻需支援home2416闆,在mach-home2416.c檔案中實作所有的闆級代碼,拷貝mach-smdk2416.c為mach-home2416.c,把common-smdk.c中的代碼複制整合進mach-home2416.c中,并把所有smdk/SMDK替換成home/HOME。
Linux核心通過machine_desc結構體來控制系統體系架構相關部分的初始化,其通過MACHINE_START/MACHINE_END宏定義進行描述。
MACHINE_START(HOME2416,"HOME2416")
.atag_offset = 0x100,
.init_irq =s3c2416_init_irq,
.map_io =home2416_map_io,
.init_machine = home2416_machine_init,
.init_time =home2416_init_time,
MACHINE_END
Linux核心在start_kernel()開始啟動核心,按順序調用machine_desc中的map_io()、init_irq()、init_time()、init_machine()。
start_kernel()->setup_arch()->paging_init()->devicemaps_init()->map_io()實作調用home2416_map_io(),預設外設IO資源位址不在Linux核心空間(3G~4G),需通路一些外設IO資源,可以在初始化頁表時,靜态映射IO資源空間到核心位址空間。
start_kernel()->init_IRQ()->init_irq()實作調用s3c2416_init_irq(),該函數實作把特定CPU的中斷資訊注冊進核心中斷子系統中,使核心能響應并處理相應的中斷。
start_kernel()->time_init()實作調用home2416_init_time(),該函數啟用特定CPU的定時器,用于實作clock event以及clock source。clock event是可程式設計産生中斷事件的,用于實作普通定時器和高精度定時器,産生系統運作tick;clock source不能被程式設計,無法産生事件,用來為Linux核心提供一個較精确的時間基線。
kernel_init()->kernel_init_freeable()->do_basic_setup()->do_initcalls()實作調用home2416_machine_init(),Linux在啟動的最後會建立kernel_init程序,該程序中會初始化調用所有在”initcall”段的函數,arch_initcall(customize_machine)實作從customize_machine()中調用home2416_machine_init(),該函數實作所有闆級外設的初始化。
對于CPU級移植而言,特定CPU隻需産生系統運作tick即可讓Linux核心正常工作,這需要特定CPU中斷支援以及定時器支援,這對應machine_desc中init_irq()以及init_time()的實作。對于s3c2416來說,最簡單的Linux核心CPU級移植隻需實作對應s3c2416_init_irq()以及home2416_init_time(),讓核心能正确産生系統運作tick。
對于闆級移植而言,隻需關注machine_desc中init_machine()實作,根據自身目标闆進行闆級外設的删減增加。
2.3. 闆級編譯支援
Linux核心通過Kconfig進行配置,在arch->arm->mach-s3c24xx目錄,Kconfig檔案加入home2416闆的配置支援。
configMACH_SMDK2416
bool "SMDK2416"
select S3C2416_SETUP_SDHCI
select S3C24XX_SMDK
select S3C_DEV_FB
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C_DEV_NAND
select S3C_DEV_USB_HOST
help
SayY here if you are using an SMDK2416
configMACH_HOME2416
bool "HOME2416"
select S3C2416_SETUP_SDHCI
select S3C_DEV_FB
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1
select S3C_DEV_NAND
select S3C_DEV_USB_HOST
help
SayY here if you are using an HOME2416
在arch->arm->mach-s3c24xx目錄,Makefile加入編譯支援。
obj-$(CONFIG_MACH_SMDK2416) += mach-smdk2416.o
obj-$(CONFIG_MACH_HOME2416) += mach-home2416.o
2.4. 機器碼
修改機器碼,使之與bootloader所設定的一緻,在arch->arm->tools目錄, mach-types檔案加入home2416闆的機器碼。
smdk2416 MACH_SMDK2416 SMDK2416 1685
home2416 MACH_HOME2416 HOME2416 1685
2.5. 核心配置
我們基于s3c2410的配置檔案進行配置,把arch->arm->configs檔案夾中的s3c2410_defconfig拷貝到主目錄,并命名成.config。
執行make menuconfig,進行Linux核心的配置。配置的注意事項請參考前一章節,選擇HOME2416闆。
2.6. 編譯
執行make,進行編譯,成功後會在arch->arm->boot目錄下生成Image非壓縮核心以及zImage壓縮核心。
3. 核心運作
把zImage下載下傳到目标闆後,識别出Machine:HOME2416。
圖3-1 Linux核心啟動
4. 附錄
https://pan.baidu.com/s/1slczwhJ
bootloader源碼以及使用說明
https://pan.baidu.com/s/1eRDJtNs
Qt5.8官網源碼
https://pan.baidu.com/s/1nuGmSqt
本系列例程的根檔案系統
https://pan.baidu.com/s/1i5btLGT
opev3.2.0官網源碼
https://pan.baidu.com/s/1pLpuHw3
yaffs官網源碼
https://pan.baidu.com/s/1bpkZynt
busybox-1.26.2官網源碼
https://pan.baidu.com/s/1i4EtjfR
tslib官網源碼
https://pan.baidu.com/s/1i5MGRhb
mplayer-1.3.0官網源碼
https://pan.baidu.com/s/1sl0fXlr
基于S3C2416修改的linux-4.10.10源碼