段描述符TYPE欄位在ED=1時成為“向低擴充段”,至於什麼是“向低擴充段”,楊季文老師這樣說:“ED=0表示向高擴充,ED=1表示向低擴充...當段最大為1M時,在自然的向高擴充段內,從0~limit的位移是合法有效位移,而從limit+1~1M-1的位移是非法無效的位移;在向低擴充段中,情形剛好相反,從0~limit的位移是非法無效的位移,而從limit+1~1M-1的位移是合法有效位移。”
我看來看去沒看懂,在網上查了好久也無收穫,準備偃旗息鼓時竟遇到這麼一篇文章,作者探討問題的態度讓我佩服。原文粘下:
最近在研究保護模式,一個問題一直在困擾我,就是段的向下擴充,看雪裡有一篇關於向下擴充的,但還是沒看明白,希望達人能給我解惑 假設我有一個16位段,段基址是 0x2000h,段限是0x5h,那麼這個段大小應該是0x6H,但是向下擴充的布局應該是什麼樣的呢? 第一種可能是:0 <-------- 低地址 0x1ffbh <-------- 段限(0x2000h-0x5h得到) ........ 0x2000h <-------- 段基址(不確定這該不該是段基址) 0xffff <-------- 高地址 那有效地區應該是那一塊?我覺得應該是 0x1ffb~0x2000h,但書上說位移的有效位應該是Limit+1 ~ 1M-1,那麼假設我要訪問第一個自己,Limit+1 = 6,我實在是想不通 段基址和6是如何關聯起來訪問到第一個位元組的。(而且我對第一個位元組的位置在哪裡也不確定,是0x1ffbh還是0x2000h-1? 第二種可能是,只要是向下擴充的,那麼段就從 Base+Limit 變成了Limit+1 ~ 0xffffh,也就是如下: 0 <-------- 低地址 0x2000h <-------- ........ 0x2005h <-------- ........ ........ 0xffff <-------- 高地址 這時段的大小從 6 變成了 0xffff-0x2005h+1,那麼這個時候,段基址為0x2000h(我認為),段位移有效位 Limit+1~1M-1我就能理解了,有效地區是 0x2005h~0xffff,但感覺這樣思考很彆扭,而且和書上說的:由此可見,如果一個段是向下擴充的,則所有的位移必須大於限長,因為其限長是指下限,其基地址從高地址出開始。,和藍色的那句話衝突! 我確實分析不清楚了,網上關於向下擴充的資料極少,哎。 另外,我也看到說ED的方向決定了計算的方式(加/減),但對這句話沒有深刻的認識。 請教各位了,萬分感謝!!! |
| |
[公告]請注意言行舉止,不要讓大家覺得不適!
|
| jinyuelong 初級會員 資 料:註冊日期: Aug 2007文章: 25 精華: 0現金: 179 Kx致謝數: 2獲感謝文章數:0 獲會員感謝數:0 |
22010-10-13, 17:41:48又有點想法 |
|
接上篇,我剛才發現,在第一種布局下,如果0x2000h為基址,0x1ffb~0x2000h為有效地區,那麼如果要訪問到0x1ffffh那個位元組,就是要0x2000h-1,而-1 <==> 0xFFFF(有符號)<==>0xFFFF(無符號)<==>1M-1,而1M-1正好處於書上所說的Limit+1~1M-1的有效位移去,難道CPU把對向下擴充的段的位移強制看成是無符號的,然後和基址相加嗎?? |
| |
[公告]如果你覺得有人語言挑釁,請點每帖右上方的“舉報”按鈕!
|
| jinyuelong 初級會員 資 料:註冊日期: Aug 2007文章: 25 精華: 0現金: 179 Kx致謝數: 2獲感謝文章數:0 獲會員感謝數:0 |
32010-10-13, 18:47:17再補充一點思考 |
|
剛才又仔細想了想,書上原文是: 資料區段的擴充方向和段界限一起決定了資料區段內位移的有效範圍。當段最大為1M位元組時,在向高端擴充的段內,從0到Limit的位移是合法有效位移,而從Limit+1到1M-1的位移是非法無效的位移;在向低端擴充的段內,情形剛好相反,從0到Limit的位移是非法無效的位移,而從Limit+1到1M-1的位移是合法有效位移,注意邊界值Limit對應地址的有效性。段最大為4G時,情形類似。由此可見,如果一個段是向下擴充的,則所有的位移必須大於限長,因為其限長是指下限,其基地址從高地址出開始。反之,若一個段是向上擴充的,則所有位移必須小於等於限長,因為其限長是指上限,基地址從低地址處開始。通過使用段環繞,可以把向下擴充段定義到任何線性地址且可定義為任何大小。 我覺得第一種布局應該是正確的,也就是向下擴充時,段邊界應該是BASE-Limit => 0x2000h-5 => 0x1ffbh,仔細看這句:“由此可見,如果一個段是向下擴充的,則所有的位移必須大於限長,因為其限長是指下限,其基地址從高地址出開始。”,也就是說,對於這個向下擴充的段來說,0x1ffbh確實是下限,任何有效地址都要大於0x1ffbh,(我很奇怪為什麼不是大於等於0x1ffbh)。 但是對於Limit的有效地區是Limit+1~1M-1還是不明白。我自己的猜想是,訪問向下擴充的段的時候,是通過 base+負數實現的,比如 base+(-1) => base-1來訪問0x1fffh,base-6來訪問0x1ffbh,(再一次奇怪為什麼0x1ffbh不是有效地址),然後把負的索引看成無符號數來判斷是否在Limit+1~1M-1之間,也就是說,判斷一次對向下擴充的段是否有效步驟是: 1。首先假設有一個負的索引 X,那麼即將訪問的地址是:BASE+X,注意X是負數,條件1是BASE+X>BASE-Limit(再再一次奇怪為什麼0x1ffbh不是有效地址)。 2. 將負數X看成一個不帶正負號的整數,然後條件2:(DWORD)X > Limit && (DWORD)X <= 1M-1 如果1和2兩個條件都滿足,那麼本次訪問是成功的。以上僅為猜想,望各位積極討論-_- 另外:對書中“通過使用段環繞,可以把向下擴充段定義到任何線性地址且可定義為任何大小。”一句不明白,哪位大俠可以解釋? |
| |
[公告]請注意言行舉止,不要讓大家覺得不適!
|
| jinyuelong 初級會員 資 料:註冊日期: Aug 2007文章: 25 精華: 0現金: 179 Kx致謝數: 2獲感謝文章數:0 獲會員感謝數:0 |
42010-10-13, 20:33:04只有一點疑惑 |
|
剛剛看了下Intel的白皮書,在書中有這麼一段話:For expand-down data segments, the segment limit has the same function but is interpreted differently. Here, the effective limit specifies the last address that is not allowed to be accessed within the segment; the range of valid offset is from (Effective-limit + 1) to FFFFFFFFH if the B is set and from (effective-limit + 1) to FFFFH is the B is clear; An expand-down segment has maximum size when the segment limit is 0. 這應該是最權威的解釋了,還是以2000h為例,5的limit,16位段,那麼記憶體布局應該如下: 0 <-------- 低地址 0x2000h <-------- ........ 0x2005h <-------- Effective-Limit => Base+Limit ........ ........ 0xffff <-------- 高地址 那麼這個段的有效位址範圍應該為 0x2006h~0xffffh,也即Limit的有效範圍是從Limit+1~1M-1,當然,所產生的線性地址應該在2006h到1m-1的範圍內。 對於這個問題,我只有一個疑惑了,為什麼要從Limit+1開始,這說明這個地區的可訪問記憶體因該是從:0x2006h~0xffffH,0x2005那個位置為什麼不允許訪問?? 謝謝 |
其實我在csdn上也有提問,http://topic.csdn.net/u/20120927/17/8a77bab1-e99e-4d88-aea8-b075ee52824e.html相比之下,高低自分。看來要好好反省。