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