北航國家嵌入式系統--實驗3 LINUX內核在arm平臺上的移植_第1頁
北航國家嵌入式系統--實驗3 LINUX內核在arm平臺上的移植_第2頁
北航國家嵌入式系統--實驗3 LINUX內核在arm平臺上的移植_第3頁
北航國家嵌入式系統--實驗3 LINUX內核在arm平臺上的移植_第4頁
北航國家嵌入式系統--實驗3 LINUX內核在arm平臺上的移植_第5頁
已閱讀5頁,還剩28頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 2006 EmbeddedLINUXLINUX內核在內核在armarm平臺上的平臺上的移植移植牛建偉鄒 琪嵌入式系統課程嵌入式系統課程實驗三實驗三 2006 Embedded 實驗目的 實驗內容 Bootloader Linux內核 實驗步驟 2006 Embedded實驗目的實驗目的 了解bootloader及其作用,了解Linux內核結構。 掌握配置和編譯Linux系統內核的方法以及移植嵌入式Linux的基本步驟。 2006 Embedded實驗內容實驗內容 在Linux系統的宿主PC下,修改裁減內核源碼,編譯生成bootloader、內核映像和根文件系統。 在Windows系統的宿主P

2、C下,燒寫bootloader、內核映像和根文件系統。(帶U盤) 2006 Embedded嵌入式嵌入式Linux系統構成系統構成 引導加載程序(armboot, blob, redboot, vivi, U-Boot)啟動加載模式(正常工作模式),下載模式 內核 文件系統 用戶應用程序(有時還包括嵌入式圖形用戶界面) 內核 根文件系統Bootloader啟動參數 2006 EmbeddedBootloader介紹介紹 引導加載程序bootloader是系統加電后運行的第一段代碼,它完成整個系統的加載啟動任務。 在基于ARM的嵌入式系統中,系統在上電或復位時通常都從地址0 x00000000處

3、開始執行,而在這個地址處放的通常就是系統的bootloader。 通過這段小程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。 2006 EmbeddedBootloader的啟動流程的啟動流程 第一個階段主要包括依賴于CPU的體系結構硬件初始化的代碼,通常用匯編語言實現。這個階段的任務有:基本的硬件設備初始化(屏蔽所有中斷、關閉處理器內部指令/數據cache等)為第二階段準備RAM空間如果是從某個固態存儲媒質中,則復制Bootloader的第二階段代碼到RAM設置堆棧跳轉到第二階段的C程序入口點 第二個階段通

4、常用C語言完成,以便實現更復雜的功能,也使程序有更好的可讀性和移植性。這個階段的任務有:初始化本階段要使用到的硬件設備檢測系統內存映射將內核映像和根文件系統映像從flash讀到RAM為內核設置啟動參數啟動內核(將控制交給內核) 2006 EmbeddedLinux內核介紹內核介紹 目前專門針對嵌入式設備的Linux改版有針對無MMU的uClinux和針對有MMU的標準Linux在各硬件體系結構上的移植版本。 uClinux是通過對標準Linux內核裁減,去除虛擬內存管理部分的代碼,并對內存分配進行優化,從而達到提高系統運行效率的目的。 因此uClinux的應用程序開發要求用戶自己正確的處理內存

5、管理,一旦錯誤地修改了其他進程的內存,將可能造成系統死機。基于像ARM2410這樣的ARM9內核的ARM-Linux使用了MMU的內存管理,對進程有保護,提高了嵌入式系統中多進程的保護能力。使用戶應用程序的可靠性得以提高,降低了用戶的開發難度。 2006 EmbeddedLinux內核結構內核結構 /arch目錄,包含了體系結構相關部分的內核代碼,如i386 arm等平臺,而每個平臺又包括以下幾個目錄: boot:包括啟動內核所用的部分或全部代碼 kernel:存放支持體系結構特有的特征的實現 lib:存放高速的體現結構特有的通用函數的實現 mm:存放體系結構特有的內存管理程序的實現 /dri

