Re: [問題]fork疑問

作者: descent (「雄辯是銀,沉默是金」)   2020-01-30 00:10:30
我簡化你的程式:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *ptr="abcdef";
pid_t pid;
pid = fork();
if (pid == 0)
{
printf("child ptr: %p\n", ptr);
}
else
{
printf("parent ptr: %p\n", ptr);
}
return 0;
}
執行結果:
parent ptr: 0x400624
child ptr: 0x400624
我在 Ubuntu 16.04.1 LTS 測試。
gcc 8.1
gcc -g -fno-pic f.c -o f
ptr 在 parent process 和 child process 都是一樣的位址。
反組譯
char *ptr="abcdef";
400551: 48 c7 45 f8 24 06 40 movq $0x400624,-0x8(%rbp)
ptr 位址是 0x400624, 看以下的反組譯 0x400624, 0x61, 0x62 ~ 0x66,
就是 "abcdef"
400620: 01 00 add %eax,(%rax)
400622: 02 00 add (%rax),%al
400624: 61 (bad)
400625: 62 63 64 65 66 (bad) {%k5}
這整段 machine code 在 fork 之後還是長這個樣子, 所以印出來的 ptr 這個值
自然會是一樣的。
如果你想知道 fork 怎麼實作, 可以參考 Orange's 一個作業系統的實現, 裡頭有一章
在說明 fork 是怎麼實作的。
如果你不是在這環境測試, 可能無法得到這結果, 我不知道為什麼在
我的 debian, link 出來的位址和執行位址竟然不同。
※ 引述《b10007034 (Triven)》之銘言:
: https://i.imgur.com/MjKHbOu.png
: https://i.imgur.com/iUkvs5x.png
: 我照著圖中程式在Ubuntu 18.04.3執行,有幾個疑問想請教
: 為什麼child跟parent 的variable’s address一致呢?我以為copy on write會使得它們不
: 一樣
: 承上題,一樣的address不會造成它們aliasing嗎?
: 謝謝看完!
作者: b0920075 (Void)   2020-01-30 01:54:00
0x400624那部分的位置應該只是data section存放的data,不是 machine code...,除非你把process的數值都稱作machine code是說fork的實作應該在kernel內,linux發行版的同版本kernel應該要一樣吧,為啥會不一樣?
作者: Lipraxde (Lipraxde)   2020-01-30 03:48:00
data 當指令 dump...?位置不一樣我還蠻好奇的,有圖嗎?
作者: b10007034 (Warren)   2020-01-30 06:17:00
謝大大回覆!
作者: b0920075 (Void)   2020-01-30 11:44:00
這不就是PIE下的offset嗎,要加上process的base addeess才會是地址阿
作者: Lipraxde (Lipraxde)   2020-01-30 12:15:00
-fno-pic 沒作用@@
作者: b0920075 (Void)   2020-01-30 16:44:00
喔喔所以是gcc的關係嗎?如果是ubuntu用gcc9呢
作者: Lipraxde (Lipraxde)   2020-01-30 17:29:00
直接 -no-pie,不要 f
作者: descent (「雄辯是銀,沉默是金」)   2020-01-30 17:59:00
感謝, 原來還有這個 option

Links booklink

Contact Us: admin [ a t ] ucptt.com