日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          Linux2.6.22內(nèi)核移植

          作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
          平臺(tái):mini2440 交叉工具鏈:arm-linux-gcc-4.3.2
          一、內(nèi)核移植基本知識(shí)
          移植內(nèi)核也叫構(gòu)建BSP(boardsupprot packet)。BSP的作用有兩個(gè):一是為內(nèi)核運(yùn)行提供底層支持,二是屏蔽與板相關(guān)的細(xì)節(jié)。
          BSP的構(gòu)建分三個(gè)層次
          1、體系結(jié)構(gòu)層次
          對(duì)一些體系結(jié)提供linux內(nèi)核支持,比如說(shuō)ARM,X86等芯片。這一類(lèi)工作一般在arc/xxx/下面額除了palt-xxx和mach-xxx目錄的其他目錄完成。
          2、SOC層次
          對(duì)一些公司提供的SOC微處理器提供linux內(nèi)核支持,比如說(shuō)三星公司的 S3C2440。這一類(lèi)工作一般在arch/xxx/plat-xxxxarch/xxx/mach-xxxx目錄下完成。我們可以看到在arch /arm/目錄下同時(shí)有plat-s3c24xx和mach-s3c2440兩個(gè)目錄,這樣做是因?yàn)閜lat-s3c24xx目錄下存放了所有s3c24 系列相同的代碼,mach-s3c2440則只存放了與S3C2440有關(guān)的代碼。
          2,板級(jí)層次
          這是我們一般的菜鳥(niǎo)要做的,上面兩個(gè)層次一般有芯片公司的大牛完成了,但是不同的電路板的板級(jí)層次則需要由我們菜鳥(niǎo)完成的。這一類(lèi)工作主要在mach- xxxx/目錄下面的板文件完成,比如說(shuō)mach-s3c2440/smdk-s3c2440.c這個(gè)S3C2440標(biāo)準(zhǔn)板文件。很多文檔很多書(shū)籍都都直接在這個(gè)文件里面進(jìn)行修改,這樣是不對(duì)的,對(duì)于不同的電路板應(yīng)該建立不同的板文件,比如說(shuō)我的是mini2440,就應(yīng)該建立一個(gè)smdk- mini2440.c文件或者mach-mini2440.c文件在mach-s3c2440下面。如果直接在里面修改是非常不規(guī)范的做法,這樣不是在移植內(nèi)核,這樣是在破壞內(nèi)核!(這一句是宋寶華說(shuō)的)。
          下面開(kāi)始移植。
          二、BSP構(gòu)建
          1.建立板文件支持
          這一步我會(huì)重新建立一個(gè)板文件mach-mini2440.c,而不是直接在smdk-s3c2440.c里面修改,這樣或許麻煩一些,但是為了保持對(duì)內(nèi)核尊重的態(tài)度和規(guī)范的做法,認(rèn)為應(yīng)該這樣做。
          如果我們重新建立一個(gè)空的板文件將會(huì)導(dǎo)致大量的工作量,幸運(yùn)的是smdk-s3c2440.c文件已經(jīng)幫我們做了大量的工作,我們直接拷貝過(guò)來(lái)命名為mach-mini2440.c
          cp arch/arm/mach-s3c2440/smdks3c2440.c arch/arm/mach-s3c2440/mach-mini2440.c
          修改arch/arm/mach-s3c2440/mach-mini2440.c文件將MACHINE_START宏括號(hào)里面的名字換成ID換成 MINI2440,名字隨便取,我們?nèi)?ldquo;MINI2440”,這個(gè)ID最終會(huì)被擴(kuò)展為MACH_TYPE_MINI2440,然后到arch/arm /tools/mach_types里面找對(duì)應(yīng)的ID號(hào),所有做完以這一步我們要在mach_types添加我們機(jī)器的ID
          MACHINE_START(MINI2440,"MINI2440")
          .phys_io = S3C2410_PA_UART,
          .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18)& 0xfffc,
          .boot_params = S3C2410_SDRAM_PA + 0x100,
          .init_irq = s3c24xx_init_irq,
          .map_io = smdk2440_map_io,
          .init_machine = smdk2440_machine_init,
          .timer = &s3c24xx_timer,
          MACHINE_END
          然后在mach_types里面添加我們機(jī)器的ID,再最后一行添加
          mini2440 MACH_MINI2440 MINI2440 1999
          第一個(gè)表示機(jī)器名字,這個(gè)也隨便取,第二個(gè)在Kconfig配置項(xiàng)里面定義的宏名稱(chēng),下面一步我們會(huì)定義到,我們?nèi)∶麨镸ACH_MINI2440,第三表示MACH_START第一個(gè)參數(shù)ID名字,第四個(gè)是ID號(hào)。ID號(hào)我們?nèi)?999。
          修改arch/arm/mach-s3c2440/目錄下的Kconfig和Makefile,以建立內(nèi)核對(duì)板文件的支持使其可以被配置和編譯進(jìn)內(nèi)核。
          首先修改Kconfig,在endmenu之前加入下面的內(nèi)容:
          87 config MACH_MINI2440 // 開(kāi)發(fā)板名稱(chēng)宏定義
          88 bool "mini2440" // 開(kāi)發(fā)板名稱(chēng)
          89 select CPU_S3C2440 // 開(kāi)發(fā)板使用的處理器類(lèi)型
          90 help
          91 Say Y here if you are using the mini2440. // 幫助信息
          再修改Makefile:
          obj-$(CONFIG_MACH_MINI2440)+= mach-mini2440.o
          注意這一行要添加在obj-$(CONFIG_ARCH_S3C2440)+= smdk-s3c2440.o后面,否則會(huì)編譯錯(cuò)誤。
          這樣我們就可以通過(guò)makemenuconfig配置mini2440的板文件是否編譯進(jìn)內(nèi)核。
          我們?cè)偬絣inux-2.6.22目錄,執(zhí)行makemenuconfig
          執(zhí)行加載默認(rèn)配置文件后,可以開(kāi)始配置新增加的菜單。進(jìn)入System Types菜單項(xiàng),打開(kāi)S3C24XX Implementations菜單,出現(xiàn)一個(gè)目標(biāo)開(kāi)發(fā)板的列表:
          [ ] Simtec ElectronicsBAST (EB2410ITX)
          [ ] IPAQ H1940
          [ ] Acer N30
          [ ] SMDK2410/A9M2410
          [ ] SMDK2440
          [ ] AESOP2440
          [ ] Thorcom VR1000
          [ ] HP iPAQ rx3715
          [ ] NexVision OTOM Board
          [ ] NexVision NEXCODER2440 Light Board
          [ ] mini2440
          選中mini2440選項(xiàng)
          然后執(zhí)行makezImage,如果能夠正常編譯,已經(jīng)能夠?qū)ini2440板文件編譯進(jìn)內(nèi)核了。如果不行,請(qǐng)檢查上述步驟。
          2.修改機(jī)器碼
          將編譯在arch/arm/boot下面生成的zImage燒寫(xiě)到nand的kernel分區(qū),然后啟動(dòng)。
          Copylinux kernel from 0x00060000 to 0x30008000, size = 0x00500000 ... done
          zImage magic = 0x016f2818
          Setup linux parameters at 0x30000100
          linux command line is: "console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.101:/home/work/shiyan/rootfsip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0:mini2440:eth0:off"
          MACH_TYPE = 362
          NOW, Booting Linux......
          UncompressingLinux.................................................................................................done, booting the kernel.
          Error: unrecognized/unsupported machine ID (r1 = 0x0000016a).
          內(nèi)核提示不能識(shí)別的機(jī)器ID,于是修改bootloader的參數(shù)使其機(jī)器ID為1999,我用的是supervivi使用命令:
          set parammach_type 1999
          3.修改時(shí)鐘源頻率
          啟動(dòng)內(nèi)核,出現(xiàn)一系列的亂碼,這是因?yàn)闀r(shí)鐘源設(shè)置的不對(duì),我的開(kāi)發(fā)板用的是12M的晶振,所以在arch/arm/mach-s3c2440.c的 s3c24xx_init_clocks(16934400);處將16924400修改為12000000。即改為 s3c24xx_init_clocks(12000000);
          4.添加nand分區(qū)信息
          再啟動(dòng),發(fā)現(xiàn)還是不能啟動(dòng),這是因?yàn)閮?nèi)核中填寫(xiě)的nand分區(qū)信息不對(duì)。于是修改nand分區(qū)信息,很多人的做法是直接修改arch/arm /plat-s3c24xx/Common-smdk.c文件里面的smdk_default_nand_part數(shù)據(jù)結(jié)構(gòu),這樣是不提倡的做法,因?yàn)檫€是那句話(huà),破壞了內(nèi)核。我們應(yīng)該再arch/arm/mach-s3c2440/mach-mini2440.c文件中建立我們自己板文件的nand信息。我們?cè)趍ach-mini2440.c的staticstruct platform_device *smdk2440_devices[]前面添加
          static struct mtd_partition smdk_default_nand_part[] = {
          //這里面填的是我用的mini2440分區(qū)信息//
          [0] = {
          .name = "patition1 supervivi",
          .size = 0x00040000,
          .offset = 0,
          },
          [1] = {
          .name = "patition2 param",
          .offset =0x00040000,
          .size = 0x00020000,
          },
          [2] = {
          .name = "patition3 kernel",
          .offset =0x00060000,
          .size = 0x00500000,
          },
          [3] = {
          .name = "patition4 root",
          .offset = 0x00560000,
          .size = 64*1024*1024,
          },
          [4] = {
          .name = "patition5 nand",
          .offset = 0,
          .size = 64*1024*1024,
          },
          };
          static struct s3c2410_nand_set smdk_nand_sets[] = {
          [0] = {
          .name = "NAND",
          .nr_chips = 1,
          .nr_partitions = ARRAY_SIZE(smdk_default_nand_part),
          .partitions = smdk_default_nand_part,
          },
          };
          再修改mach-mini2440.c的smdk2440_machine_init函數(shù),將我們的nand傳給給nand設(shè)備
          static void __init smdk2440_machine_init(void)
          {
          s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);
          //將我們的nand信息傳給nand設(shè)備//
          s3c_device_nand.dev.platform_data= &smdk_nand_info; //set nand infoto nand
          platform_add_devices(smdk2440_devices,ARRAY_SIZE(smdk2440_devices));
          //smdk_machine_init();
          //smdk_machine_init()函數(shù)屏蔽,因?yàn)樗麜?huì)將arch/arm/plat-s3c24xx/Common-smdk.c里面的分區(qū)信息傳給nand,這樣我們的自己的nand信息就被覆蓋了
          s3c2410_pm_init();//添加加這個(gè)函數(shù)是因?yàn)閟mdk_machine_init()里面調(diào)用了。
          }
          再修改mach-mini2440.c的smdk2440_devices
          static struct platform_device *smdk2440_devices[] __initdata = {
          &s3c_device_usb,
          &s3c_device_lcd,
          &s3c_device_nand,//向內(nèi)核添加nand設(shè)備
          &s3c_device_wdt,
          &s3c_device_i2c,
          &s3c_device_iis,
          };
          6.添加YAFFS文件系統(tǒng)支持
          完成上述步驟工作后,還是不能正常掛載根文件系統(tǒng),因?yàn)閮?nèi)核還沒(méi)對(duì)yaffs文件系統(tǒng)進(jìn)行支持。
          下載cvs-root-yaffs.tar.gz補(bǔ)丁包文件,解壓,運(yùn)行yaffs2文件夾里面的腳本文件patch-ker.sh來(lái)給內(nèi)核打補(bǔ)丁,用法如下
          Usage: ./patch-ker.sh c/l kernelpath
          if c/l is c,then copy, if l then link
          如果是l則yaffs2源碼被鏈接到內(nèi)核,如果是c則復(fù)制
          我們運(yùn)行./patch-ker.sh c work/kernel_make/linux2.6.22
          給內(nèi)核打上yaffs2補(bǔ)丁,然后使用makemenuconfig配置內(nèi)核使其支持yaffs2文件系統(tǒng)
          File systems --->
          Miscellaneous filesystems --->
          <*>YAFFS2 file system support
          7.配置內(nèi)核支持EABI接口
          完成上面的步驟之后運(yùn)行,內(nèi)核會(huì)在輸出
          VFS: Mounted root (yaffs filesystem) on device 31:2.
          Freeing init memory: 132K
          之后卡住,這個(gè)打印反應(yīng)出內(nèi)核實(shí)際上已經(jīng)掛接上了根文件系統(tǒng),之所以卡在這里是因?yàn)闊o(wú)法啟動(dòng)根文件系統(tǒng)上的init進(jìn)程。是由于內(nèi)核和根文件系統(tǒng)的應(yīng)用程序的接口不一致。所以在內(nèi)核中使用make menuconfig配置EABI支持
          Kernel Features --->
          Memory split...--->
          [ ]preemptible Kernel...
          [*]Use the ARM EABI to compile thekernel
          [*] Allow old ABI binaries to run......
          Memory model(flatMemory)--->
          [ ]Add lru list to tarcknon-evictable pages


          關(guān)鍵詞: Linux2.6.22內(nèi)核移

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