6、vers目錄,保存了內核中所有設備驅動程序。 /fs目錄,列出了Linux支持的所有文件系統的代碼,如ntfs ext3和yaffs等 /include目錄,包括編譯核心所需要的大部分頭文件,例如與平臺無關的頭文件在include/linux子目錄下。不同的平臺需要的頭文件會有所不同,因此該目錄和arch目錄一樣,按平臺劃分多個子目錄,如asm-arm是arm平臺的。 2006 EmbeddedLinux內核結構(續)內核結構(續) /init目錄,包含了內核的初始化代碼,有main.c version.c兩個文件。 /ipc目錄,包含了核心進程間的通信代碼。 /kernel目錄,內核管理的核

7、心代碼在此,與處理器結構相關的代碼都在arch/*/kernel目錄下。 /lib目錄,包括與平臺無關的通用函數。 /mm目錄,包含了所有的內存管理代碼。與具體硬件體系結構相關的內存管理代碼位于arch/*/kernel目錄下。 /net目錄,里面是核心的網絡部分代碼,其每個子目錄對應于網絡的一個方面。 其他目錄,Documentation目錄存放了許多文檔。scripts目錄存放配置內核的一些腳本文件。 2006 EmbeddedLinux內核移植內核移植 1 Linux內核的移植主要包含啟動代碼的修改,內核的鏈接及裝入,參數傳遞,內核引導幾個部分。我們在移植工作中要改動的代碼主要集中在與體

8、系結構相關部分。 在/arch/arm/boot/bootp目錄中,有個init.S的ARM匯編文件,它就是引導Linux內核在arm平臺上啟動的初始化代碼。它里面定義了一個全局符號_start,它定義了默認的起始地址,同時它也是整體內核二進制鏡像的起始標志。 Init.S主要完成以下功能:定義數據、代碼段、bbs(未初始化數據段)起始地址變量并對bbs段初始化設置寄存器以初始化系統硬件關閉中斷初始化LCD顯示將數據段復制到內存跳轉到內核起始函數start_kernel繼續執行對主寄存器的修改 2006 EmbeddedInit.S/ /* * * * linux/arch/arm/boot/

9、bootp/init.Slinux/arch/arm/boot/bootp/init.S * * * * Copyright (C) 2000 Russell King Copyright (C) 2000 Russell King * * * * This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Gen

10、eral Public License version 2 as it under the terms of the GNU General Public License version 2 as * * published by the Free Software Foundation. published by the Free Software Foundation. * * * * Header file for splitting kernel + Header file for splitting kernel + initrdinitrd. Note that we pass.

11、Note that we pass * * r0 through to r3 straight through. r0 through to r3 straight through. * */ /.section .section .start,#alloc,#execinstrstart,#alloc,#execinstr.type.type_entry, #function_entry, #function_entry:_entry:adradrr10, r10, initdatainitdataldrldrr11, r11, initdatainitdatasubsubr11, r10,

12、 r11r11, r10, r11 work out exec offset work out exec offsetb bsplitifysplitify.size.size_entry,. - _entry_entry,. - _entry.type.typeinitdatainitdata, #object, #objectinitdatainitdata: :.word.wordinitdatainitdata compiled address of this compiled address of this.size.sizeinitdatainitdata,. - ,. - ini

13、tdatainitdata.text.textsplitifysplitify: :adradrr13, datar13, dataldmialdmiar13!, r4-r6r13!, r4-r6 move the move the initrdinitrdaddaddr4, r4, r11r4, r4, r11 correction correctionblblmovemoveldmialdmiar13!, r4-r6r13!, r4-r6 then the kernel then the kernelmovmovr12, r5r12, r5addaddr4, r4, r11r4, r4,

14、r11 correction correctionblblmovemove 2006 Embedded/ /* * * * Setup the Setup the initrdinitrd parameters to pass to the kernel. This can either be parameters to pass to the kernel. This can either be * * passed in via a passed in via a param_structparam_struct or a tag list. We spot the or a tag li

15、st. We spot the param_structparam_struct * * method by looking at the first word; this should either indicate a page method by looking at the first word; this should either indicate a page * * size of 4K, 16K or 32K. size of 4K, 16K or 32K. * */ /ldmialdmiar13, r4-r8r13, r4-r8 get size and get size

16、and addraddr of of initrdinitrd r5 = ATAG_INITRD r5 = ATAG_INITRD r6 = r6 = initrdinitrd start start r7 = r7 = initrdinitrd end end r8 = r8 = param_structparam_struct address addressldrldrr9, r8, #0r9, r8, #0 no no paramparam structstruct? ?teqteqr9, #0 x1000r9, #0 x1000 4K? 4K?teqneteqner9, #0 x400

