第20章 Linux內核移植_第1頁
第20章 Linux內核移植_第2頁
第20章 Linux內核移植_第3頁
第20章 Linux內核移植_第4頁
第20章 Linux內核移植_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第20章Linux內核移植20.1Linux內核移植要點20.2平臺相關代碼結構20.3建立目標平臺工程框架20.4建立目標平臺代碼框架20.5構建目標板代碼20.1Linux內核移植要點移植Linux系統(tǒng)包括內核、程序庫和應用程序,其中最主要的就是內核移植。Linux本身對內存管理(MMU)有很好的支持。一個硬件平臺最主要的是處理器,因此在移植之前需要了解目標平臺的處理器。下面介紹一下移植Linux內核對硬件平臺需要考慮的幾個問題。1.目標平臺目標平臺包括了嵌入式處理器和周圍器件,處理器可能整合了一些周圍器件,如中斷控制器、定時器、總線控制器等。在移植之前需要確定被移植系統(tǒng)對外部設備和總線的支持情況。2.內存管理單元(MMU)在使用MMU的硬件平臺上,操作系統(tǒng)通過MMU可以向應用程序提供大于實際物理內存的地址空間,使應用程序獲得更高性能。Linux的虛擬內存管理功能就是借助MMU實現的。在移植的時候要考慮目標平臺的MMU操作機制,這部分代碼是較難理解的,最好能在相似代碼基礎上修改,降低開發(fā)難度。3.內存映射嵌入式系統(tǒng)大多都沒有配備硬盤,外部存儲器只有Flash,并且系統(tǒng)內存也非常有限。內存控制器(MemoryController)負責內部和外部存儲器在處理器地址空間的映射,由于硬件預設的地址不同導致每種平臺內存映射的地址也不同。在移植時需要參考硬件的用戶手冊,得到內存地址的映射方法。4.存儲器由于嵌入式系統(tǒng)多用Flash存儲器作為存儲裝置。對于文件系統(tǒng)來說,在PC流行的ext2、ext3文件系統(tǒng)在嵌入式系統(tǒng)無法發(fā)揮作用。幸好Linux支持許多文件系統(tǒng),針對Flash存儲器可以使用JFFS2文件系統(tǒng)。在移植的時候,不必要的文件系統(tǒng)都可以裁剪掉。20.2平臺相關代碼結構Linux內核代碼結構與平臺相關的代碼主要存放在arch目錄下,對應的頭文件在include目錄下。以ARM平臺為例,在arch目錄下有一個arm子目錄,存放所有與ARM體系有關的內核代碼。移植內核到新的平臺主要任務是修改arch目錄下對應體系結構的代碼。一般來說,已有的體系結構提供了完整的代碼框架,移植只需要按照代碼框架編寫對應具體硬件平臺的代碼即可。在編寫代碼過程中,需要參考硬件的設計包括圖紙、引腳連線、操作手冊等。20.3建立目標平臺工程框架Linux內核2.6版本已經對ARM處理器有很好的支持,并且對三星公司的S3C2440提供一定支持。但是,嵌入式硬件系統(tǒng)的差別很大,移植Linux內核到新的開發(fā)板仍然需要修改或者增加針對特定硬件的代碼。Linux內核使用了復雜的工程文件結構,向內核添加新的代碼文件需要讓內核工程文件知道才行。對于ARM處理器來說,相關的文件都存放在arch/arm目錄下:boot目錄Kconfig文件Makefile文件20.3.1加入編譯菜單項修改arch/arm/mach-s3c2410/Kconfig文件,在endmenu之前加入下面的內容:87configARCH_MINI2440

//開發(fā)板名稱宏定義88bool"mini2440"

//開發(fā)板名稱89selectCPU_S3C2440

//開發(fā)板使用的處理器類型90help91SayYhereifyouareusingthemini2440.

//幫助信息20.3.2設置宏與代碼文件的對應關系在設置宏與代碼文件對應關系之前,首先建立一個空的代碼文件。在arch/arm/mach-s3c2410目錄下建立mach-mini2440.c文件,用于存放與mini2440開發(fā)板相關的代碼。建立mach-mini2440.c文件后,修改arch/arm/mach-s3c2410/Makefile文件,在文件最后加入mach-mini2440.c文件的編譯信息:43obj-$(CONFIG_ARCH_MINI2440)+=mach-mini2440.o20.3.3測試工程框架工程框架配置修改完畢后,需要進行簡單的測試,根據測試結果判斷框架是否搭建成功。回到內核代碼頂層目錄,輸入makeARCH=armCROSS_COMPILE=arm-linux-menuconfig命令,出現內核設置圖形界面。在內核配置界面選擇LoadanAlternateConfigurationFile菜單,進入后輸入“arch/arm/configs/s3c2410_defconfig”命令,確定后會加載s3c2410默認的配置文件。20.4建立目標平臺代碼框架20.4.1ARM處理器相關結構20.4.2建立machine_desc結構20.4.3加入處理函數20.4.4加入定時器結構20.4.5測試代碼結構20.4.1ARM處理器相關結構首先打開arch/arm/kernel/vmlinux.lds文件,找到815行,代碼如下:815ASSERT((__proc_info_end-__proc_info_begin),"missingCPUsupport")在arch/arm目錄下搜索__proc_info_begin標號。打開kernel/vmlinux.lds.S文件查看:在ARM體系代碼中,使用machine_desc結構描述與處理器相關的代碼。20.4.2建立machine_desc結構53MACHINE_START(MINI2440,"MINI2440")

