zoukankan      html  css  js  c++  java
  • linux内核移植过程问题总结

    移植内核:2.6.30.4
    内核根目录下的.config为当前配置内核的且已经配置好的内核配置。make zImage以此为依据
    配置内核的过程:
    cd linux-2.6.30.4(进入Linux根目录)
    cp arch/arm/configs/s3c2410_defconfig /linux-2.6.30.4(作为配置参考,考到根目录下)
    mv s3c2410_defconfig .config(改名为.config)
    make menuconfig ARCH=arm(ARCH=arm不能少)
    配置过程
    退出时记得选yes保存为.config(确保该配置是你已经配置且保存的配置,就算不改动也要保存。否则不能生成.config)
    make zImage ARCH=arm CROSS_COMPILE=arm-linux-(ARCH=arm不可少)


    或者
    Makefile中定于ARCH=arm CROSS_COMPILE=arm-linux-
    1,make s3c2410_defconfig(生成.config)
    2,make zImage 即可生成压缩内核印象




    uboot引导内核,入口点必须为0x30008000
    zImage:go 0x30008000
    uImage:bootm 0x30008000


    busybox下载地址:
    http://busybox.net/




    linux快速修改文件夹及文件下所有文件与文件夹权限
    chmod 777 * -R




    uboot的tftp下载出现如下错误:
    TFTP error: 'Permission denied' (0)
    改正方法就是给待下载的文件加上可执行(chmod 777 文件)权限




    uboot的使用:tftp下载内核,直接用交叉网线连接PC(实际上为虚拟机)和开发板即可
    uboot启动之后,输入:printenv 查看
    serverip是不是你的虚拟机的ip(终端ifconfig即可查看)
    ipaddr要和serverip在同一个网段,即ip的前三段必须相同
    ethaddr:开发板dm9000的MAC物理地址
    netmast:子网掩码:255.255.255.0
    serverip,ipaddr,ethaddr,netmast不符合要求的话,可以使用命令设置:(示例)
    setenv serverip 169.254.209.223
    setenv ipaddr 169.254.209.113
    setenv netmast 255.255.255.0
    setenv ethaddr 00:01:02:03:04:05
    saveenv //设置完毕记得保存环境变量




    uboot启动内核:uboot版本(2009.08)
    条件:uboot的机器码和内核的机器码要一样




    uboot部分修改:
    机器码:
    #gedit board/samsung/my2440/my2440.c 
    gd->bd->bi_arch_number = MACH_TYPE_SMDK2440


    内核部分:内核版本(2.6.30.4)
    #gedit arch/arm/mach-s3c2440/mach-smdk2440.c
    MACHINE_START(SMDK2440, "SMDK2440")


    #gedit arch/arm/kernel/head.S  //在ENTRY(stext)下添加如下代码
    ENTRY(stext)
        mov    r0, #0
        mov    r1, #0x3f0   //上面的MACH_TYPE值1008换成十六进制就是0x3f0
        ldr    r2, =0x30008000




    内核中的nand分区一定要和bootloader中的一致:
    #gedit arch/arm/plat-s3c24xx/common-smdk.c
             offsize       size
    uboot : 0x00000000    0x00030000 //192kb
    param : 0x00030000    0x00040000 //这个环境变量的地址范围配置的CONFIG_ENV_OFFSET一致
    kernel: 0x00080000    0x00500000 //5mb
    root  : 0x00580000    0x0c800000  //200mb


    #gedit uboot/include/cofings/mini2440.h
    查看:MTDPART_DEFAULT = " "   //默认分区


    编译得到内核zImage




    uImage的制作:
    先将u-boot下的tools中的mkimage复制到主机的/usr/local/bin目录下,执行以下命令:
    mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img




    uboot.bin拷贝到XP,用supervivi的a命令下载,开关拨到nand启动
    uImage和根文件系统,考到tftp的收发文件夹,使用tftp服务传送




    在u-boot命令行下输入:(自启动的将内核读入内存)
    set bootcmd 'nand read 0x30008000 内核偏移地址 内核区大小;bootm 0x30008000'
    saveenv  




    把uImage.img用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行图如下:
    tftp 0x30008000 uImage.img  //将uImage.img下载到内存0x30008000处


    nand erase 0x80000 0x500000 //擦除nand的kernel分区(officesize ,size)


    nand write 0x30008000 0x80000 0x500000 //将内存0x30008000处的内容写入到nand的kernel分区


    重启开发板(reset命令),完成内核自启动




    第一个分区(bootloader)对应mtdblock0
    第二个分区(param参数)对应mtdblock1
    第三个分区(kernel)对应mtdblock2
    第四个分区(root根文件系统)对应mtdblock3
    此处的命令参数取代内核配置的boot命令参数,不输入则默认内核的boot参数


    内核自启动yaffs2文件系统:
    uboot命令行下输入:
    set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M
    saveenv




    把root-2.6.30.4.bin用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行图如下:
    tftp 0x30008000 root-2.6.30.4.bin  //将root-2.6.30.4.bin下载到内存0x30008000处


    nand erase 0x00580000  0x0c800000 //擦除nand处0x00380000大小0x0c800000的内容(文件系统分区)


    nand write.yaffs2 0x30008000 0x00580000 rootfs的大小 //将内存0x30008000处的内容写入到nand的0x00380000处
    重启开发板(reset命令),完成内核自启动yaffs2文件系统




    yaffs2文件系统制作注意:
    制作好的文件系统要是2112的整数倍(128MB及以上的flash用mkyaffs2image-128M工具),
    【528的整数倍(64M的flash用mkyaffs2image工具)】
    否则tftp下载到nand的话,会提示attempt to write error length data的错误




    [MY2440] # tftp 0x30008000 root-2.6.30.4.bin
    dm9000 i/o: 0x20000300, id: 0x90000a46 
    DM9000: running in 16 bit mode
    MAC: 08:00:3e:26:0a:5b
    operating at unknown: 0 mode
    Using dm9000 device
    TFTP from server 169.254.209.223; our IP address is 169.254.209.113
    Filename 'root-2.6.30.4.bin'.
    Load address: 0x30008000
    Loading: T T ###################################T #############T #################
             ######################################T ###########################
             #################################################################
             #########################T T ########################################
             #################################################################
             #################################################################
             ###################T #########################
    done
    Bytes transferred = 6359232 (6108c0 hex)
    [MY2440] # nand erase 0x380000 0xc800000


    NAND erase: device 0 offset 0x380000, size 0xc800000
    Erasing at 0xc800000 -- 213254144% complete.
    OK
    [MY2440] # nand write.yaffs2 0x30008000 0x380000 0x6108c0


    NAND write: device 0 offset 0x380000, size 0x6108c0
    Skip the first good block 20000
    Writing at 0x20000 --  6166528 bytes written: OK




    static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
    .name  = "uboot",
    .size  = 0x00000000,
    .offset  = 0x00030000, //192KB
    },
    [1] = {
    .name  = "param",
    .offset = 0x00030000,
    .size  = 0x00040000, //256KB
    },
    [2] = {
    .name  = "kernel",
    .offset = 0x00080000,
    .size  = 0x00500000, //5MB
    },
    [3] = {
    .name  = "root",
    .offset  = 0x00580000,
    .size  = 0x0c800000, //200MB
    }






    Wrong Image Format for bootm command  出错原因:
    1) 未使用uboot中mkimage  工具制作uImage,却使用bootm 启动
    2)   tftp 传送地址错误
    3) nand write 格式和地址错误

    4) nand read 格式和地址错误

  • 相关阅读:
    Hibernate 工作原理及为什么要用
    一款很好用的JQuery dtree树状图插件(一)
    android PopupWindow
    android 截屏工具类
    ubuntu 中文输入法
    Google GCM推送
    windows 安装配置 ant
    (转)Angular中的拦截器Interceptor
    flex 布局 自己做的demo
    flex布局 (转)
  • 原文地址:https://www.cnblogs.com/lvonve/p/8832391.html
Copyright © 2011-2022 走看看