Linux内核

内核启动流程分析:
    解压缩
    打补丁
    配置
        make menuconfig
            在arch/arm/configs目录中的配置文件
        使用默认配置 在上面修改
        使用厂家提供的补丁
        
        .config =>  autoconf.h
                    auto.conf
    编译
        生成u-image(真正内核的头部)
        obj -y +=xxx.o 编译进内核
        obj -m +=xxx.o 编译成.ko文件 可加载文件
        obj -$(config_DM9000) += dm9000.o
        
        obj -m += ab.o
        ad-dbls := a.o b.o
    分析Makefile:
        子目录Makefile
        架构Makefile
        通用Makefile
        顶层Makefile
        
        u-image : vmlinux
        vmlinux : $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
            vmlinux-init := $(head-y) $(init-y)
                head-y := arch/arm/kernel/head$(MMUEXT).o arch/kernel/init_task.o
                init-y := init/
                init-y := $(patsubst %/, %/built-in.o, $(init-y)) = init/built-in.o
            vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
                core-y := usr/
                core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
                core-y := $(patsubst %/, %/ built-in.o, $(core-y))
                        = usr/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/ built-in.o security/built-in.o crypto/built-in.o block/built-in.o
                libs-y := lib/lib.a lib/built-in.o
                drivers-y := drivers/built-in.o sound/built-in.o
                net-y := net/built-in.o
            vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
            vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds
        
        第一个文件:arch/arm/kernel/head.S
        链接脚本:arch/arm/kernel/vmlinux.lds
        
    内核启动:
        处理uboot传入的参数
        判断是否支持这个CPU
            判断是否支持这个单板 uboot启动时传入的ID
            建立页表
            使能MMU    跳转到start_kernel(内核的第一个C函数)
        
        内核启动流程:
        start_kernel
            setup_arch
            setup_command_line
            parse_early_param
                do_early_param
                    从__setup_start到__setup_end, 调用do_early_param函数
            unknown_bootoption
                obsolete_checksetup
                    从__setup_start到__setup_end, 调用do_early_param函数
            reset_init
                kernel_init
                    prepare_namespace
                        mount_root     //挂接根文件系统
                    init_post        //执行应用程序

        挂接根文件系统
        启动应用程序
    


    
移植最新的linux内核:

内核框架介绍:
    1.内核启动流程,据此配置内核(机器ID)
    1.1 修改Makefile
    1.2 选择默认配置:make s3c2410_defconfig
    1.3 make uImage

    uboot的默认MACH ID
    gd->bd->bi_arch_number = MACH_TYPE_SMDK_2410 //193
    如果s = getenv("machid");成功 则使用 否则使用默认
    
    cd /work/system/
    rm -rf linux-3.4.2
    tar xjf linux-3.4.2.tar.bz2
    cd linux-3.4.2 vifind -name "*default_config"
    ls "2440"
    ls "2410"
    ../../../
    make s3c2410_defconfig
    vi .config
    make uImage
    cp arch/arm/boot/uImage /work/nfs_root/uImage_new
    
    /*使用默认的*/
    nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new
    bootm 32000000
    
    set machid 16a //mach-smdk2440.c
    save
    
    set bootargs console=ttySAC0, 115200 root=/dev/mtdblock3
    save
    
修改分区及制作根文件系统:
    nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev.yaffs2
    nand erase.part rootfs
    nand write.yaffs 30000000 260000 889bc0
    
    nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev jffs2
    nand erase.part rootfs
    nand write.jffs 30000000 260000 $filesize
    set bootargs console=ttySAC0,115200 root =/dev/mtblock3 rootfstype=jffs2
    
    echo $PATH
    find -name lib
    
    交叉编译busybox
        安装:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new
    
    安装库:
        mkdir /work/nfs_root/fs_mini_mdev_new/lib
        cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -p
        
        cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -p
         
        makfs.jffs2 -n -s 2048 -e 128kiB -d fs_mini_mdev_new.jffs2
        
    构建etc目录
    构建dev目录
    其他空目录
        
        烧写:
        nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.jffs2
        nand erase.part rootfs
        nand write.jffs2 30000000 260000 $filesize
        set bootargs console=ttySAC0, 115200 root=/dev/mtdblock3 rootfstype=jffs2
        nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new
        bootm 32000000
        
        SIGILL illegal instruction
        重新配置内核支持EABI
        set bootargs console=ttySAC0, 115200 root=/dev/mtdblock3 rootfstype=jffs2
        nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new
        bootm 32000000
        
