2.6內核裁剪配置

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章