34. x86 特定 ELF 辅助向量¶
本文档描述了 x86 辅助向量的语义。
34.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");
34.2. 公开的辅助向量¶
AT_SYSINFO 用于定位 vsyscall 入口点。它在 64 位模式下不导出。
AT_SYSINFO_EHDR 是包含 vDSO 的页面的起始地址。
AT_MINSIGSTKSZ 表示内核向用户空间传递信号所需的最小堆栈大小。AT_MINSIGSTKSZ 包含内核为当前硬件配置容纳用户上下文所消耗的空间。它不包含后续用户空间堆栈消耗,必须由用户添加。(例如,在上面,用户空间将 SIGSTKSZ 添加到 AT_MINSIGSTKSZ。)