2018年12月23日 星期日

Java in Linux

Q: How to identify JDK version?
A: For ex:
$ java -version
java version "1.7.0_181"
OpenJDK Runtime Environment (IcedTea 2.6.14) (7u181-2.6.14-0ubuntu0.3)
OpenJDK 64-Bit Server VM (build 24.181-b01, mixed mode)
(This is actually Java 1.7 = OpenJDK7 ~= OracleJDK7)
$ java -XshowSettings:properties -version

Q: How to install Java?
A:
$ sudo apt-get install default-jdk
# OpenJDK6
$ sudo apt-get install openjdk-6jdk
# OpenJDK7
$ sudo apt-get install openjdk-7jdk
# OracleJDK8
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default


2018年12月3日 星期一

初探 Linux kernel 亂數產生器 – random generator

2016 年 10 月 05 日2016 年 10 月 06 日 szlin


在產生 key 或者進行一些安全應用時, 常會有需要 “亂數” 的使用需求.

在 user space 有下列四種介面可以跟 Linux kernel 取得亂數.


1. /dev/random (blocking random source) – 位於 drivers/char/random.c

Linux kernel 收集來自系統, 驅動程式或其它來源的環境噪音, 並轉換成 entropy 放入 entropy pool 中. 再由 entropy 生成所謂的 “亂數”
entropy 為描述系統混亂無序程度的物理量 [3].

哪些環境噪音才能被轉化成 entropy 呢 ? 根據 drivers/char/random.c 來看, 主要為輸入裝置發出中斷的時間, IRQ 的 cycle counters, 硬碟讀寫的時間 (注意 – 不包括 flash based 的儲存裝置, ex: SSD)





此介面主要適用於對安全需求比較高的應用. (例: 產生金鑰). 若 entropy 不夠時, I/O operation 會被 block 住, 直到收集了足夠的 entropy.

以產生 GPG key 為例, 若 entropy 不夠會顯示下列訊息. 這時就要趕緊生出足夠的 entropy, 否則 process 會一直處於等待 I/O 的狀態.


**We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 210 more bytes)**
2. /dev/urandom (non-blocking random source)– 位於 drivers/char/random.c

這介面會重覆使用 entropy 以產生亂數, 所以不會發生 entropy 不夠而導致 I/O block 的情況. 但相對產生的亂數也不夠 “隨機”.

所以 kernel 有額外設計 add_device_randomness 這個函式, 透過加入一些資料到 pool 中進行初始化 (非增加 entropy), 避免在重覆應用 entropy 的前提下產生相同或者類似的亂數. 但即便如此, 出來的亂數在使用上來說還是不夠安全.





此介面主要適用於對安全需求比較低的應用. (例: 不須具備安全性需求的遊戲).


3. system call (kernel 3.17 之後開始支援) [7] – 位於 drivers/char/random.c

使用 system call getrandom() 可以取得亂數值.

getrandom() 定義在 drivers/char/random.c 由下圖可得知, 預設是回傳 /dev/urandom 中的 entropy.



getrandom() 函式宣告如下

[code language=”c”]
#include

int getrandom(void *buf, size_t buflen, unsigned int flags);
[/code]

由於預設是取得 /dev/urandom pool 中的 entropy, 若想要取得 /dev/random entropy 則需要修改 flags.

需要注意的是, 一次讀取最大能拿到的位元數分別如下:
/dev/random : 512 bytes
/dev/urandom : 33554431 bytes

詳細用法可以參考 man page [6].

—

使用 getrandom() system call 可以取得亂數值, 反過來如果要寫入資料以增加 entropy 則要透過 ioctl system call.

除了增加 entropy 外, 透過 ioctl command也能查詢目前 entropy 數量等等. ioctl command 列表如下圖, 命名相當清楚, 直接看 code 就可以知道在做什麼了.




4. /dev/hwrng – 位於 drivers/char/hw_random 並需要硬體元件支援

上述三點都是使用 Linux kernel 亂數產生器產生亂數, 但除此之外, 我們還可以使用硬體亂數產生器來產生亂數 – 如果系統不具備硬體亂數產生器, 請忽略此章節

現今除了 ARM SoC 大多有內建硬體亂數產生器外, 也可以透過 TPM [2] 硬體產生亂數.
硬體亂數產生器對我們而言, 就是一個黑盒子, 會有些許安全性上的考量.所以請謹慎評估後再使用.

