Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1106908
  • 博文数量: 276
  • 博客积分: 8317
  • 博客等级: 少将
  • 技术积分: 2329
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-12 08:17
个人简介

http://ads.buzzcity.net/adpage.php?partnerid=40096

文章分类

全部博文(276)

文章存档

2013年(1)

2012年(38)

2011年(102)

2010年(85)

2009年(45)

2008年(5)

分类: LINUX

2010-02-18 17:49:25

建置環境:
VMware 5.5.3         (256MB Ram,IDE hdd 12GB) 注意:要使用IDE
Fedora Core 6(kernel 2.6.18-1.2798)          

Source:

安裝步驟:

1.安裝 VMware

2.於Virtual machine下安裝 FC6

.it may be enough to reserve 128MB or 256MB of RAM for the VM

.you may not need to install X

.you have to install development tools such as gcc so that you can compile kernel

編譯核心:

.Download new stable-version kernel from (2.6.21.6)

.Download yaffs2 from
關於YAFFS
YAFFS在GPL和其它替代的授權條款下,基於yaffs source code修改發佈的程式其原始碼也必需要公開,如果不公開source code必需要跟創作yaffs的公司Aleph One購買版權。例如幾個情況 :

.商業用途的RTOS用的是YAFFS filesystem
.要給你的客戶其它授權條款而非GPL
.要在WindowsCE version 4下使用YAFFS (WinCE v.3可以使用GPL code但WinCE v.4需要多一層filesystem interface layer which is not part of YAFFS)

現在很多Embbed system(商業用途)是用Linux核心,如果有用到YAFFS filesystem就必需跟Aleph One購買版權,所以Linux上YAFFS source code需要另外下載。關於YAFFS Licence的內容參考[1]和[2]。

複製並解壓縮核心
# cp linux-2.6.21.6.tar.gz /usr/src/kernels
# cd /usr/src/kernels
# tar zxf linux-2.6.21.6.tar.gz <=解壓縮檔案

Patch yaffs2到kernel (patch 後 make menuconfig 才有yaffs2 這個選項)
# cp yaffs2.tar.gz /usr/src
# cd /usr/src
# tar zxf yaffs2.tar.gz
# cd yaffs2
# ./patch-ker.sh c /usr/src/kernels/linux-2.6.21.6 <=執行patch動作


yaffs2適用版本
對於patch的kernel適用版本,在yaffs2的官網和README中沒有詳細的說明,在幾個kernel版本內裝過(2.6.21.6 ; 2.6.20.15 ; 2.6.17.9 ; 2.6.17.14)都可正常使用。.
由於YAFFS使用Partial Page Programming,但這個功能可能會造成資料上的錯誤,新的NAND Flash Memory已不允許使用Partial Page Programming,所以YAFFS亦不可在新的NAND Flash Memory上使用。而YAFFS2設計的最初目標就是要add support for new NAND,也不再使用Partial Page Programming,所以使用YAFFS2版本。
For further reading, you can see [3].

編譯核心
# cd /usr/src/kernels/linux-2.6.21.6
# make menuconfig
Enable mtdram, block2mtd,jffs2 and yaffs as modules via "make menuconfig"
.Device DriverMemory Technology Devices(MTD)Self-contained MTD device drivers
MTD using block device
.File systemsMiscellaneous filesystems
YAFFS2 file system support
[ * ] Let Yaffs do its own ECC
[ * ] Use the same ecc byte order as Steven Hill’s nand_ecc.c
.Device DriverMemory Technology Devices(MTD)NAND Flash Device Drivers
Support for NAND Flash Simulator
Exit and save
# make clean <=移除不必要的模組與檔案
# make bzImage <=編譯系統核心
# make modules <=編譯外掛模組
# make modules_install <=安裝編譯完成的模組
# make install <=安裝編譯完成的核心
Running JFFS2 over RAM-emulated NOR flash memory

※ check mtdcore.ko, mtdblock.ko, jffs2.ko

(under /lib/modules/2.6.21.6/kernel/drivers/mtd & 2.6.21.6/kernel/fs/jffs2/)

# modprobe jffs2

# modprobe mtdcore

# modprobe mtdchar
# modprobe mtdblock
/dev/mtdblockX (X=0~N) 為目前在Linux系統下那些模擬的flash分割區成為磁碟區的裝置,可以在/dev/ 資料夾下檢查現在有哪些模擬的flash裝置

# modprobe mtdram total_size=4096 erase_size=64
# cat /proc/mtd <= check device running
/proc/mtd文件是描述了RAM中文件區塊的儲存規律。
cat /proc/mtd 則是把這文件內容展示出來,如:
dev: size erasesize name
mtd0: 00800000 00002000 "NAND simulator partition"
mtd1: 00800000 00004000 "NAND simulator partition"

下載mkfs.jffs2 from
# cp mkfs.jffs2 /sbin
# chmod 755 /sbin/mkfs.jffs2