//定義結構名稱54.phys_ram=S3C2410_SDRAM_PA,

//物理內存起始地址55.phys_io=S3C2410_PA_UART,

//物理端口起始地址56.io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,57.boot_params=S3C2410_SDRAM_PA+0x100,

//啟動參數存放地址5859.init_irq=mini2440_init_irq,

//中斷初始化函數60.map_io=mini2440_map_io,

//I/O端口內存映射函數61.init_machine=mini2440_init,

//初始化函數62

.timer=&s3c24xx_timer,

//定時器63MACHINE_END20.4.3加入處理函數在mach-mini2440.c文件中加入MINI2440結構指定的幾個函數,定義如下:52void__init

mini2440_init_irq(void)

//中斷初始化函數53{54}5556void__init

mini2440_init(void)

//處理器初始化函數57{58}5960void__init

mini2440_map_io(void)

//I/O端口映射初始化函數61{62}20.4.4加入定時器結構在MINI2440結構定義中,使用了一個名為s3c24xx_timer的sys_timer結構變量,該變量定義在arch/arm/mach-s3c2410/timer.c文件定義如下:252structsys_timers3c24xx_timer={253.init=s3c2410_timer_init,

//定時器初始化函數254.offset=s3c2410_gettimeoffset,

//讀取定時器延時255.resume=s3c2410_timer_setup

//恢復定時器256};20.4.5測試代碼結構回到內核源代碼根目錄,執(zhí)行makeARCH=armCROSS_COMPILE=arm-linux-bzImage開始編譯內核。這次編譯沒有出錯信息,會得到正確的編譯結果。查看arch/arm/boot目錄已經有目標文件Image.gz,表示已經編譯生成運行于ARM處理器的內核。到目前為止,已經可以編譯工作在ARM處理器上的代碼,但是內核代碼還不能啟動,因為還沒有加入實際的代碼,在20.5節(jié)中將介紹如何加入目標平臺相關的代碼。20.5構建目標板代碼20.5.1處理器初始化20.5.2端口映射20.5.3中斷處理20.5.4定時器處理20.5.5編譯最終代碼20.5.1處理器初始化首先在mach-mini2440.c文件中加入處理器初始化代碼如下:56void__initmini2440_init(void)57{58set_s3c2410ts_info(&mini2440_ts_cfg);

//注冊觸摸屏結構59set_s3c2410udc_info(&mini2440_udc_cfg);

//注冊UDC結構60set_s3c2410fb_info(&mini2440_lcdcfg);

//注冊LCD結構61}在mini2440_init()函數中注冊了3個結構,分別用于初始化觸摸屏、UDC和LCD,這3個結構都是針對三星ARM9處理器的。在mini2440_udc_cfg結構中使用了一個pullup回調函數。20.5.2端口映射端口映射函數設置S3C2440處理器的I/O端口描述結構、時鐘頻率、串口等,代碼如下:150void__initmini2440_map_io(void)151{152s3c24xx_init_io(mini2440_iodesc,ARRAY_SIZE(mini2440_iodesc));

//初始化I/O結構153s3c24xx_init_clocks(12000000);

//設置時鐘頻率154s3c24xx_init_uarts(mini2440_uartcfgs,ARRAY_SIZE(mini2440_uartc

fgs));

//設置串口結構155s3c24xx_set_board(&mini2440_board);

//設置開發(fā)板結構156s3c_device_nand.dev.platform_data=&bit_nand_info;157}20.5.3中斷處理內核提供了一個s3c24xx_init_irq()處理函數,因此中斷處理函數直接引用即可。186void__initmini2440_init_irq(void)187{188s3c24xx_init_irq();

//調用系統(tǒng)提供的中斷處理函數189}20.5.4定時器處理內核提供了一個定時器處理函數結構如下。structsys_timers3c24xx_timer={.init

=s3c2410_timer_init,

//定時器初始化函數.offset

=s3c2410_gettimeoffset,

//獲取定時器值.resume

=s3c2410_timer_setup

//恢復定時器設置};在代碼中直接使用s3c24xx_timer結

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論