- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
考虑以下针对 Linux x86_64 的程序:
inf.s:
.global _start
.text
_start:
jmp _start
这基本上是一个无限循环。
如果我链接并剥离它,我会得到一个 ELF 可执行文件:
$ gcc -nostdlib inf.s
$ ./a.out &
[1] 15862
$ cat /proc/15862/maps
00400000-00401000 r-xp 00000000 fc:00 11404632 a.out
7fffacdb8000-7fffacdd9000 rwxp 00000000 00:00 0 [stack]
7fffacddd000-7fffacdde000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
在 ELF 可执行文件中,第一个程序头 LOAD
包含占上述 mmaps (a.out) 中第一个条目的映射。 (即使我剥离了所有内容,但此 header 和代码也观察到相同的映射。)execve(2)
调用 fs/binfmt_elf.c
中的 ELF 处理程序,它读取程序 header 并在文件上调用 mmap。
我不明白的是其他三个来自哪里(stack、vdso、vsyscall)。它们在 ELF 文件中没有提及,因此 Linux 内核必须默认设置这三个“匿名”或“特殊”映射。
我的问题是 Linux 内核在内核代码中的什么位置(或如何)创建其他三个映射?它们是在整个执行过程中继承的吗?我似乎看不到它们是在 fs/exec.c
中创建的。
最佳答案
当内核将文件加载到内存中运行时,它们由内核自动创建。
[vdso]
和 [vsyscall]
的精确控制流程很难遵循,因为函数名称的定义和重新定义为宏,具体取决于是否内核是 32 位或 64 位,但一些相关例程包括:
load_elf_binary
在 fs/binfmt_elf.c
中调用 arch_setup_additional_pages
arch_setup_additional_pages
在 arch/x86/vdso/vma.c
arch_setup_additional_pages
在 arch/x86/vdso/vdso32-setup.c
[stack]
映射不是 ELF 特定的,它是由 fs/exec.c
中的 __bprm_mm_init
创建的,它由 execve
调用格式特定加载器之前的代码。
关于linux - `[stack]` 、 `[vdso]` 和 `[vsyscall]` mmaps 从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314535/
我正在努力寻找如何检查 [vsyscall] 表的配置方式(本地或模拟)。该设置应在名为 vsyscall_mode 的变量中设置。谁能阐明如何检查此设置? 通过重新运行 cat/proc/self/
我正在阅读 Linux 上的 VM 处理。显然要执行系统调用,在 x86 上有一个位于 0xFFFFF000 的页面。称为 vsyscall 页面。过去,调用系统调用的策略是使用 int 0x80。这
我想创建程序执行的完整指令跟踪,以收集一些统计数据等。我首先尝试使用 linux 的 ptrace 功能逐步执行程序(使用教程 here)。这将创建两个进程,跟踪进程和调试器,它们通过信号进行通信。我
我正在开发一款使用 ptrace(2) 监控其他进程系统调用的软件。不幸的是,大多数现代操作系统都实现了某种快速用户模式系统调用,在 Linux 中称为 vsyscalls。 是否有任何方法可以禁止单
我做了 sudo cat/proc/1/maps -vv 我正在尝试理解输出。我可以看到许多共享库按预期映射到内存映射段。 7f3c00137000-7f3c00179000 r-xp 0000000
我试图了解 Linux 用于调用系统调用的机制。特别是,我很难理解 VSDO 机制。可以用来调用所有系统调用吗?进程内存中的vsdo页面和vsyscall页面有什么区别?他们总是在那里吗? 例如使用
我正在通过 seccomp 模式为自定义字节码解释器实现 Linux 安全沙箱。为了尽可能减少攻击面,我想在一个完全干净的虚拟地址空间中运行它。我只需要代码和数据段以及可用的堆栈,但我不需要 vsys
考虑以下针对 Linux x86_64 的程序: inf.s: .global _start .text _start: jmp _start 这基本上是一个无限循环。 如果我
我是一名优秀的程序员,十分优秀!