# mkfs.jffs2 -p -d DIRECTORY -o OutputImageFile -e erase-block-size(不加-e則erase-block-size預設為64k)
Ex: mkfs.jffs2 -p -d /root -o /jffs2test.img
(以 /root下的檔案產生 jffs2 image file: /jffs2test.img )

# cp OutputImageFile /dev/mtd0 <=move your image file to /dev/mtd0

# mkdir /mnt/tmp

# mount -t jffs2 /dev/mtdblock0 /mnt/tmp <=mount the mtdblock(mtd0) on /mnt/tmp
Running JFFS2 over block-device emulated flash memory

* you have to enable loopback support in the kernel
#make menuconfig
Loopback device support         (Device DriversBlock devices)
使用 loopback device ,這可以把一個磁碟檔案當做是一台設備來使用。

# modprobe jffs2

# modprobe mtdcore

# modprobe mtdchar

# modprobe mtdblock

# modprobe loop <=掛載loopback device 這個module
# losetup /dev/loop0 OutputImageFile <=if failed, try loop1
:losetup 用 來 將 loop device 與 檔 案 或 block device 聯 結 、 分 離 . 以 及 查 詢  loop device 目 前 的 狀 況 , 如 只 給 定 loop_device 的 參 數 . 則 秀 出 loop device 目  前 的 狀 況。 詳情請見 [8]
# modprobe block2mtd block2mtd=/dev/loop0,64ki
:block2mtd : Emulate an MTD using a block device

# cat /proc/mtd <= check device running

# mkdir /mnt/foo

# mount -t jffs2 /dev/mtdblock0 /mnt/foo
Running YAFFS over nandsim

# modprobe yaffs

# cat /proc/filesystems <= check yaffs exists or not
# modprobe nand_ecc
nand_ecc : Generic NAND ECC support
ECC是用來預防資料存取發生錯誤時所需的錯誤更正碼

# modprobe mtdblock

# modprobe mtdchar
# modprobe nandsim
nandsim預設Size為8MB,若要更改Size則加上「second_id_byte=xxxx」xxxx若為0x71,表示為256MB,要改 成其他Size請參考nand_ids.c (/usr/src/kernels/linux-2.6.21.6/drivers/mtd/nand/)

# cat /proc/mtd

dev: size erasesize name

mtd0: 00800000 00002000 "NAND simulator partition"

# mkdir /mnt/nand

# mount -t yaffs /dev/mtdblock0 /mnt/nand_yaffs
Running JFFS2over nandsim

# cat /proc/filesystems <=check yaffs exists or not

# modprobe jffs2

# modprobe mtdblock

# modprobe mtdchar

# modprobe nandsim

# cat /proc/mtd <= check device running

dev: size erasesize name

mtd0: 00800000 00002000 "NAND simulator partition"

# mkdir /mnt/nand_jffs2

# mount -t jffs2 /dev/mtdblock0 /mnt/nand_jffs2 <=掛入裝置,並指定為jffs2檔案系統
Running NFTL over RAM-emulated NAND flash memory

注意: 選擇kernel version 2.6.17.x (用2.6.18.1後的版本無法成功掛載)
NFTL是M-SYSTEM所開發的translation layer,主要是設計給該公司的disk on chip所使用。在此我們想要把NFTL用在NANDSIM這個NAND simulator上,必須將NFTL做一些更改。

    * modify nand_base.c (/usr/src/kernels/linux-2.6.17.14/drivers/mtd/nand)
    * you can use vi (使用方法在[4]有介紹)

因為NFTL的spare area與nand_base.c所規劃放置方式並不一樣,NFTL規劃如下

click me!

所以我們必須對nand_base.c做以下更改:
static struct nand_oobinfo nand_oob_16 = {

.useecc = MTD_NANDECC_AUTOPLACE,
.eccbytes = 6,
.eccpos = {0, 1, 2, 3, 6, 7},
.eccpos = {0, 1, 2, 3, 4, 5},
:.oobfree = { {8, 8} }

};

    * modify nftlcore.c (/usr/src/kernels/linux-2.6.17.14/drivers/mtd)

