2.6.13.4內核移植:
內核移植的目標:儘可能多的支持開發板上的設備,(最大化,是全化) 移植前的準備工作: 1. 安裝交叉編譯器,2.6內核需要3.0以上的編譯器。 2. 設置PATH環境變量export PATH=/usr/local/arm/3.4.1(編譯器版本)/bin:$PATH 3. 解壓內核 4. 修改內核根目錄下的Makefile文件(170行)會發現 SUBARCH :=$(shell uname –m | sed –e s/i.86/i386/ -e s/sun4u/sparc64/…)等三行代碼,將170,171,172三行代碼註釋掉(前面加#) 5. 在內核根目錄下的Makefile文件中指定要用到的編譯器和架構(arch),方法:在第194行添加代碼 ,將ARCH ?=(SUBARCH) 改爲, ARCH ?=arm CROSS_COMPILE ?=arm-linux- 6. 修改默認內核配置文件(./.config)拷貝 cp arch/arm/configs/smdk2410_defconfig ./.config 裁剪內核:make menuconfig 1. 檢查系統類型是不是s3c2410 選項:System Type ,確定 S3C2410 DMA support被選中(此項不選在聲卡驅動的加載是容易出錯。)確定Support Thumb user binaries被選中。 2. 檢查模塊加載支持(系統是否允許自動加載模塊),這一項很重要 Loadable module support-> 下,確保Enable loadable module support 和Automatic kernel module loading被選中。 3. 支持浮點運算,進入Floating point emulation -> 選中NWFPE math emulation被選中。 4. 對可執行文件進行支持 Userspace binary formats -> 確保Kernel support for ELF binaries 和Kernel support for a.out and ECOFF binaries 被選中。 5. 網絡支持 Networking -> 選中 Networking support ,然後選擇Networking options -> 下的 Unix domain sockets(支持unix網絡) TCP/IP network 選中它下面的IP:Kernel level autoconfiguration 再選中它下面的IP:BOOTP support 6. 內存技術設備支持 Device Drivers -> Memory Technology Devices (MTD) -> 選中 Memory Technology Device (MTD) support 、MTD partitioning support(MTD分區支持) 、Command line partition table parsing(命令行分區支持) 、 Direct char device access to MTD devices(允許以字符設備方式訪問內存技術設備) 、 Caching block device access to MTD devices 7. make zImage 進行編譯,將內核複製到開發板上會發現不能正常運行,因 爲還沒有配置文件系統,繼續執行make menuconfig 選擇File systems-> 去除這一項下面的 Second extended fs support (擴展分區支持)和 Rom file system support (ROM文件系統支持,我們這裏使用nand flash)兩項的選擇。 7. 選擇File systems -> Pseudo filesystems -> 下面的/dev file system support (OBSOLETE) 、Auto matically mount at root 、/proc file system support(支持內核鏡像)、Virtual memory file system support (former shm fs) (虛擬內存文件系統) 8. 設備的支持 選擇Device Drivers -> Memory Technology Devices (MTD) -> ARM/ROM/Flash chip drivers -> 下面的 Detect flash chips by Common Flash Interface (CFI) probe (flash通用芯片接口) 、Detect non-CFI AMD/JEDEC-compatible flash chips(非CFI接口芯片支持) 、Support for Intel/Sharp flash chips 、 Support for AMD/Fujitsu flash chips(富士通Flash芯片支持) 、Support for RAM chips in bus mapping (支持RAM芯片總線映射) 、Support for ROM chips in bus mapping(…ROM…)。 9. 支持 2410/2440 Nand flash 設備 Device Drivers -> NAND Flash Device Drivers -> 選中NAND Device Support 和 NAND Flash support for S3C2410/S3C2410/S3C2440 SoC 10. 支持塊設備 Device Drivers -> Block devices -> 選擇下面的 RAM disk support 選擇Device Drivers -> Character devices -> 下的 Non-standard serial port support (支持非標準串口)、Legacy (BSD) PTY support(虛擬終端支持) 、S3C2410 RTC Driver(支持實時時鐘) 11. 文件系統支持 File systems -> Miscellaneous filesystems -> 選中Compressed ROM file system support (cramfs)(cramfs支持) 12. File systems -> Network File Systms -> 選中NFS file system support 、Provide NFSv3 client support 、Provide client support for the NFSv3 ACL protocol extension (NFS擴展) 、Root file system on NFS 13. 編譯: make zImage 將生成的內核放到開發板上運行,會發現提示,找不到/dev文件系統,必須修改內核使它支持 /dev 文件系統纔可以進行網絡引導。 linux的內核目錄結構: 1、 arch目錄 硬件體系結構相關的核心代碼 (arm)下 arch/arm 2、 include 核心頭文件,每一個體繫結構就會有一個對應的目錄 3、 init 內核的核心啓動代碼 4、 ipc進程以及進程間通信相關代碼 5、 mm內存管理部分的代碼 6、 drivers 驅動程序目錄(每個設備,在其中都有文件) 7、 modules 放置已經編譯好的模塊(可缷載模塊) 8、 fs linux 文件系統支持代碼 9、 kernel 主要核心代碼(與處理器結構無關) 10、 arch/架構名/kernel 主要核心代碼(與處理器結構相關) 11、 net 核心網絡代碼 12、 lib 核心庫代碼 13、 scripts內核配置腳本 (make menuconfig) 14、 Documentation 內核編譯原理: MakeFile 與 Kconfig : 剛開始配置內核的時候,就知道在內核的根目錄下有一個Makefile文件,同樣缺少一個 .config文件(需要從arch/arm/mach-s3c2410裏面拷貝smdk2410-defconfig來代替)其實在每一級子目錄下都有 Makefile和Kconfig兩個文件,我們之所以每次用make menuconfig配置後都會將選擇到的模塊編入zImage中就是因爲有Kconfig的存在,所有配置的菜單選項都保存在Kconfig中,每當我 們在配置中選擇了某個模塊後,將會生成.config文件,.config文件的作用就是傳遞Makefile信息,它會將配置信息傳遞給模塊文件所在目 錄的Makefile,在Makefile中會選擇添加模塊的文件。每次執行內核編譯時,根目錄下的Makefile將會檢查各個子目錄中的 Makefile,如果使用者做了修改,就會重新編譯修改過的內容。這樣我們往內核中添加自己編寫的模塊時(如,按鍵驅動,聲卡驅動,led燈驅動)首先 要修改驅動存放目錄下的Kconfig文件,添加菜單選項,然後make menuconfig,選中新添加的模塊,還要修改驅動存放目錄下的Makefile文件,添加模塊編譯的目錄和依賴信息。 Kconfig的語法(菜單): config 字符串(和宏名一樣的命名規則,要求見名知意,如S3C2410_LEDS) bool “配置菜單名如s3c2410 leds driver”(全稱爲boolean <>可有編譯到內核(*)編譯成可缷載的模塊(M) 不選三種情況) tristate “配置菜單名如s3c2410 leds driver”(含義 []可有編譯到內核(*)不選二種情況。 depends on 宏名(與上面config中的命名規則一樣,無“”號)” 含義:依賴,本菜單選項的選擇依賴哪些其它的菜單選項。 help 後加此模塊的說明,作用,功能,注意事項,出於什麼目的,時間修改 將Kconfig與 .config 聯繫起來: 修改當前目錄下的Makefile 文件, 仿照其它選項添加一行:obj-$(CONFIG_上面config後中的宏名,例如 CONFIG_S3C2410_LEDS)+=設備驅動模塊名(如s3c2410_led.o) 然後再執行make zImage 重新編譯就可以將添加的模塊加入到zImage中。 支持/dev文件系統: 2.6內核不支持/dev文件系統,但保留代碼 一.代碼級移植 1.nand flash 分區支持 前面已經在u-boot中添加了nandflash的定義,這裏在內核中對nand flash進行分區。修改arch/arm/mach-s3c2410/devs.c 文件,需要添加三個頭文件 Linux/mtd/partitions.h linux/mtd/nand.h asm/arch/nand.h 在第48行左右加入分區結構體數組,由自己定義分區的名字,大小等。一般要分四個區,引導區,內核區,文件系統,用戶區。加入代碼如下: Static struct mtd_partition partition_info[]={ { name : “bootloader”, size : 0x100000, offset : 0x0, }, { name : “kernel”, size : 0x300000, offset : 0x100000, }, { name : “root”, size : 0x2800000, offset : 0x400000, }, { name : “user”, size : 0x1400000, offset : 0x2c00000, }, }; Struct s3c2410_nand_set nandset = { nr_partitions : 4, partitions : partition_info, }; 時序要自己定義 查找芯片手冊第218頁,定義一個結構體,設置時序,繼續添加代碼: Struct s3c2410_platform_nand superlpplatform = { tacls : 0, twrph0 : 30, twrph1 : 0, sets : &nandset, nr_sets : 1, }; 在(大約147行)s3c_device_nand={ 增加一行: .dev = {.platform_data=&superlpplaform,}, };(.dev成員也是結構體) 將結構體添加到linux設備映射表當中,內核啓動時初始化nand設備。 添加到 (arch/arm/mach-s3c2410/mach-smdk2410.c) 查找platform_device (大約90行)在 &s3c_device_iis, 下添加:&s3c_device_nand, 內核默認有ecc校驗,但nandflash不支持,所以要關閉nand flash的ecc校驗,修改(driver/mtd/nand/s3c2410 |
2.6內核裁剪配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.