hwrng driver 透過 hwrng_register() 註冊到 drivers/char/hw_random/core.c 中. 請先開啟對應的 driver 選項, 然後再搭配 cryptodev-linux [1] 來建立 userspace interface, 即可透過 /dev/hwrng 來讀取硬體產生的亂數, 如下圖:





* 3.16 之後的 kernel 使用 add_hwgenerator_randomness [8][9], 直接將硬體產生的亂數加入到 /dev/random. 如果使用之前版本的 kernel, 可參照下一章節 – 產生 entropy 的工具 : rng-tools
產生 entropy 的工具

平常我們可以透過下列指令來確認 entropy 是否足夠

[code language=”bash”]
cat /proc/sys/kernel/random/entropy_avail
[/code]

除了輸入裝置發出中斷的時間, IRQ 的 cycle counters, 硬碟讀寫的時間能產生 entropy 外, 也可以使用下列工具來協助產生 entropy
rng-tools [4]

主要功能是將硬體產生的亂數加入到 /dev/random 的 entropy pool, 以實現單一接口.

* 不適用於 kernel 版本 > 3.16 , 3.16 之後的 kernel 使用 add_hwgenerator_randomness [8][9], 直接將硬體產生的亂數加入到 /dev/random
haveged [5]

使用 HAVEGE algorithm 來產生亂數. 但產生的亂數品質不若硬體產生的好. 不建議使用在高安全性的應用中.





ref:

[1]: http://cryptodev-linux.org/

[2]: https://en.wikipedia.org/wiki/Trusted_Platform_Module

[3]: https://www.ibm.com/developerworks/cn/linux/1404_caobb_kvmrandom/

[4]: https://wiki.archlinux.org/index.php/Rng-tools

[5]: https://wiki.archlinux.org/index.php/Haveged

[6]: http://man7.org/linux/man-pages/man2/getrandom.2.html

[7]: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c6e9d6f38894798696f23c8084ca7edbf16ee895

[8]: http://linux-kernel.2935.n7.nabble.com/PATCH-1-2-add-direct-interface-for-true-hardware-RNGs-td713040.html

[9]: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=be4000bc4644d027c519b6361f5ae3bbfc52c347

dd命令的高級應用

