ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

动态扩展Linux堆栈

2019-11-08 08:50:50  阅读:168  来源: 互联网

标签:memory page-fault c-3 linux


我注意到Linux堆栈从小处开始,并由于递归/推送/ vlas导致的页面错误而扩展,直至达到getrlimit(RLIMIT_STACK,…),give或take的大小(系统上的默认值为8MiB).

但是奇怪的是,如果我通过在限制范围内直接寻址字节而导致页面错误,Linux只会在不扩展页面映射的情况下定期进行段错误(但是如果在例如alloca之后执行此操作,则不会出现段错误会导致堆栈扩展).

示例程序:

#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#define CMD "grep stack /proc/XXXXXXXXXXXXXXXX/maps"
#define CMDP "grep stack /proc/%ld/maps"
void vla(size_t Sz)
{
    char b[Sz];
    b[0]='y';
    b[1]='\0';
    puts(b);
}
#define OFFSET (sizeof(char)<<12)
int main(int C, char **V)
{
    char cmd[sizeof CMD]; sprintf(cmd,CMDP,(long)getpid());
    if(system(cmd)) return 1;
    for(int i=0; ; i++){
        printf("%d\n", i);
        char *ptr = (char*)(((uintptr_t)&ptr)-i*OFFSET);
        if(C>1) vla(i*OFFSET); //pass an argument to the executable to turn this on
        ptr[0] = 'x';
        ptr[1] = '\0';
        if(system(cmd)) return 1;
        puts(ptr);
    }
}

什么内核代码正在执行此操作?它如何区分自然堆栈增长和我在地址空间中闲逛?

解决方法:

linux内核将堆栈指针的内容作为限制(在合理范围内).访问堆栈指针减65536下方的堆栈以及32个无符号长整型的大小会导致分段冲突.因此,如果您要沿着堆栈访问内存,则必须确保堆栈指针以某种方式随访问的减少而减小,以使Linux内核扩大该段.请参阅/arch/x86/mm/fault.c中的以下代码段:

if (sw_error_code & X86_PF_USER) {
    /*
     * Accessing the stack below %sp is always a bug.
     * The large cushion allows instructions like enter
     * and pusha to work. ("enter $65535, $31" pushes
     * 32 pointers and then decrements %sp by 65535.)
     */
    if (unlikely(address + 65536 + 32 * sizeof(unsigned long) < regs->sp)) {
        bad_area(regs, sw_error_code, address);
        return;
    }
}

堆栈指针寄存器的值是关键!

标签:memory,page-fault,c-3,linux
来源: https://codeday.me/bug/20191108/2006683.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有