yaffs2的补丁文件patch-ker分析
為內(nèi)核打上yaffs2 補(bǔ)丁
(1)將yaffs2代碼加入內(nèi)核
這可以通過yaffs2目錄下的腳本文件patch-ker.sh來給內(nèi)核打補(bǔ)丁,用法如下:
usage: ./patch-ker.sh c/l kernelpath
if c/l is c, then copy. if l then link.
這表明,如果c/l是c,則yaffs2的代碼會被復(fù)制到內(nèi)核目錄下,如果是l,則在內(nèi)核的目錄下創(chuàng)建一些鏈接文件。這里yaff2所在的目錄/root/linux-test/,和linux-2.6.32.2在同一個(gè)目錄下,執(zhí)行如下命令打補(bǔ)丁:
[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]#
注意第二個(gè)參數(shù)m/s,如果不指定,有時(shí)會執(zhí)行失敗。
上述命令完成下面三件事:
<1>修改內(nèi)核文件/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>修改內(nèi)核文件/fs/Makefile,增加下面兩行(在129行附近):
obj-$(CONFIG_GFS2_FS) += gfs2/
obj-$(CONFIG_EXOFS_FS) += exofs/
obj-$(CONFIG_YAFFS_FS) += yaffs2/
<3>在內(nèi)核文件的fs目錄下創(chuàng)建yaffs2子目錄,然后復(fù)制如下文件:
將yaffs2源碼目錄下的Makefile.kernel文件復(fù)制為內(nèi)核fs/yaffs2/Makefile文件。
將yaffs2源碼目錄下的Kconfig文件復(fù)制為內(nèi)核fs/yaffs2/目錄下。
將yaffs2源碼目錄下的*.c、*.h文件(不包括子目錄下的文件)復(fù)制為內(nèi)核fs/yaffs2/目錄下。
(2)配置內(nèi)核選項(xiàng)
閱讀內(nèi)核fs/Kconfig文件可以了解各配置選項(xiàng)的作用。
以下是用到的幾個(gè)選項(xiàng):
<1>CONFIG_YAFFS_FS:支持yaffs文件系統(tǒng)。
<2>CONFIG_YAFFS_YAFFS2:支持yaffs2文件系統(tǒng),對于每頁大小為2k字節(jié)nand flash,需要選中這個(gè)選項(xiàng)。
<3>CONFIG_YAFFS_AUTO_YAFFS2:自動(dòng)選擇yaffs2文件格式,如果不配置這個(gè)選項(xiàng),必須使用yaffs2字樣來表示yaffs2文件系統(tǒng)格式,如果配置這個(gè)選項(xiàng),則可以使用yaffs字樣來統(tǒng)一表示yaffs1和yaffs2文件系統(tǒng)格式,驅(qū)動(dòng)程序會根據(jù)nand flash的頁大小自動(dòng)分辨是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函數(shù)應(yīng)用:usage()函數(shù)顯示如何使用
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;? //調(diào)用usage()函數(shù)
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
# 獲取內(nèi)核版本
#sed s表示使用替換模式替換相應(yīng)模式
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,則創(chuàng)建。
? ? 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
總結(jié)
以上是生活随笔為你收集整理的yaffs2的补丁文件patch-ker分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I am a lazy bone
- 下一篇: 项目管理软件之争,禅道和JIRA大对比