2009年4月15日 星期三

●memtest86+教學 Part10

圖一
上幾回我有提過memtest86+可以透過uart將畫面透過com port傳送到console;其畫面如圖一。今天我們先來介紹一些重要的變數:
struct vars variables = {};
struct vars * const v = &variables;
別小看這個"v",它運行於整個memtest86,可以說是核心資料結構;所以我們先從了解它著手:
struct vars {
int test; //目前所選取或正在測試中的pattern
int pass; //已經passㄉloop數
unsigned long *eadr; //沒用到,所以不知道宣告這ㄍ做什麼,真正用到ㄉ是在struct err_info erri裡面。
unsigned long exor; //同上
int msg_line; //要印出文字或數字ㄉ列數
int ecount; //錯誤數量
int ecc_ecount; //ecc錯誤數量,這應該也沒用到,因為我們不是測server dimm
int msegs; //從呼叫int 15h ax=e820h所得到ㄉ實體記憶體的segment數量
int testsel; //目前所選取ㄉpattern
int scroll_start; //看這個v->scroll_start = v->msg_line * 160;就知道意思
int rdtsc; //是否開始計時的變數(這ㄍ變數和assembly 指令一模一樣,不要搞混)
int pae; //判斷cpu是否支援分頁ㄉ變數
int pass_ticks; //目前的滴答數
int total_ticks; //總滴答數
int pptr; //顯示"#"總進度Progress的目前位置資訊
int tptr; //顯示"#"目前測試pattern進度Progress的目前位置資訊
int beepmode; //是否啟用pc喇叭
struct err_info erri; //這ㄍ結構底下會介紹
struct pmap pmap[MAX_MEM_SEGMENTS]; //以下4ㄍ這裡很難--
struct mmap map[MAX_MEM_SEGMENTS]; //用幾ㄍ字說清楚,--
ulong plim_lower; //我已另有--
ulong plim_upper; //文章說明。
ulong clks_msec; //CPU時脈
ulong starth; //開始計時ㄉ滴答數高32bits
ulong startl; //開始計時ㄉ滴答數低32bits
ulong snaph; //因為這ㄍ#undef TEST_TIMES所以沒用到此變數
ulong snapl; //因為這ㄍ#undef TEST_TIMES所以沒用到此變數
ulong extclock; //這也是CPU時脈,不知道為什麼要搞死大家
int printmode; //顯示fail的模式:預設值是PRINTMODE_ADDRESSES1
int numpatn; //當fail顯示模式為PRINTMODE_PATTERNS2時,要知道有幾個pattern fail
struct pair patn [BADRAM_MAXPATNS]; //還沒研究
ulong test_pages; //所插記憶體pmap總數
ulong selected_pages; //所插記憶體pmap總數(所以真ㄉ要搞死大家)
ulong reserved_pages; //type2及type4的pmap總數
};

struct err_info {
struct xadr low_addr;
struct xadr high_addr;
unsigned long ebits;
long tbits;
short min_bits;
short max_bits;
unsigned long maxl;
unsigned long eadr;
unsigned long exor;
unsigned long cor_err;
short hdr_flag;
};
以上這ㄍstruct在init.c中有初始化如下
v->erri.low_addr.page = 0x7fffffff;
v->erri.low_addr.offset = 0xfff;
v->erri.high_addr.page = 0;
v->erri.high_addr.offset = 0;
v->erri.min_bits = 32;
v->erri.max_bits = 0;
v->erri.min_bits = 32;
v->erri.max_bits = 0;
v->erri.maxl = 0;
v->erri.cor_err = 0;
v->erri.ebits = 0;
v->erri.hdr_flag = 0;
v->erri.tbits = 0;
當然要研究這ㄍstruct就是要搞懂error.c。

沒有留言:

張貼留言