出處(http://blog.sina.com.cn/wyw1976)
作者郵箱(wyw1976@gmail.com)

dd是Linux上的一個常用的命令。 例如:dd if=/1.txt of=/tmp/2.txt
(其中, if代表input file;of代表output file, 命令的結果就是將根目錄下的1.txt的內容拷貝到/tmp目錄的的2.txt。)

當然,如果只是用dd做這樣的事情顯然大材小用了,因為cp可以幹同樣的事情,而且更簡單。


下面就介紹一下dd的“高級”應用:

(一)直接讀寫快閃記憶體
在嵌入式系統中,經常需要測試系統檔讀寫的性能,如果想繞過檔案系統(檔案系統一般都有自己的cache),直接測試快閃記憶體驅動的性能,最簡單的方法就是dd。
一般,快閃記憶體(NAND)會有幾個分區,每個分區對應/dev/mtd*的一個結點:

寫操作
dd if=/dev/urandom of=/dev/mtd1 bs=4096 count=1000
(上面這個命令就是從/dev/urandom中拷貝檔到mtd1這個分區上,每次讀寫的資料量是4096個位元組,拷貝1000次,因此總的資料量就4M.)

讀操作
dd if=/dev/mtd1 of=/dev/null bs=4096 count=1000
(上面這個命令就是從分區mtd1中拷貝檔到空設備/dev/null上,每次讀寫的資料量是4096個位元組,拷貝1000次,因此總的資料量就4M.)

dd執行完畢後會輸出的吞吐率。



(二)DirectIO

在有些系統上,沒有mtd節點或者不能直接操作存儲設別,如果想測試檔讀寫性能,如何消除檔案系統的影響呢?
dd命令有一組參數oflag和iflag, 控制原始檔案和目的檔案的讀寫方式為direct IO,即讀或寫檔時越過作業系統的讀寫buffer。如果指定oflag=direct,nonblock,寫檔時忽略cache的影響;而如果指定iflag=direct,nonblock,讀檔時忽略cache的影響

下面就是一組實測資料,從中可以看出cache對最終性能的影響。


flag 中除了可以指定direct和nonblock,還可以指定其他的值,具體參見:http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html
需要注意的是有些的平臺可能只支持一部分flag.

(三) 拷貝螢幕

利用dd可以實現截屏,假設螢幕對應的設備節點/dev/fb0,螢幕大小是600×800,螢幕圖元的格式是rgb565(每個圖元對應兩個位元組),則命令如下:
dd if=/dev/fb0 of=/tmp/1.dat bs=600 count=1600

反之,也可以利用dd,直接寫螢幕,例如下面的命令將隨機渲染螢幕:
dd if=/dev/urandom of=/dev/fb0 bs=600 count=1600


(四) 串口讀寫

dd還可以寫串口,假設串口節點為/dev/ttyS0, 下麵的命令將文件寫入串口中:
dd if=1.txt of=/dev/ttyS0

下面是dd命令的調用流程:
上圖中的f_op資料結構是在open一個檔或設備時賦值的,其中的read, write等指向真正的操作該檔的函數。通過這個流程圖,我們可以看出該設備或檔的驅動實現了標準的讀寫函數,就可以利用dd進行讀寫。

MTD簡介, /dev/mtd與/dev/mtdblok的區別

轉:http://kezeodsnx.pixnet.net/blog/post/34193523-mtd%E7%B0%A1%E4%BB%8B

轉:http://blog.csdn.net/liangkaiming/article/details/6235031

Character or block device?
Character指的是keyboard,mouse這類device。可以向這些device讀東西出來,但不能做seek,也沒有size的觀念。而block device則可seek,也有size,一個block通常是512 bytes。
而flash的bahavior像block device,其不同點為:
1. block device的write/erash是沒有區別的
2. block device是由sector組成,而MTD則是erase block
3. hardware處理bad block,而MTD需要software
因此就有了MTD這個特別的device type。
Note: USB stick, MMC, SD, CompactFlash也稱為flash,但這些都不是flash device。他們內部有flash chip,但除了chip,還有一層模擬為block device的translation layer,且這個translation實作在硬體上,所以應視為hard drive。

MTD subsystem
MTD (Memory Techology Device)是一個subsystem,用來簡化底層的flash device (ROM/NAND/OneNAND/NOR)的driver。在MTD下,driver只需提供read/write/erase的功能,而不需知道其上是使用FTL (Flash Translation Layer),還是FFS (Flash File System)。
FTL是用來模擬Flash device為block device,因此可以在上面create filesystem。而FFS則是為flash device設計的filesystem。各有其優缺點,可見Wiki。
為了讓既有的filesystem (fat/ext/xfs...)能用在flash device上,就需要FTL這個software layer。mtdblock就是其中一種FTL。要注意的是使用FTL時,如果改了其中一個sector,就必須讀一整個eraseblock到 memory,然後erase,最後再把整個eraseblock寫回,顯然cost很高。因此通常建議使用mtdblock_ro,也可再加上 squashfs。將mtdblock mount成rw前,一定要多想一下是否值得這樣做。
mtdblock也沒有wear leveling。

Linux系统中/dev/mtd 與/dev/mtdblock 的區別

MTD(memory technology device內存技朮設備)是用於訪問memory設備(ROM、flash)的Linux的子系統。MTD的主要目的是為了使新的memory設備的驅 動更加簡單,為此它在硬件和上層之間提供了一個抽象的接口。MTD的所有源代碼在/drivers/mtd子目錄下。我將CFI接口的MTD設備分為四層 (從設備節點直到底層硬件驅動),這四層從上到下依次是:設備節點、MTD設備層、MTD原始設備層和硬件驅動層。
MTD
字符驅動程序允許直接訪問flash器件,通常用來在flash上創建文件系統,也可以用來直接訪問不頻繁修改的數據。
MTD
塊設備驅動程序可以讓flash器件偽裝成塊設備,實際上它通過把整塊的erase block放到ram里面進行訪問,然后再更新到flash,用戶可以在這個塊設備上創建通常的文件系統。
1. /dev/mtdN 是Linux 中的MTD架搆中,系統自己實現的mtd分區所對應的字符設備(將mtd設備分成多個區,每個區就為一個字符設備),其里面添加了一些ioctl,支持很多命令,如MEMGETINFO,MEMERASE等。
而mtd-util中的flash_eraseall等工具,就是以這些ioctl為基礎而實現的工具,實現一些關於Flash的操作。比如,mtd 工具中的 flash_eraseall中的:
if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
   fprintf(stderr, "%s: %s: unable to get MTD device info/n", exe_name, mtd_device);
   return 1;
}

