yaffs2的补丁文件patch-ker分析
為內核打上yaffs2 補丁
(1)將yaffs2代碼加入內核
這可以通過yaffs2目錄下的腳本文件patch-ker.sh來給內核打補丁,用法如下:
usage: ./patch-ker.sh c/l kernelpath
if c/l is c, then copy. if l then link.
這表明,如果c/l是c,則yaffs2的代碼會被復制到內核目錄下,如果是l,則在內核的目錄下創建一些鏈接文件。這里yaff2所在的目錄/root/linux-test/,和linux-2.6.32.2在同一個目錄下,執行如下命令打補丁:
[root@localhost yaffs2]# ./patch-ker.sh c /root/linux-test/linux-2.6.32.2
usage: ./patch-ker.sh c/l m/s kernelpath
if c/l is c, then copy. If l then link
if m/s is m, then use multi version code. If s then use single version code
[root@localhost yaffs2]# ./patch-ker.sh c s /root/linux-test/linux-2.6.32.2
*** Warning ***
You have chosen to use the single kernel variant of the yaffs VFS glue code
that only works with the latest Linux kernel tree. If you are using an older
version of Linux then you probably wanted to use the multi-version variant by
re-running the patch-ker.sh script using m as a the second argument.
ie ./patch-ker.sh c m /root/linux-test/linux-2.6.32.2
Updating /root/linux-test/linux-2.6.32.2/fs/Kconfig
Updating /root/linux-test/linux-2.6.32.2/fs/Makefile
[root@localhost yaffs2]#
注意第二個參數m/s,如果不指定,有時會執行失敗。
上述命令完成下面三件事:
<1>修改內核文件/fs/Kconfig,增加下面兩行(在177行附近):
if MISC_FILESYSTEMS
source "fs/adfs/Kconfig"
source "fs/affs/Kconfig"
source "fs/ecryptfs/Kconfig"
source "fs/hfs/Kconfig"
source "fs/hfsplus/Kconfig"
source "fs/befs/Kconfig"
source "fs/bfs/Kconfig"
source "fs/efs/Kconfig"
source "fs/yaffs2/Kconfig"
source "fs/jffs2/Kconfig"
# UBIFS File system configuration
<2>修改內核文件/fs/Makefile,增加下面兩行(在129行附近):
obj-$(CONFIG_GFS2_FS) += gfs2/
obj-$(CONFIG_EXOFS_FS) += exofs/
obj-$(CONFIG_YAFFS_FS) += yaffs2/
<3>在內核文件的fs目錄下創建yaffs2子目錄,然后復制如下文件:
將yaffs2源碼目錄下的Makefile.kernel文件復制為內核fs/yaffs2/Makefile文件。
將yaffs2源碼目錄下的Kconfig文件復制為內核fs/yaffs2/目錄下。
將yaffs2源碼目錄下的*.c、*.h文件(不包括子目錄下的文件)復制為內核fs/yaffs2/目錄下。
(2)配置內核選項
閱讀內核fs/Kconfig文件可以了解各配置選項的作用。
以下是用到的幾個選項:
<1>CONFIG_YAFFS_FS:支持yaffs文件系統。
<2>CONFIG_YAFFS_YAFFS2:支持yaffs2文件系統,對于每頁大小為2k字節nand flash,需要選中這個選項。
<3>CONFIG_YAFFS_AUTO_YAFFS2:自動選擇yaffs2文件格式,如果不配置這個選項,必須使用yaffs2字樣來表示yaffs2文件系統格式,如果配置這個選項,則可以使用yaffs字樣來統一表示yaffs1和yaffs2文件系統格式,驅動程序會根據nand flash的頁大小自動分辨是yaffs1還是yaffs2。
patch-ker源代碼分析:
#!/bin/sh
#? args:? l/c : link or copy
#? kpath? : Full path to kernel sources to be patched
#
#? Somewhat "inspired by" the mtd patchin script
#
VERSION=0
PATCHLEVEL=0
SUBLEVEL=0
COPYORLINK=$1
MULTIORSINGLE=$2
LINUXDIR=$3
# To be a Linux directory, it must have a Makefile
?
# shell函數應用:usage()函數顯示如何使用
usage () {
echo "usage:? $0? c/l m/s kernelpath"
echo " if c/l is c, then copy. If l then link"
echo " if m/s is m, then use multi version code. If s then use single version code"
exit 1
}
?
if [ -z $LINUXDIR ]
then
? ? usage;? //調用usage()函數
fi
if [ $COPYORLINK = l ]; then
? CPY="ln -s"
elif [ $COPYORLINK = c ]; then
? CPY="cp"
else
? echo "unknown copy or link type"
? usage;
fi
if [ $MULTIORSINGLE = m ]; then
? VFS_CODE="yaffs_vfs_multi.c"
? MTD_CODE="yaffs_mtdif_multi.c"
? YPORTENV="yportenv_multi.h"
? KCONFIG_SRC="Kconfig_multi"
elif [ $MULTIORSINGLE = s ]; then
? VFS_CODE="yaffs_vfs_single.c"
? MTD_CODE="yaffs_mtdif_single.c"
? YPORTENV="yportenv_single.h"
? KCONFIG_SRC="Kconfig_single"
? echo ""
? echo "*** Warning ***"
? echo "You have chosen to use the single kernel variant of the yaffs VFS glue code"
? echo "that only works with the latest Linux kernel tree. If you are using an older"
? echo "version of Linux then you probably wanted to use the multi-version variant by"
? echo "re-running the patch-ker.sh script using m as a the second argument."
? echo " ie $0 $COPYORLINK m $LINUXDIR"
? echo ""
else
? echo "unknown multi/single version selection"
? usage;
fi
?
# 判斷Linux kernel根目錄下是否有Makefile文件
if [ ! -f $LINUXDIR/Makefile ]?
then
echo "Directory $LINUXDIR does not exist or is not a kernel source directory";
exit 1;
fi
# 獲取內核版本
#sed s表示使用替換模式替換相應模式
VERSION=`grep -s VERSION <$LINUXDIR/Makefile | head -n 1 | sed s/'VERSION = '//`? ? //查詢成功后用//替換VERSION
PATCHLEVEL=`grep -s PATCHLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'PATCHLEVEL = '//`
SUBLEVEL=`grep -s SUBLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'SUBLEVEL = '//`
if [ $VERSION$PATCHLEVEL -lt 26? ]
then
echo "Cannot patch kernel version $VERSION.$PATCHLEVEL.$SUBLEVEL, must be 2.6.x or higher"
exit 1;
fi
?
KCONFIG=$LINUXDIR/fs/Kconfig
KCONFIGOLD=$LINUXDIR/fs/Kconfig.pre.yaffs
YAFFS_PATCHED_STRING=`grep -s yaffs <$KCONFIG | head -n 1`
MAKEFILE=$LINUXDIR/fs/Makefile
MAKEFILEOLD=$LINUXDIR/fs/Makefile.pre.yaffs
#判斷是否存在yaffs?
if [ ! -z "$YAFFS_PATCHED_STRING" ]?
then
? ? YAFFS_PATCHED=0
? ? echo "$KCONFIG already mentions YAFFS, so we will not change it"
else
? # Change the fs/Kconfig file
? # Save the old Kconfig
? # Copy all stuff up to JFFS
? # Insert some YAFFS stuff
? # Copy all the rest of the stuff
#linux/fs不存在yaffs,則創建。
? ? YAFFS_PATCHED=1
? ? echo "Updating $KCONFIG"
? ? mv -f $KCONFIG? $KCONFIGOLD
? ? sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 ! p" $KCONFIGOLD >$KCONFIG
? ? # echo "">>$KCONFIG
? ? # echo "# Patched by YAFFS" >>$KCONFIG
? ? echo "source \"fs/yaffs2/Kconfig\"">>$KCONFIG
? ? # echo "">>$KCONFIG
? ? sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 p" $KCONFIGOLD >>$KCONFIG
? # now do fs/Makefile -- simply add the target at the end
? ? echo "Updating $MAKEFILE"
? ? cp -f $MAKEFILE $MAKEFILEOLD
? ? # echo "">>$MAKEFILE
? ? # echo "# Patched by YAFFS" >>$MAKEFILE
? ? echo "obj-\$(CONFIG_YAFFS_FS) += yaffs2/" >>$MAKEFILE
fi
YAFFSDIR=$LINUXDIR/fs/yaffs2
if [ -e $YAFFSDIR ]
then
? echo "$YAFFSDIR exists, so not patching. If you want to replace what is"
? echo "already there then delete $YAFFSDIR and re-run this script"
? echo " eg.? \"rm -rf $YAFFSDIR\" "
else
? rm yaffs*.mod.c 2> /dev/null
? mkdir $LINUXDIR/fs/yaffs2
? $CPY? $PWD/Makefile.kernel $LINUXDIR/fs/yaffs2/Makefile
? $CPY $PWD/$KCONFIG_SRC $LINUXDIR/fs/yaffs2/Kconfig
? $CPY $PWD/*.c $PWD/*.h? $LINUXDIR/fs/yaffs2
? rm $LINUXDIR/fs/yaffs2/yaffs_vfs*.c $LINUXDIR/fs/yaffs2/yaffs_mtdif*.c
? rm $LINUXDIR/fs/yaffs2/yportenv*.h
? rm $LINUXDIR/fs/yaffs2/moduleconfig.h
? $CPY $PWD/$VFS_CODE $LINUXDIR/fs/yaffs2/yaffs_vfs.c
? $CPY $PWD/$MTD_CODE $LINUXDIR/fs/yaffs2/yaffs_mtdif.c
? $CPY $PWD/$YPORTENV $LINUXDIR/fs/yaffs2/yportenv.h
fi
總結
以上是生活随笔為你收集整理的yaffs2的补丁文件patch-ker分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I am a lazy bone
- 下一篇: 项目管理软件之争,禅道和JIRA大对比