17、0r9, #0 x4000 16K? 16K?teqneteqner9, #0 x8000r9, #0 x8000 32K? 32K?beqbeqparam_structparam_structldrldrr9, r8, #4r9, r8, #4 get first tag get first tagteqteqr9, r4r9, r4bnebnetaglisttaglist ok, we have a tag list ok, we have a tag list/ /* * * * We didnt find a valid tag list - create one. We didnt

18、find a valid tag list - create one. * */ /strstrr4, r8, #4r4, r8, #4movmovr4, #8r4, #8strstrr4, r8, #0r4, r8, #0movmovr4, #0r4, #0strstrr4, r8, #8r4, r8, #8/ /* * * * find the end of the tag list, and then add an INITRD tag on the end. find the end of the tag list, and then add an INITRD tag on the

19、end. * * If there is already an INITRD tag, then we ignore it; the last INITRD If there is already an INITRD tag, then we ignore it; the last INITRD * * tag takes tag takes precidenceprecidence. . * */ / 2006 Embeddedtaglisttaglist: :ldrldrr9, r8, #0r9, r8, #0 tag length tag lengthteqteqr9, #0r9, #0

20、 last tag? last tag?addneaddner8, r8, r9r8, r8, r9bnebnetaglisttaglistmovmovr4, #16r4, #16 length of length of initrdinitrd tag tagmovmovr9, #0r9, #0 end of tag list terminator end of tag list terminatorstmiastmiar8, r4, r5, r6, r7, r9r8, r4, r5, r6, r7, r9movmovpc, r12pc, r12 call kernel call kerne

21、l/ /* * * * We found a We found a paramparam structstruct. Modify the . Modify the paramparam structstruct for the for the initrdinitrd * */ /param_structparam_struct: :addaddr8, r8, #16r8, r8, #16* *4 4stmiastmiar8, r6,r7r8, r6,r7 save in save in param_structparam_structmovmovpc, r12pc, r12 call ke

22、rnel call kernelmove:move:ldmialdmiar4!, r7 - r10r4!, r7 - r10 move 32-bytes at a time move 32-bytes at a timestmiastmiar5!, r7 - r10r5!, r7 - r10ldmialdmiar4!, r7 - r10r4!, r7 - r10stmiastmiar5!, r7 - r10r5!, r7 - r10subssubsr6, r6, #8 r6, r6, #8 * * 4 4bcsbcsmovemovemovmovpc, pc, lrlrdata:data:.wo

23、rd.wordinitrd_startinitrd_start.word.wordinitrd_addrinitrd_addr.word.wordinitrd_leninitrd_len.word.wordkernel_startkernel_start.word.wordkernel_addrkernel_addr.word.wordkernel_lenkernel_len.word.word0 x544100010 x54410001 r4 = ATAG_CORE r4 = ATAG_CORE.word.word0 x544200050 x54420005 r5 = ATAG_INITRD

24、 r5 = ATAG_INITRD.word.wordinitrd_addrinitrd_addr r6 r6.word.wordinitrd_leninitrd_len r7 r7.word.wordparamsparams r8 r8.type.typekernel_start,#objectkernel_start,#object.type.typeinitrd_start,#objectinitrd_start,#object 2006 EmbeddedLinux內核移植內核移植 2 修改根目錄下的Makefile,指定目標平臺和交叉編譯器 ARCH := arm CROSS_COMP

25、ILE = /opt/host/armv4l/bin/armv4l-unknown-linux- 修改/arch/arm下的Makefile,手動增加下面內容: ifeq ($(CONFIG_ARCH_S3C2410),y) TEXTADDR = 0 xC0008000 MACHINE = s3c2410 endif TEXTADDR決定內核起始運行地址,從0 xC0008000開始32M的空間 修改/arch/arm下config.in,make menuconfig菜單中,在2.4.18版本內核中沒有S3C2410處理器,需要加相關信息: if $CONFIG_ARCH_S3C2410 =

26、 y ; then comment S3C2410 Implementation dep_bool SMDK (MERI TECH BOARD) CONFIG_S3C2410_SMDK $CONFIG_ARCH_S3C2410 $CONFIG_ARCH_S3C2400 = y -o $CONFIG_ARCH_S3C2410 = y -o 2006 EmbeddedLinux內核移植內核移植 3 還有以下文件需要修改,具體細節在此不一一列出,請查閱相關資料 arch/arm/boot/Makefile arch/arm/boot/compressed/Makefile arch/arm/boot