其中,MEMGETINFO,就是Linux MTD中的drivers/mtd/mtdchar.c中的:

static int mtd_ioctl(struct inode *inode, struct file *file,
       u_int cmd, u_long arg)
{
。。。。。
case MEMGETINFO:
   info.type = mtd->type;
   info.flags = mtd->flags;
   info.size = mtd->size;
   info.erasesize = mtd->erasesize;
   info.writesize = mtd->writesize;
   info.oobsize = mtd->oobsize;
   /* The below fields are obsolete */
   info.ecctype = -1;
   info.eccsize = 0;
   if (copy_to_user(argp, &info, sizeof(struct mtd_info_user)))
    return -EFAULT;
   break;

。。。

}
而/dev/mtdblockN,是Nand Flash驅動中,驅動用add_mtd_partitions()添加MTD設備分區(其實就是將mtd設備進行不衕的分區,當mtd設備還是一樣的,所以mtdblock分區與mtd分區肯定是對應的),而生成的對應的塊設備。
根據以上內容,也就更加明白,為什么不能用nandwrite,flash_eraseall,flash_erase等工具去對/dev/mtdblockN去操作了。因為/dev/mtdblock中不包含對應的ioctl,也就沒有定義對應的命令,不支持你這么操作。
2. mtd char 設備的主設備號是90,而mtd block設備的主設備號是31:

# ls /dev/mtd* -l crw-r-----    1 root     root      90,   0 May 30 2007 /dev/mtd0
crw-r-----    1 root     root      90,   2 May 30 2007 /dev/mtd1
crw-r-----    1 root     root      90,   4 Jul 17 2009 /dev/mtd2
crw-r-----    1 root     root      90,   6 May 30 2007 /dev/mtd3
crwxrwxrwx    1 root     root      90,   8 May 30 2007 /dev/mtd4
crwxrwxrwx    1 root     root      90, 10 May 30 2007 /dev/mtd5
crwxrwxrwx    1 root     root      90, 12 May 30 2007 /dev/mtd6
crwxrwxrwx    1 root     root      90, 14 May 30 2007 /dev/mtd7
crwxrwxrwx    1 root     root      90, 16 May 30 2007 /dev/mtd8
crwxrwxrwx    1 root     root      90, 18 May 30 2007 /dev/mtd9
# ls /dev/mtdblock* -lbrw-r-----    1 root     root      31,   0 May 30 2007 /dev/mtdblock0
brw-r-----    1 root     root      31,   1 May 30 2007 /dev/mtdblock1
brw-r-----    1 root     root      31,   2 May 30 2007 /dev/mtdblock2
brw-r-----    1 root     root      31,   3 May 30 2007 /dev/mtdblock3
brwxrwxrwx    1 root     root      31,   4 May 30 2007 /dev/mtdblock4
brwxrwxrwx    1 root     root      31,   5 May 30 2007 /dev/mtdblock5
brwxrwxrwx    1 root     root      31,   6 May 30 2007 /dev/mtdblock6
brwxrwxrwx    1 root     root      31,   7 May 30 2007 /dev/mtdblock7
brwxrwxrwx    1 root     root      31,   8 May 30 2007 /dev/mtdblock8
brwxrwxrwx    1 root     root      31,   9 May 30 2007 /dev/mtdblock9
此設備號,定義在/include/linux/mtd/mtd.h中 :
#define MTD_CHAR_MAJOR   90
#define MTD_BLOCK_MAJOR 31
3. 其中,mtd的塊設備的大小,可以通過查看分區信息獲得:
# cat /proc/partitions
major minor #blocks name
31     0       1024 mtdblock0
31     1       8192 mtdblock1
31     2     204800 mtdblock2
31     3      65536 mtdblock3
31     4     225280 mtdblock4
上面中顯示的塊設備大小,是block的數目,每個block是1KB。
而每個字符設備,其實就是對應著上面的每個塊設備。即/dev/mtd0對應/dev/mtdblock0,其他以此類推。換句話說,mtdblockN的一些屬性,也就是mtdN的屬性,比如大小。
4。對每個mtd字符設備的操作,比如利用nandwrite去對/dev/mtd0寫數據,實際就是操作/dev/mtdblock0。
而這些操作里面涉及到的偏移量offset,都指的是此mtd 分區內的偏移。比如向/dev/mtd1的offset為0的位置寫入數據,實際操作的是物理偏移offset=/dev/mtd0的大小=1MB=0x100000。
5.mtd的字符設備和塊設備的命名規則,可以參考下表:

Table 7-1. MTD /dev entries, corresponding MTD user modules, and relevant device major numbers
/dev entry
Accessible MTD user module
Device type
Major number
mtdN
char device
char
90
mtdrN
char device
char
90
mtdblockN
block device, read-only block device, JFFS, and JFFS2
block
31
nftlLN
NFTL
block
93
ftlLN
FTL
block
44

Table 7-2. MTD /dev entries, minor numbers, and naming schemes
/dev entry
Minor number range
Naming scheme
mtdN
0 to 32 per increments of 2
N = minor / 2
mtdrN
1 to 33 per increments of 2
N = (minor - 1) / 2
mtdblockN
0 to 16 per increments of 1
N = minor
nftlLN
0 to 255 per sets of 16
L = set;[2] N = minor - (set - 1) x 16; N is not appended to entry name if its value is zero.
ftlLN
0 to 255 per sets of 16
Same as NFTL.


The Linux MTD,YAFFS Howto上面這樣寫道:
Erase the mtdblock0
/>eraseall /dev/mtd0Create the mount directory and mount
/>mkdir -p /mnt/flash0
/>mount -t yaffs /dev/mtdblock0 /mnt/flash0
為什么eraseall對mtd0操作?而不對mtdblock0操作?nand不是塊設備嘛,mtdblock就是塊設備呀。mtd0,mtd1與mtdblock0,mtdblock1是不是一一對應的?

使用linux的MTD tests support測試flash性能

Source  https://blog.csdn.net/gp_scoprius/article/details/53257056


在嵌入式linux開發過程中,經常會使用到nor flash,nand flash等存放裝置,由於flash的晶片型號和介面類別型較多,性能不一,我們需要對系統中使用的flash性能進行分析,並對設備工作的穩定性進行測試。
flash設備在嵌入式系統中,會被驅動為MTD分區,在linux kernel中,提供了針對MTD的測試模組,方面開發人員對flash的功能,性能,穩定性等進行測試。
使用make ARCH=arm  menuconfig打開kernel配置介面,配置 "Device Drivers" -> "Memory Technology Device (MTD) support" -> "MTD tests support",該選項只可以配置為按模組編譯,保存配置後退出。
使用make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules編譯代碼,生成測試工具模組,存儲在目錄drivers/mtd/tests中,包括以下內容:
mtd_nandecctest.ko:nand flash的ECC校驗測試
mtd_pagetest.ko:nand flash的page讀寫測試
mtd_speedtest.ko:MTD分區的讀寫速度測試
mtd_subpagetest.ko:nand flash的sub-page介面測試
mtd_oobtest.ko:nand falsh的OOB區域讀寫測試
mtd_readtest.ko:讀取整個MTD分區
mtd_stresstest.ko:隨機讀寫,擦除操作測試
mtd_torturetest.ko:該功能可用於做穩定性或者壽命測試,隨機操作直到發生錯誤

