进程 起始地址 linux,linux进程的代码段是存储进程的哪一段内存地址里的?

如题。

|

貌似x86下一般在0x80000000吧。

|

在x86 linux平台中, 一般0x08048000为可执行文件起始地址(代码段)

这是由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再去找。

|

那么就有问题了,假设是在x86上。

1:那么多个不同的程序编译后,_excutable_start 都是这里怎么办?岂不是不同进程都会去哪里执行? 感觉很乱阿?

=======================================

虚拟地址和物理地址是不同的概念。

|

应该先弄清楚保护模式运行

和进程之间的关系,以及进程空间的分配

|

LS

两位说的我都知道。

只不过是虚拟地址相同, 但是具体分配的时候,物理地址不确定而已。

我只是当时打字打得太快了。

我随后的内容就表达了,这个意思。 分配出来的vma的地址就是 在虚拟空间中分配的,然后只要真正访问那里的时候才会page_fault分配物理地址,并从文件中读近来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值