内核启动流程分析:
解压缩
打补丁
配置
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