在即時ko檔進行測試時,可以通過dev=n指定要測試的MTD分區,示例如下:
insmod mtd_stresstest.ko dev=9 count=1000
[ 3289.273771] =================================================
[ 3289.279826] mtd_stresstest: MTD device: 9
[ 3289.284079] mtd_stresstest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 64
[ 3289.303250] mtd_stresstest: scanning for bad eraseblocks
[ 3289.420267] mtd_stresstest: scanned 2048 eraseblocks, 0 are bad
[ 3289.426534] mtd_stresstest: doing operations
[ 3289.431031] mtd_stresstest: 0 operations done
[ 3339.606972] mtd_stresstest: finished, 1000 operations done
[ 3339.612992] =================================================
當mtd_stresstest測試發生操作錯誤時,會退出並答應錯誤資訊,示例如下:
[root@AT8XXX ~]# dmesg |grep mtd_stresstest
[591404.676252] mtd_stresstest: MTD device: 9
[591404.680577] mtd_stresstest: MTD device size 268435456, eraseblock size 131072, page size 2048, count of eraseblocks 2048, pages per eraseblock 64, OOB size 64
[591404.699798] mtd_stresstest: scanning for bad eraseblocks
[591404.715081] mtd_stresstest: block 78 is bad
[591404.723850] mtd_stresstest: block 159 is bad
[591404.812382] mtd_stresstest: block 1752 is bad
[591404.832925] mtd_stresstest: scanned 2048 eraseblocks, 3 are bad
[591404.839259] mtd_stresstest: doing operations
[591404.843859] mtd_stresstest: 0 operations done
[591459.037353] mtd_stresstest: 1024 operations done
[591510.529876] mtd_stresstest: 2048 operations done

[594847.430017] mtd_stresstest: error: write failed at 0xf964000
[594847.436350] mtd_stresstest: error -5 occurred


Source https://www.crifan.com/the_new_linux_kernel_of_the_mtd_test_into_the_old_kernel_in/

將新的Linux kernel中的MTD test加入到舊的kernel中


Linux Kernel自從2.6.29之後,就加入了MTD test模組,即幾個測試模組,用於測試你的mtd的特性。

分別是:
mtd_oobtest.c //測試oob資料讀寫是否正常
mtd_pagetest.c //測試page讀寫
mtd_readtest.c //測試讀功能
mtd_speedtest.c //測試mtd的速度
mtd_stresstest.c //壓力測試
mtd_subpagetest.c //子頁面(如果支援的話,此處我的是MLC,不支援sub page)
mtd_torturetest.c //扭曲測試? 反正就是對mtd“嚴刑拷打”,看看其能經受多少讀寫,直至掛掉。。,所以,作者說了,除非你知道自己在幹啥,否則不要隨意進行這個測試。
其中,最有用的就是speed test了,方便了開發者用來測試你的mtd(我的此處是nand flash)的讀/寫/擦除塊的速度。
我當前用的Linux kernel是2.6.28.4,沒有加入MTD test,所以自己加入:
(1)下載mtd tests源碼,並加入到自己的內核中,編譯成.ko模組用於後期動態載入:
我這裡是從最新內核linux-2.6.32.8:
中的/drivers/mtd/test裡面抽取的,然後放到自己的kernel源碼中:
/drivers/mtd/test,再把
config MTD_TESTS
tristate "MTD tests support"
depends on m
help
This option includes various MTD tests into compilation. The tests
should normally be compiled as kernel modules. The modules perform
various checks and verifications when loaded.
加入到Kconfig中,把
obj-y   += tests/
加入到Makefile中。然後make ARCH=arm menuconfig,去把mtd test選上:
Device Drivers —>
<*> Memory Technology Device (MTD) support —>
   MTD tests support