移植yaffs根文件系统:
    yaffs2根文件系统更适用于NAND FLASH
    获取源码:
        sudo apt-install git^C
        git clone git://www.alephl.co.uk/yaffs2
        cd yaffs^C
        cd yaffs/yaffs2
        vi readme
    打补丁:
        cd yaffs-dir
        ./patch-ker.sh c m /linux-tree :./patch-ker.sh c m work/system/linux-3.4.2
        cd work/system/linux-3.4.2
        ls
        make menuconfig
        yaffs
    编译执行:
        make uImage
        出现的错误是:很多结构体成员前没有加下划线
    烧写YAFFS映像:
        cp arch/arm/boot/uImage /work/nfs_root/uImage_yaffs
        mkyaffs2image fs_mini_mdev_new
        reboot
        
        nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.yaffs2
        nand erase.part rootfs
        nand write.yaffs 30000000 260000 $filesize
    启动:
        set bootargs console=ttySAC0, 115200 root=/dev/mtdblock3
        nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs
        bootm 32000000
    没成功,用替代法查找问题:
        UBOOT有问题:
            tftp 30000000 u-boot.bin
            nand erase.part u-boot
            nand write 30000000 u-boot
            reset
            fs 32000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.yaffs2
            nand erase rootfs
            nand write.yaffs 30000000 260000 $(filesize)
            set bootargs console=ttySAC0, 115200 root=/dev/mtdblock3
            nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs
            bootm 32000000
        YAFFS有问题:
            UBOOT有问题 替换之后成功
            
内核裁剪及ECC简介与制作补丁:
    去掉不需要的单板:
        cd ..
        cd linux-3.4.2
        ls arch/arm/boot/uImage -l
        make menuconfig
        cd /work/system/linux-3.4.2
        vi .config
        输入 / 搜索
        
        make uImage
        
        cd ..
        cd u-boot-3.4.2$ cd..
        cd u-boot-2012.04.01
        make disclean
        ls
        cd..
        rm -rf u-boot-2012.04.01_100ask/
        mv u-boot-2012.04.01 u-boot-2012.04.01_100ask
        tar xjf u-boot-2012.04.01_100ask.tar.bz2
        diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask.patch
        
        //看看
        cd yaffs/yaffs2
        cd utils/
        ls
        
    ECC:
        256bit生成3字节ECC OOB用不完
        
    去掉不需要的模块
        
移植驱动支持DM9000:
    set machid 16a
    
    mount -t nfs -o nolock, vers=2 192.168.1.123:/work/nfs_root/fs_mini_mdev_new/mnt
    
    mkdir 17th_dm9000c
    vi Makefile
     
    nfs 30000000 192.168.1.123:/work/nfs_root/uImage_net_new;
    bootm 30000000
    
    set bootargs console=ttySAC0, 115200 root=/dev/nfs nfsroot=192.168.1.123:/work/nfs_root/fs_mini_mdev
    
移植内核支持LED和按键:
    编译
    解决错误
    头文件不对 去掉或者改名
    宏不对 改名或者使用新宏
    有些函数没有了 改名使用新函数

    直接把二期写的LED和按键驱动代码放到内核里面编译
    
    vi Makefile
    make
    ...
    cp first_drv.ko /work/nfs_root/fs_mini_mdev_new
    arm-linux-gcc -o firstdrvtest firstdrvtest.c
    cp firstdrvtest.c /work/nfs_root/fs_mini_mdev_new
    insmod first_drv.ko

    ./firstdrvtest
    ls -l
    on
    off
    
移植内核之块设备和虚拟网卡:
    nand
    nor
    编译有错误
    从第一个错误开始解决
    参考 参考 参考 内核已有代码
    
移植内核之LCD及输入系统:
    fb_test
    tslib
    
    
    
    
    
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值