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,那么代表不还原,接下来就询问是不是还是要应用该补丁.
(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增加后变为:

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
原创粉丝点击