也許這是一個沒人看的blog
也許這正合我意,我該不斷的學會alone
我不擅獨,所以我要練習。
2011年7月16日 星期六
2011年7月11日 星期一
disksim SSD容量 與 "Max Addressable LBA in SSD Trace File"
SSD容量的算法,如下:
---
Pages Per Block = 64 Blocks Per Plane = 2048 Planes Per Element = 8 Page Size = 8 sectors = 4 KB
----
Pages Per Single Element
= 1 (Element) * 8 (planes) * 2048 (Blocks) *64 (Pages) = 1048576 Pages
那,trace裡面的 Block number 最大可以定址到多少?
先換算成sector(file system block)
1048576* 8 = 8388608
the MAX Addressable Sector = 0 .. 8388607 Sectors
disksim 中 "I/O trace time scale" 參數
disksim在parv檔提供這個參數,讓user可以調整trace的特徵(如 arrival time, request size, location etc.)
但是網友發現 在disksim source中根本就把 IO trace time scale寫死,程式碼如下:
在 disksim/src/disksim_iosim.c下:
但是網友發現 在disksim source中根本就把 IO trace time scale寫死,程式碼如下:
在 disksim/src/disksim_iosim.c下:
void iosim_initialize_iosim_info ()
{
disksim->iosim_info = DISKSIM_malloc (sizeof(iosim_info_t));
bzero ((char *)disksim->iosim_info, sizeof(iosim_info_t));
/* initializations that get remapped into iosim_info */
ioscale = 1.0; /**************LOOK HERE************/
last_request_arrive = 0.0;
constintarrtime = 0.0;
}
也就是說,想改變request的arrival time,只能在上面code中改。
原文:https://sos.ece.cmu.edu/pipermail/disksim-users/2007-August/000184.html
2011年7月7日 星期四
C語言 練習 bit 操作
/*C不像verilog可以對指定位元做操作,所以都用mask的方式
*/
#include<stdio.h>
#include <stdbool.h>
#define if_power_of_2(n) (n != 0 && ((n & (n -1)) == 0))
int main()
{
int x,i;
x=(7&6);
int bit=1;
bit=bit<<7; //這樣才能從左印到右
for(i=0;i<8;i++)
{
if((bit&x)==0) // 要刮號,因為 == priority 大於 &
{
printf("0");
bit=bit>>1;
}
else
{printf("1");
bit=bit>>1;
}
}
printf("\n");
printf("if_power_of_2(7)=%d\n",if_power_of_2(7));
printf("if_power_of_2(4)=%d\n",if_power_of_2(4));
system("pause");
return 0;
}
*/
#include<stdio.h>
#include <stdbool.h>
#define if_power_of_2(n) (n != 0 && ((n & (n -1)) == 0))
int main()
{
int x,i;
x=(7&6);
int bit=1;
bit=bit<<7; //這樣才能從左印到右
for(i=0;i<8;i++)
{
if((bit&x)==0) // 要刮號,因為 == priority 大於 &
{
printf("0");
bit=bit>>1;
}
else
{printf("1");
bit=bit>>1;
}
}
printf("\n");
printf("if_power_of_2(7)=%d\n",if_power_of_2(7));
printf("if_power_of_2(4)=%d\n",if_power_of_2(4));
system("pause");
return 0;
}
2011年6月20日 星期一
Linux Driver 思考 轉from http://dicky-chiang.blogspot.com/2011/03/linux-driver.html
Linux Driver 思考
剛突然找一篇很不錯的文章,雖然字數很少,但裡面的內容讓我有種被啟發的感覺...
====================
傳統意義上的Linux Driver僅僅是設備驅動,簡言之,和設備有關,如LCD,Camera等等。 但是, 筆者認為,Linux Driver的作用不僅僅侷限於此,從廣義上講, Linux Driver提供了一種User Space訪問 Kernel中特定Function的通用編程模型,即,平民(User Space中的Application, Process, Lib等)通向皇宮(Kernel)的大道。
如果一個模塊提供的Function必須運行於Kernel Space中(可能是設備相關的Function,從而需要訪問特權指令或者特權地址空間; 抑或者Function本身是設備無關的,但是訪問到了其他的一些運行於Kernel的Function; 甚至於吃飽了沒事幹,就喜歡把原本可以在User Space中運行的API實現在Kernel中,就是喜歡,你管的著嗎?!)。 同時,又希望User Space中的Client能訪問使用這些Function, 那麼, 將其Adapt成Driver是再合理不過的解決方案了。 這是為什麼那??
因為,從理論上來說,Kernel中的API,User Space中的Client是無法直接訪問的,只能利用系統調用陷入到內核態後調用。 Linux的系統調用非常多,均已經固定, 如何支持新的Kernel Function的調用那? 有兩種方式:
1。 在Kernel中實現一個新的系統調用(添加新的系統調用號),用來支持你實現的新功能。 這真是殺雞用牛刀的幹活,吃力不討好。 你需要全全負責User Space到Kernel Space的切換,系統調用號的傳遞,系統調用上下文的保存, 調用後的系統上下文的恢復,Kernel Space向User Space的切換。
2。 復用一個現有的系統函數/調用,來支持你的新功能。 具有抽象意義的系統調用莫過於read,write,open這些為Driver定製的API了。 所以,我們可以簡單的將我們的Function Wrapper成Driver需要的open,read,write等,然後,再按照Driver的要求,將我們的Module Wrapper成一個Driver的設備文件並註冊到系統中。 這樣,User Space中的Client,可以採用傳統的Driver的模式來間接訪問到我們新加的這些Function,並且,可能這些Function根本和實際的設備沒有任何聯繫。
所以,我們不應該把Linux的Driver狹義的理解為設備驅動, 其實,它是一種通用的User Space訪問Kernel Space Function的編程模式。 只要你有這種需求,你就可以實現為Driver,而不需要關心和實現複雜的系統調用過程。 比如Android中的Binder Driver, 根本不是真正的和物理設備打交道, 而僅僅是一個運行於Kernel的Binder Function,但是適配成了Driver,方便User Space中的Client調用。
====================
傳統意義上的Linux Driver僅僅是設備驅動,簡言之,和設備有關,如LCD,Camera等等。 但是, 筆者認為,Linux Driver的作用不僅僅侷限於此,從廣義上講, Linux Driver提供了一種User Space訪問 Kernel中特定Function的通用編程模型,即,平民(User Space中的Application, Process, Lib等)通向皇宮(Kernel)的大道。
如果一個模塊提供的Function必須運行於Kernel Space中(可能是設備相關的Function,從而需要訪問特權指令或者特權地址空間; 抑或者Function本身是設備無關的,但是訪問到了其他的一些運行於Kernel的Function; 甚至於吃飽了沒事幹,就喜歡把原本可以在User Space中運行的API實現在Kernel中,就是喜歡,你管的著嗎?!)。 同時,又希望User Space中的Client能訪問使用這些Function, 那麼, 將其Adapt成Driver是再合理不過的解決方案了。 這是為什麼那??
因為,從理論上來說,Kernel中的API,User Space中的Client是無法直接訪問的,只能利用系統調用陷入到內核態後調用。 Linux的系統調用非常多,均已經固定, 如何支持新的Kernel Function的調用那? 有兩種方式:
1。 在Kernel中實現一個新的系統調用(添加新的系統調用號),用來支持你實現的新功能。 這真是殺雞用牛刀的幹活,吃力不討好。 你需要全全負責User Space到Kernel Space的切換,系統調用號的傳遞,系統調用上下文的保存, 調用後的系統上下文的恢復,Kernel Space向User Space的切換。
2。 復用一個現有的系統函數/調用,來支持你的新功能。 具有抽象意義的系統調用莫過於read,write,open這些為Driver定製的API了。 所以,我們可以簡單的將我們的Function Wrapper成Driver需要的open,read,write等,然後,再按照Driver的要求,將我們的Module Wrapper成一個Driver的設備文件並註冊到系統中。 這樣,User Space中的Client,可以採用傳統的Driver的模式來間接訪問到我們新加的這些Function,並且,可能這些Function根本和實際的設備沒有任何聯繫。
所以,我們不應該把Linux的Driver狹義的理解為設備驅動, 其實,它是一種通用的User Space訪問Kernel Space Function的編程模式。 只要你有這種需求,你就可以實現為Driver,而不需要關心和實現複雜的系統調用過程。 比如Android中的Binder Driver, 根本不是真正的和物理設備打交道, 而僅僅是一個運行於Kernel的Binder Function,但是適配成了Driver,方便User Space中的Client調用。
2011年6月6日 星期一
2011年5月19日 星期四
embedded linux pirmer 2nd edition 研讀 chapter 10.1 MTD
10.1 MTD overview
1.MTD不是一個blk device
2.blk device有 read/write, 而MTD有read/write/erase
3.CF card, SD card, USB flash 都不是MTD device,它們都有FTL(它們看起來就像是blk device)
4.Translation mechanisms can make MTD look like a character or block device
1.MTD不是一個blk device
2.blk device有 read/write, 而MTD有read/write/erase
3.CF card, SD card, USB flash 都不是MTD device,它們都有FTL(它們看起來就像是blk device)
4.Translation mechanisms can make MTD look like a character or block device
訂閱:
文章 (Atom)