35. x86 特有的 ELF 辅助向量¶
本文档描述了 x86 辅助向量的语义。
35.1. 简介¶
ELF 辅助向量使内核能够高效地向用户空间提供配置特定的参数。在此示例中,程序基于内核提供的大小分配了一个替代栈
#include <sys/auxv.h>
#include <elf.h>
#include <signal.h>
#include <stdlib.h>
#include <assert.h>
#include <err.h>
#ifndef AT_MINSIGSTKSZ
#define AT_MINSIGSTKSZ 51
#endif
....
stack_t ss;
ss.ss_sp = malloc(ss.ss_size);
assert(ss.ss_sp);
ss.ss_size = getauxval(AT_MINSIGSTKSZ) + SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL))
err(1, "sigaltstack");
35.2. 公开的辅助向量¶
AT_SYSINFO 用于定位 vsyscall 入口点。它在 64 位模式下不会被导出。
AT_SYSINFO_EHDR 是包含 vDSO 的页面的起始地址。
AT_MINSIGSTKSZ 表示内核向用户空间发送信号所需的最小栈大小。AT_MINSIGSTKSZ 涵盖了内核为容纳当前硬件配置下的用户上下文所消耗的空间。它不包含随后的用户空间栈消耗,这部分必须由用户自行添加。(例如,在上述示例中,用户空间将 SIGSTKSZ 添加到 AT_MINSIGSTKSZ。)