linux内核学习补充(针对JZ2440和linux3.4.2)
来源:互联网 发布:淘宝差评怎么办 编辑:程序博客网 时间:2024/06/08 18:19
1、使用已经制作好补丁的内核(已经有补丁的情况下)
(1)打补丁: patch -p1 < ../linux-3.4.2_100ask.patch
(2)make menuconfig
(3) (cp config_ok .config)
当我使用patch命令补丁一个linux内核时,提示:
patching file arch/arm/mach-at91/at91rm9200_time.c
Reversed (or previously applied) patch detected! Assume -R? [n]
这里可以看出它提示的是补丁已经被侦测到(可能是以前已经打过该补丁了),那后面的-R?是要询问什么
输入n,表示什么意思:是表示卸载该补丁的更改(反向来补丁),还是放弃再次重复补丁,抑或是再次覆盖该补丁内容?
第一个选择是你是不是想还原,如果选n,那么代表不还原,接下来就询问是不是还是要应用该补丁.patching file arch/arm/mach-at91/at91rm9200_time.c
Reversed (or previously applied) patch detected! Assume -R? [n]
这里可以看出它提示的是补丁已经被侦测到(可能是以前已经打过该补丁了),那后面的-R?是要询问什么
输入n,表示什么意思:是表示卸载该补丁的更改(反向来补丁),还是放弃再次重复补丁,抑或是再次覆盖该补丁内容?
(4)make uImage (修改晶振时钟)
2、嵌入式linux启动相关:
bootloader 1、内核 -》内存
2、设置TAG参数
3、启动 R0 =0 ,R1=机器ID, R2=TAG参数地址
内核 1、根据R1判断能否支持该机器,调用机器相关的初始化函数
2、解析TAG参数
3、装载驱动
4、挂接根文件系统
5、启动应用程序
3、怎么使用新内核(没有补丁的情况)
(1)修改makefile,主目录下的Makefile .(ARCH=arm CROSS_COMPILE =arm-linux-)
(2)修改配置文件,配置项位于/arch/arm/configs目录下 make s3c2410_defconfig
在/目录下可以查看 .config文件 中支持的配置文件
(3)make uImage
4、NFS挂载
nfs 32000000 192.168.3.16:/home/edu/share/work/nfs_root/uImage_new
以上是我的nfs挂载目录,其实我也是第一次挂载NFS成功,好的如果有以下entire肯定是修改某些地方的 、、ERROR: Cannot umount
根据网上的解说:
在uboot中通过nfs挂在内核到内存中出错:
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#####################################*** ERROR: Cannot umount
解决办法:
在主机的/etc/hosts文件中增加一行名称解析內容:
目标板IP 根文件系统文件名
比如:我的/etc/hosts增加后变为:
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#####################################*** ERROR: Cannot umount
解决办法:
在主机的/etc/hosts文件中增加一行名称解析內容:
目标板IP 根文件系统文件名
比如:我的/etc/hosts增加后变为:
127.0.0.1 localhost127.0.1.1 zhu
#增加下面这句:目标板IP, nfs共享文件夹192.168.0.111 /home/zac/nfsboot/# The following lines are desirable for IPv6 capable hosts::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allroutersff02::3 ip6-allhosts
5、uboot的默认MACH ID:(设置机器ID)
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // 193
如果s = getenv("machid");成功,则使用它
否则使用默认的
set machid 16a // smdk2440 mach-smdk2440.c
set machid 7CF // mini2440 mach-mini2440.c
在UBOOT里:
set machid 16a // smdk2440 mach-smdk2440.c
或
set machid 7CF // mini2440 mach-mini2440.c
6、防止乱码,
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
查看内核源码是时钟未设置正确:
arch\arm\mach-s3c24xx\mach-smdk2440.c
s3c24xx_init_clocks(16934400);
改为
s3c24xx_init_clocks(12000000);
7、修改分区挂接根文件系统
/arch/arm/mach_24XX/common_smdk.c
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
};
分好区之后的:
0x000000000000-0x000000040000 : "Bootloader"
0x000000040000-0x000000060000 : "params"
0x000000060000-0x000000260000 : "kernel"
0x000000260000-0x000010000000 : "rootfs"
挂接根文件系统:
nfs 30000000 192.168.3.16:/home/edu/share/work/nfs_root/fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 889bc0
nfs 30000000 192.168.3.16:/home/edu/share/work/nfs_root/fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
8、构建根文件系统
(1)安装busybox;
make menuconfig ->添加编译器 如果需要修改什么命令可以再busybox中修改
安装:make install CONFIG_PREFIX=/home/edu/share/work/nfs_root/fs_mini_mdev_new
(2)安装库
mkdir /home/edu/share/work/nfs_root/fs_mini_mdev_new/lib
mkdir /home/edu/share/work/nfs_root/fs_mini_mdev_new/usr/lib -p
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /home/edu/share/work/nfs_root/fs_mini_mdev_new/lib -d
//-d 表示原来是连接文件现在也当做连接文件拷贝过来
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /home/edu/share//work/nfs_root/fs_mini_mdev_new/usr/lib -d
(3)创建一些必须的目录
创建dev 目录
mkdir dev
创建设备节点:sudo mknod null c 1 3
sudo mknod condole c 5 1
sduo mknod ttySAC0 c 204 64
sudo mknod mtdblock0 b 31 0
sudo mknod mtdblock1 b 31 1
创建etc/目录
创建 init.d \rcs文件
#!/bin/sh
ifconfig eth0 192.168.3.18
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
inittab 文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
fstab 文件
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
创建其他目录:
(4) 制作jffs2文件:
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
制作烧写后 存在错误。SIGILL =4;
重新配置内核支持EABI
make menuconfig -> Kernel Features -> Use the arm EABI ....
->make uImage
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.1.123:/work/nfs_root/uImage_eabi
bootm 32000000
(5)制作.移植YAFFS文件
1. 获得源码
git clone git://www.aleph1.co.uk/yaffs2
2. 打补丁
cd yaffs2
./patch-ker.sh c m /home/edu/share/work/linux_kernel/linux-3.4.2
3. 配置内核支持YAFFS
7. 没成功,用替代法查找问题
7.1 UBOOT可能有问题:换上1.1.6的UBOOT
tftp 30000000 u-boot.bin
nand erase.part u-boot
nand write 30000000 u-boot
reset
nfs 30000000 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
发现1.1.6的UBOOT没问题,所以就是我们移植的新UBOOT有BUG:
drivers\mtd\nand\Nand_util.c
if (!need_skip && !(flags & WITH_DROP_FFS)) {
改为
if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) {
7.2 YAFFS映象可能有问题
制作了u-boot_new.bin, uImage_new, fs_mini_mdev_new.yaffs
重烧整个系统:
使用jtag工具烧u-boot_new.bin
或使用uboot来更新自己: tftp 30000000 u-boot_new.bin; nand erase.part u-boot; nand write 30000000 u-boot
启动uboot,用它来烧写内核、FS
tftp 30000000 uImage_new; nand erase.part kernel; nand write 30000000 kernel
tftp 30000000 fs_mini_mdev_new.yaffs2; nand erase.part rootfs; nand write.yaffs 30000000 260000 $filesize
设置参数
set 'nand read 30000000 kernel;bootm 30000000'
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
set machid 16a
save
使用内核补丁:
patch -p1 < ../linux-3.4.2_100ask.patch
cp config_ok .config
make uImage
8、linux剪裁
vi .config
根据.config文件选择要剪裁的文件,在menuconfig中。
nandflash在读写操作的时候经常回发生位翻转,例如某位读1,出来0.
写:写页数据
生成ECC
把ECC写入OOB
读:读页数据
读页数据的时候得到OOB
生成ECC
比较ECC
(1)根据内核打印信息剪裁文件,吧没用的去掉 例如ps2 mice Keyboards
vi .config
CONFIG_S3C2440_XTAL_16934400
CONFIG_TOUCHSCREEN_USB
CONFIG_SSB_POSSIBLE
CONFIG_BCMA_POSSIBLE
CONFIG_SND_USB / /USB声卡
9移植所有驱动到linux——kernel
0 0
- linux内核学习补充(针对JZ2440和linux3.4.2)
- 基于JZ2440移植Linux3.4.2内核版本完整搭建笔记
- JZ2440:编译linux内核
- linux内核中的xx_initcall和module_init实现机制(linux3.1.0)
- 05-S3C2440学习之内核(移植)linux3.4.2移植(2)之yffs2文件系统移植+内核裁剪+内核制作补丁
- 05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动
- AM335X 串口驱动学习(1)-基于linux3.8内核
- AM335X 串口驱动学习(2)-基于linux3.8内核
- linux-3.4.2内核移植到jz2440
- 移植Linux3.4.2版本内核到mini2440(一)
- 调试linux内核环境搭建方法(ddd+busybox+qemu+linux3.5.4内核)
- 1.linux3.8.4内核编译和安装
- 05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统
- 05-S3C2440学习之内核(移植)linux3.4.2移植(3)之支持DM9000C网卡及修改支持串口2
- linux内核调试方法(待补充)
- Linux Complete Fair Scheduler (CFS) 进程调度器学习笔记(针对内核版本3.6.11)
- 移植Linux3.4.2版本内核到mini2440
- linux3.4.2内核定时器time_list的使用
- PAT A 1084. Broken Keyboard (20)
- 2014年唯品会技术类面试题目
- 添加外键约束时需要注意的地方
- 测试博客
- 研究社阶段研究的东西(待写……)
- linux内核学习补充(针对JZ2440和linux3.4.2)
- 数据结构--基本排序算法
- Android开发入门:样式和主题(Styles and Themes)
- 8086汇编语言入门之数据和前奏
- 使用Golang实现的快速排序
- 图片转base64字符串
- How to tune a new closeloop vcm, for instance, LC898214?
- [mahout in action] 调通第一个例子
- OCaml安装