2009年3月23日 星期一

●memtest86+教學 Part6



void do_test(void)
{
int i = 0, j = 0;
unsigned long chunks;
unsigned long lo, hi;

/* If we have a partial relocation finish it */
if (run_at_addr == (unsigned long)&_start) {
run_at_addr = 0xffffffff;
} else if (run_at_addr != 0xffffffff) {
__run_at(run_at_addr);
}

/* If first time, initialize test */
if (firsttime == 0) {
if ((ulong)&_start != LOW_TEST_ADR) {
restart();
}
init();
windows[0].start =
( LOW_TEST_ADR + (_end - _start) + 4095) shr 12;

/* Set relocation address at 16Mb if there is enough memory */
if (v->pmap[v->msegs-1].end gtr 0x1100) {
high_test_adr = 0x01000000;
}
windows[1].end = (high_test_adr shr 12);
firsttime = 1;
}
bail = 0;

//由於左移、右移、大於、小於的符號是html的標籤用途,因此以後程式碼若是有這些符號我便會用左移:shl 右移:shr 大於:gtr 小於:lss 的英文字符表示,否則顯示文章可能格式會有問題。
怎麼一進入c並沒有感到輕鬆自在;你就當作吃苦就是吃補。上面只是截取do_test前面一小段;或許你會每看一行code,心中就充滿一堆問題,真可說是如履薄冰,簡直就是破冰而行;對不起我喜歡有冰字的成語。 大家都已經知道do_test,我就不再多說,就直接進入這個routine:我們一小段一小段來吧! 因為windows[0]的值是(0,0x080000),因為它們是pmap所以單位是4k,所以0x80000對應到2G,但以圖PMAP-2,您會發現,經過compute_segments()routine求算出的結果:windows[0].start=0x21=132k,那是因為以下這一行: ( LOW_TEST_ADR + (_end - _start) + 4095) shr 12;你可以把它劃成下列等式8k+MT(120k)+4k=132K 這個MT為什麼會是120kㄋ,我自己編譯的memtest.bin目前是110k,所以不僅有10k差距,而且它MT只包含(_end-_start) ,並不包含boot code,因此差距就一定大於10k,所有我也不知道為什麼,反正目前就差不多就好了,而且你只要知道這 0→132k被memtest code給佔用了,所有平台都一樣,無法測得這部分。補充一點,就是640k到1mb這裡被dos系統給佔用了,所以也測不到。因此你會發現所有平台的第一個segs都一模一樣,你可參考圖PMAP-1及PMAP-2,都會是: (0X00000021,0X0000009F),即第一個SEGS【v->map】就是132K~636K的測試範圍。當然這是大約值,你可以代入mapping、emapping,就知道實際植,這裡就不囉唆了。也就是說0x00000021會隨著你的memtest86程式碼的大小來決定。若是看的相當吃力,沒關係,我們考慮從別的角度出發‧待續‧
不好意思,由於顯示問題,所以以上這段中文字都沒出現在畫面中;sorry!
--> 閱讀更多...