27、/compressed/head-s3c2410.S arch/arm/def-configs目錄中復制配置好的config文件 arch/arm/kernel/Makefile arch/arm/kernel/debug-armv.S arch/arm/kernel/entry-armv.S arch/arm/kernel/setup.c arch/arm/mm/mm-armv.c arch/arm/math-s3c2410目錄在2.4.18版內核中沒有,這里都是C語言編寫的程序,是用戶自己添加的有關開放板上USB、電源管理等功能的相關代碼。 2006 Embedded實驗步驟實驗步驟 1-

28、以下步驟在以下步驟在Linux下完成下完成將所需文件copy到工作目錄 mRHEL $ cp -r /arm2410s/exp/bootloader/ /root/embedded 編譯生成bootloader-vivi 在/exp/bootloader/vivi/ 目錄下包含有vivi的源文件 在終端下鍵入make menuconfig,出現vivi的配置菜單,可根據實際情況對vivi的功能進行添加修改,默認的是適合本開發板的。 然后鍵入make 命令,會自動在當前目錄下生成可用的bootloader文件vivi 2006 Embedded 2006 Embedded實驗步驟實驗步驟 2 裁

29、減Linux內核 進入源代碼所在的/root/embedded/kernel-2410s/目錄 在終端下鍵入make menuconfig,出現內核配置菜單,可根據實際情況對內核的功能進行添加修改,默認的是針對本開發板定制的選項。 為了配合下次驅動程序的實驗,在配置內核時,請將觸摸屏驅動的選項設置為M,在make menuconfig中位置如下: Character devices - Mice - UP-NETARM2410 touch screen for ADS7843 support 2006 Embedded 2006 Embedded實驗步驟實驗步驟 3 編譯Linux內核 在./

30、kernel-2410s/目錄下,執行以下幾條命令: make clean 這條命令是在正式編譯內核之前把環境清理干凈,保證沒有不正確的.o文件存在。 make dep 這條命令是編譯相關依賴文件 make zImage 這條命令就是最終的編譯命令。生成的內核文件zImage將會在/kernel-2410s/arch/arm/boot/目錄下 2006 Embedded實驗步驟實驗步驟 4 編譯生成根文件系統 首先將,/root/embedded/develop/root.sh/目錄下面的兩個文件mkcramfs和mkroot.sh拷貝到/develop/目錄下。 然后,將/develop/目

31、錄下的uptech-root.tar文件解壓 tar jxf uptech-root.tar.bz2在/root/embedded/develop/目錄下生成了一個名為root的目錄 在/root/embedded/下建立img目錄來存放將會生成的文件 在/root/embedded/develop/目錄下執行命令./mkroot.sh,生成根文件系統為/root/embedded/img/目錄下的root.cramfs。 2006 Embedded實驗步驟實驗步驟 5-以下步驟在以下步驟在windows下完成下完成 格式化flash 首先將步驟1至4生成的文件vivi、zImage和root

32、.cramfs通過局域網samba服務器或U盤傳到旁邊的windows主機下,將此臺PC通過串口和開發板相連。 Samba服務器的使用 和網上鄰居網上鄰居類似 將redhat的IP地址改到192.168.1.0網段 rootRHEL ifconfig eth0 add 192.168.1.$機器號 打開超級終端,設置好相關參數:波特率為115200,數據位8,無奇偶校驗,停止位為1,無數據流控制。啟動開發板,按除了Enter外的任意鍵進入vivi,按照以下命令格式化flash,重新分區。注意下面的數字注意下面的數字 vivibon part 0 128k 192k 1216k 4288k:m 64704k 2006 Embedded實驗步驟實驗步驟 6 燒寫vivi 這時已格式化flash,運行的是RAM中的vivi,。在超級終端下輸入: viviload flash vivi x 回車 此時超級終端提示: Ready for downloadding using xmodem Waiting $ 點擊超級終端任務欄上“傳送”下拉菜單中的“發送文件”,選擇Xmodem,選擇鏡像文件vivi,點

溫馨提示

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

評論

0/150

提交評論