再編譯一下:
make ARCH=arm; make ARCH=arm uImage
就可以生成對應的.ko模組檔了。
(2).如何使用MTD test:
進入Kernel後,使用也很簡單
比如:insmod mtd_speedtest.ko dev=3
注:此處的dev指的是你mtd設備number,我這裡的:
# cat /proc/mtd
dev:    size   erasesize name
mtd0: 00100000 00080000 "U-Boot"
mtd1: 00800000 00080000 "Kernel"
mtd2: 0c800000 00080000 "Root filesystem"
mtd3: 04000000 00080000 "Temp"
mtd4: 69000000 00080000 "Data"
dev=3,就是mtd3,就是上面的Temp分區。
(3)舉例如何使用:
最後列舉一些測試結果如下:
# ls
mtd_oobtest.ko          mtd_readtest.ko         mtd_subpagetest.ko
mtd_speedtest.ko        mtd_torturetest.ko
mtd_pagetest.ko         mtd_stresstest.ko
# insmod mtd_speedtest.ko dev=3
=================================================
mtd_speedtest: MTD device: 3
mtd_speedtest: MTD device size 67108864, eraseblock size 524288, page size 4096, count of eraseblocks 128, pages per eraseblock 128, OOB size 128
mtd_speedtest: scanning for bad eraseblocks
mtd_speedtest: scanned 128 eraseblocks, 0 are bad
mtd_speedtest: testing eraseblock write speed
mtd_speedtest: eraseblock write speed is 1754 KiB/s
mtd_speedtest: testing eraseblock read speed
mtd_speedtest: eraseblock read speed is 2443 KiB/s
mtd_speedtest: testing page write speed
mtd_speedtest: page write speed is 1748 KiB/s
mtd_speedtest: testing page read speed
mtd_speedtest: page read speed is 2439 KiB/s
mtd_speedtest: testing 2 page write speed
mtd_speedtest: 2 page write speed is 1751 KiB/s
mtd_speedtest: testing 2 page read speed
mtd_speedtest: 2 page read speed is 2440 KiB/s
mtd_speedtest: Testing erase speed
mtd_speedtest: erase speed is 439838 KiB/s
mtd_speedtest: finished
=================================================
# insmod mtd_oobtest.ko dev=3
=================================================
mtd_oobtest: MTD device: 3
mtd_oobtest: MTD device size 67108864, eraseblock size 524288, page size 4096, count of eraseblocks 128, pages per eraseblock 128, OOB size 128
mtd_oobtest: scanning for bad eraseblocks
mtd_oobtest: scanned 128 eraseblocks, 0 are bad
mtd_oobtest: test 1 of 5
mtd_oobtest: erasing whole device
mtd_oobtest: erased 128 eraseblocks
mtd_oobtest: writing OOBs of whole device
mtd_oobtest: written up to eraseblock 0
mtd_oobtest: written 128 eraseblocks
mtd_oobtest: verifying all eraseblocks
mtd_oobtest: verified up to eraseblock 0
mtd_oobtest: verified 128 eraseblocks
mtd_oobtest: test 2 of 5
mtd_oobtest: erasing whole device
mtd_oobtest: erased 128 eraseblocks
mtd_oobtest: writing OOBs of whole device
mtd_oobtest: written up to eraseblock 0
mtd_oobtest: written 128 eraseblocks
mtd_oobtest: verifying all eraseblocks
mtd_oobtest: verified up to eraseblock 0
mtd_oobtest: verified 128 eraseblocks
mtd_oobtest: test 3 of 5
mtd_oobtest: erasing whole device
mtd_oobtest: erased 128 eraseblocks
mtd_oobtest: writing OOBs of whole device
mtd_oobtest: written up to eraseblock 0
mtd_oobtest: written 128 eraseblocks
mtd_oobtest: verifying all eraseblocks
mtd_oobtest: verified up to eraseblock 0
mtd_oobtest: verified 128 eraseblocks
mtd_oobtest: test 4 of 5
mtd_oobtest: erasing whole device
mtd_oobtest: erased 128 eraseblocks
mtd_oobtest: attempting to start write past end of OOB
mtd_oobtest: an error is expected…
mtd_oobtest: error occurred as expected
mtd_oobtest: attempting to start read past end of OOB
mtd_oobtest: an error is expected…
mtd_oobtest: error occurred as expected
mtd_oobtest: attempting to write past end of device
mtd_oobtest: an error is expected…
mtd_oobtest: error occurred as expected
mtd_oobtest: attempting to read past end of device
mtd_oobtest: an error is expected…
mtd_oobtest: error: read past end of device
mtd_oobtest: attempting to write past end of device
mtd_oobtest: an error is expected…
mtd_oobtest: error occurred as expected
mtd_oobtest: attempting to read past end of device
mtd_oobtest: an error is expected…
mtd_oobtest: error: read past end of device
mtd_oobtest: test 5 of 5
mtd_oobtest: erasing whole device
mtd_oobtest: erased 128 eraseblocks
mtd_oobtest: writing OOBs of whole device
mtd_oobtest: written up to eraseblock 0
mtd_oobtest: written up to eraseblock 0
mtd_oobtest: written 127 eraseblocks
mtd_oobtest: verifying all eraseblocks
mtd_oobtest: verified up to eraseblock 0
mtd_oobtest: verified 127 eraseblocks
mtd_oobtest: finished with 2 errors
=================================================
[附錄]
1.MTD tests
http://www.linux-mtd.infradead.org/doc/general.html