[心得] x86的segment
學過system programming或OS的人都知道
一個program可以分成code(text)、data、stack以及heap(bss)這四個segment
對x86來說就是用cs、ds、ss、es、fs和gs來assign各個segment的start address
理論上這四個segments是可以透過segment register來分離memory space的
也就是說在VM的支援下這些segments都可以享有各自獨立且互不影響的4GB memory space
但是許多C/C++ compiler在實作上會利用stack來暫存function的local variables
這將會導致一個問題出現------ss和ds必須共用一個4GB的memory space
否則在傳遞call by reference的pointer過程中將會出現非常嚴重地邏輯錯誤
舉個例子來說
main()
{
func_1();
}
void func_1()
{
int x = 1;
func_2(&x);
}
void func_2(int *ptr)
{
*ptr = 10;
}
正常來說這段程式在執行後func_1的x應該會等於10才對
假設今天ds、ss、bp和sp的值分別為
ds = 0x0000
ss = 0x1000
bp = 0x1000
sp = 0x1000
將這段程式用gcc compile之後會產生這樣的assembly code
func_1:
pushl %ebp
movl %esp, %ebp
subl $20, %esp // 清出20 bytes給local variables使用
// esp = 0x0fe0
movl $0, %eax
movl $1, -4(%ebp) // 將x的值存放在stack(0x1000:0x0ffc)中
leal -4(%ebp), %eax // 將&x放入eax中
movl %eax, (%esp) // 將eax置入stack(0x1000:0x0fe0)中
call func_2
leave
ret
func_2:
pushl %ebp
movl %esp, %ebp
leal 8(%ebp), %eax // 將ptr所指向的address放入eax中
// eax = 0x0ffc
movl $10, (%eax) // 將10放入(%eax)裡
popl %ebp
ret
問題就出現在紅色這一行instruction
(%eax)在x86裡隱含的實際意義應該是%ds:(%eax)而非%ss:(%eax)
也就是說實際上程式是把10放到了0x0000:0x0ffc
但是x正確address的應該是在0x1000:0x0ffc
以上是最近一個月在寫一些low level的system program時遇到的問題
之前把ds和ss分開設在不同的地方
結果只要一遇到pointer的傳遞,程式執行的結果就會出錯
到最後才發現是因為GCC是利用stack來存放local variables造成的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.105.115
→
05/10 07:44, , 1F
05/10 07:44, 1F
應該是protect mode和real mode都適用
只是我為了方便說明
所以ds和ss存的值不是用LDT或GDT來表示
而是直接用他們的segment start address
況且GCC好像也沒辦法編出real mode下16-bits的code
※ 編輯: SILee 來自: 61.59.105.115 (05/10 14:44)
推
05/10 22:37, , 2F
05/10 22:37, 2F
→
05/10 22:37, , 3F
05/10 22:37, 3F
→
05/10 22:39, , 4F
05/10 22:39, 4F
→
05/10 22:39, , 5F
05/10 22:39, 5F
→
05/10 22:41, , 6F
05/10 22:41, 6F
→
05/10 22:41, , 7F
05/10 22:41, 7F
推
05/11 16:47, , 8F
05/11 16:47, 8F
推
05/12 08:11, , 9F
05/12 08:11, 9F
→
05/12 08:12, , 10F
05/12 08:12, 10F
→
05/12 08:13, , 11F
05/12 08:13, 11F
→
05/12 08:14, , 12F
05/12 08:14, 12F
→
05/12 13:09, , 13F
05/12 13:09, 13F
→
05/12 13:09, , 14F
05/12 13:09, 14F
推
05/12 14:18, , 15F
05/12 14:18, 15F
→
05/12 14:22, , 16F
05/12 14:22, 16F
推
05/31 11:08, , 17F
05/31 11:08, 17F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章