因為NFTL是設計給DoC所使用,所以我們必須更改NFTL在add mtd的判別式,讓NFTL可以接受NANDSIM所產生的device。所做更改如下:
static void nftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
{
struct NFTLrecord *nftl;
unsigned long temp;

if (mtd->type != MTD_NANDFLASH)
return;
/* OK, this is moderately ugly. But probably safe. Alternatives? */
if (memcmp(mtd->name, "DiskOnChip", 10))
if (memcmp(mtd->name, "NAND simulator partition", 27))


(3) Compile Kernel 2.6.17.14 (依照之前編譯核心的方法)

(4)

# modprobe mtdchar

# modprobe mtdblock
# modprobe nandsim second_id_byte= 0x78 access_delay=180 programm_delay=520 erase_delay=1.85
0x78在nand_ids.c內有定義為128MB

# cat /proc/mtd

Dev: size erasesize name

Mtd0: 08000000 00004000 "NAND simulator partition"

下載mtd-utils from
# cp mtd-utils-1.0.1.tar.gz /usr/src
# cd /usr/src
# tar zxf mtd-utils-1.0.1.tar.gz
# cd /usr/src/mtd-utils-1.0.1
# make nftl_format

# ./nftl_format /dev/mtd0

# modprobe nftl

# fdisk /dev/nftla <=切割nftla分割區

Create a partition: nftla1

n – add a new partition <=建立新的分割區

p – primary partition <=列出目前分割區狀態

w – write table to disk and exit <=儲存狀態並離開

# mkdosfs /dev/nftla1 <=將nftla1格式化為MS-DOS檔案系統的格式

# mkdir /mnt/nftl
# mount –t vfat /dev/nftla1 /mnt/nftl <=掛入裝置,並指定為vfat檔案系統
Trace source code of Linux MTD optional.

1. Install Source Insight in Windows

2. use Source Insight to trace the code
關於MTD
MTD Subsystem的目標是使new hardware的driver可以簡化。提供generic interface在硬體drivers和upper layers of the system之間,底層的Hardware drivers並不需要知道使用哪種儲存格式,像FTL, FFS2, …,而只需要提供基本的read, write and erase功能。

MTD subsystem分成驅動模組及使用者模組,驅動模組採用CFI (Common Flash Memory Interface)偵測flash晶片基本資訊,以及抹除、寫入方法;使用者模組提供flash轉譯層及檔案系統,MTD BLOCK模擬flash分割區成為磁碟區塊裝置,如此Linux能以檔案系統掛載flash分割區。
For further reading, you can see [5]

mtdcore主要做為MTD Subsystem的核心,管理mtdchar, mtdblock,…,
JFFS2是上層的檔案系統透過MTD存取Flash,下層的Flash Hardware Driver只需要提供基本的read,write,erase功能。

mtdblock模擬flash分割區成為磁碟區塊裝置,如此Linux能以檔案系統掛載flash分割區。

mtdram則是Linux底下一個用來模擬快閃記憶體的模組,只要載入這模組(module)之後,系統就好像真的接上一個快閃記憶體一樣,自動出現一個MTD裝置,我們可以正常掛載(mount)、卸載(umount)、寫入或刪除檔案。



MTD模組說明:
Module         Description         Depends
mtdcore         Core MTD registration and access routines          
mtdchar         Direct character-device access to MTD devices         mtdcore
mtdblock         Caching read/erase/writeback block device emulation access to MTD devices         mtd_blkdevs
mtdram         Simulated MTD driver for testing         mtdpart, mtdcore
mtd_blkdevs         Common interface to block layer for MTD "translation layer"         mtdcore
mtdpart         Generic Support for partitioning of MTD devices         mtdcore
jffs2         The Journalling Flash File System, v2         mtdcore, zlib_deflate

※ By modinfo

遇到的問題:

Fedora Core 6 kernel 2.6.18-1
1.無法用新compiled kernel開機 - 出現Kernel panic error (用IDE硬碟)

2.kernel 2.6.22.1 無法 modprobe jffs2 - 出現 Error inserting mtdsuper (可能這個版本的核心有bug, 用其它版本)

3.mount problem - dmesg 出現 SELinux error (disable SELinux)
Disable SELinux方法參考[6]

4. kernel 2.6.18 以後的版本無法用這篇的方法做nftl, 因為nand_base.c在2.6.18.1之後被做了修改 (使用2.6.17.x的版本做nftl)

5. 在kernel 2.6.21.6下編譯kernel 2.6.17.92的模組時(make modules指令),會較正

常情況下編譯模組的時間短很多(大約不到二分鐘就結束), 並在編譯並安裝

完成核心後會出現無法開機的情形, 原因不明, 其解決方法為在最初的核心

下重新編譯kernel 2.6.17.92即可

指令說明

tar –zxf:指定壓縮檔案,並還原

make:編譯系統核心或模組,也可用來更新軟體組件

modprobe:自動處理載入模組,會根據相依性來決定要載入哪些模組

cat::可連結多個檔案,並將檔案內容輸出

mkdir:建立目錄

mount:掛入檔案系統,

    參數-t:指定檔案系統類型

mkdosfs:建立MS-DOS檔案系統,可將指定的磁碟格式化為MS-DOS檔案系統的格式

fdisk:分割目標磁碟

可以參考[7]內有詳細的基本指令介紹。

Reference Link

[1] YAFFS Licences

[2] YAFFS - GPL

[3] YAFFS2 http://www.yaffs.net/yaffs-2-specification-and-development-notes

[4] vi文書處理器

[5] MTD

[6] SELinux ... ecure-1.php#selinux

[7] Linux指令

[8] losetup用法
阅读(2287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~