1. int *a[10]
2. int (*a)[10]
自己理出的規則如下:
array前面是array的名子
int *a[10] ,a是array的名子,然後這個array放的是 int *
int (*a)[10],(*a)是array的名子,然後array裡面放的是 int
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日 星期一
訂閱:
文章 (Atom)