2018年12月3日 星期一

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進行讀寫。

沒有留言: