当前位置: 技术问答>linux和unix
linux进程的代码段是存储进程的哪一段内存地址里的?
来源: 互联网 发布时间:2016-06-02
本文导语: 如题。 | 貌似x86下一般在0x80000000吧。 | 在x86 linux平台中, 一般0x08048000为可执行文件起始地址(代码段) 这是由ld链接程序决定的。 ld --verbose 命令就可以看到0x08048000 = _excu...
如题。
|
貌似x86下一般在0x80000000吧。
|
在x86 linux平台中, 一般0x08048000为可执行文件起始地址(代码段)
这是由ld链接程序决定的。
ld --verbose 命令就可以看到0x08048000 = _excutable_start
这是由ld链接程序决定的。
ld --verbose 命令就可以看到0x08048000 = _excutable_start
|
进程分 内核进程 和 用户进程呀
|
那么就有问题了,假设是在x86上。
1:那么多个不同的程序编译后,_excutable_start 都是这里怎么办?岂不是不同进程都会去哪里执行? 感觉很乱阿?
2:看内核的code, 在load exe的时候如果bprm->file->f_op->mmap 不为null的时候,那就调用
do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
PROT_READ | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
fd_offset);
将可执行文件的text段 map或load到 N_TXTADDR(ex)所指的地址, 但是 N_TXTADDR(ex)是个宏 要么是0,要么是page_size。
N_TXTADDR(ex)是do_mmap的第2 个参数 add,
如果跟踪do_mmap下去的话,add 有可能会被get_unmapped_area更改,假设里面是用通用的arch_get_unmapped_area的, 那么有两种可能。
1:当N_TXTADDR(ex)是0 的话,就会去0x40000000为起始位置,然后在该进程中找一个第一个合适的vma,即该vma能够容纳下整个text段的内容。并返回该vma的地址。
2:当N_TXTADDR(ex)为page_size的时候,也会在当前进程中去找第一个满足下列条件的vma
a:vma-〉end 〉add(即page_size),
b:该vma能够容纳整个text段
如果找到了, 就返回 pag_align(addr),如果找不到,会按照1再去找。
1:那么多个不同的程序编译后,_excutable_start 都是这里怎么办?岂不是不同进程都会去哪里执行? 感觉很乱阿?
2:看内核的code, 在load exe的时候如果bprm->file->f_op->mmap 不为null的时候,那就调用
do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
PROT_READ | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
fd_offset);
将可执行文件的text段 map或load到 N_TXTADDR(ex)所指的地址, 但是 N_TXTADDR(ex)是个宏 要么是0,要么是page_size。
N_TXTADDR(ex)是do_mmap的第2 个参数 add,
如果跟踪do_mmap下去的话,add 有可能会被get_unmapped_area更改,假设里面是用通用的arch_get_unmapped_area的, 那么有两种可能。
1:当N_TXTADDR(ex)是0 的话,就会去0x40000000为起始位置,然后在该进程中找一个第一个合适的vma,即该vma能够容纳下整个text段的内容。并返回该vma的地址。
2:当N_TXTADDR(ex)为page_size的时候,也会在当前进程中去找第一个满足下列条件的vma
a:vma-〉end 〉add(即page_size),
b:该vma能够容纳整个text段
如果找到了, 就返回 pag_align(addr),如果找不到,会按照1再去找。
|
那么就有问题了,假设是在x86上。
1:那么多个不同的程序编译后,_excutable_start 都是这里怎么办?岂不是不同进程都会去哪里执行? 感觉很乱阿?
=======================================
虚拟地址和物理地址是不同的概念。
1:那么多个不同的程序编译后,_excutable_start 都是这里怎么办?岂不是不同进程都会去哪里执行? 感觉很乱阿?
=======================================
虚拟地址和物理地址是不同的概念。
|
应该先弄清楚保护模式运行
和进程之间的关系,以及进程空间的分配
|
LS
两位说的我都知道。
只不过是虚拟地址相同, 但是具体分配的时候,物理地址不确定而已。
我只是当时打字打得太快了。
我随后的内容就表达了,这个意思。 分配出来的vma的地址就是 在虚拟空间中分配的,然后只要真正访问那里的时候才会page_fault分配物理地址,并从文件中读近来。
两位说的我都知道。
只不过是虚拟地址相同, 但是具体分配的时候,物理地址不确定而已。
我只是当时打字打得太快了。
我随后的内容就表达了,这个意思。 分配出来的vma的地址就是 在虚拟空间中分配的,然后只要真正访问那里的时候才会page_fault分配物理地址,并从文件中读近来。