linux 栈地址,Linux中为什么要随机函数栈的起始地址

1. 如前文(http://www.linuxidc.com/Linux/2011-08/41869.htm)所述,为了执行一个程序,首先do_execve建立数据结构,并将一些数据从用户空间拷贝到内核空间,然后调用search_binary_handler加载可执行文件映像。

intdo_execve(char* filename,

char__user *__user *argv,

char__user *__user *envp,

structpt_regs * regs)2. search_binary_handler()寻找对应的handler。对于elf 文件,即是load_elf_binary。

intsearch_binary_handler(structlinux_binprm *bprm,structpt_regs *regs)

3. load_elf_binary()读取可执行文件头文件信息,进行简单的一致性检测,分配用户模式的页表,设置栈的起始地址,加载可执行文件映像到内存;然后调用create_elf_tables(); 最后调用start_thread(),执行_start函数开始的代码。

staticintload_elf_binary(structlinux_binprm *bprm,structpt_regs *regs)

4. create_elf_tables()将参数指针,环境变量数组指针压入用户模式的栈。

staticint

create_elf_tables(structlinux_binprm *bprm,structelfhdr *exec,

unsignedlongload_addr, unsignedlonginterp_load_addr)值得注意的是,create_elf_tables()很可能会在压栈前调整栈指针。比如,在支持超线程的体系结构里面,通过随机化初始栈指针,可以减少进程间在L1上的竞争。如下所示,随机化初始栈指针的页内偏移量,并使得栈指针保持16字节对齐。

unsignedlongarch_align_stack(unsignedlongsp)

{

if(!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)

sp -= get_random_int() % 8192;

returnsp & ~0xf;

}为什么针对页内偏移呢?

在某些体系结构中,首先要完成从逻辑地址到物理地址的转换,然后才能去cache中查找该物理地址是否已经在cache当中。这样,cache命中的代价较高。一种常用的技巧是,在L1中,逻辑地址索引-物理地址比较(virtually indexed, physically tagged)[1]。思路是,利用逻辑地址与物理地址的页内偏移一样的特点,用页内偏移进行索引,页号通过TLB转换成物理页号进行tag比较。这样,可以不经转换,就先索引,从而加快速度。这样,如果两个逻辑地址的块内偏移一样,它们索引的cache行也就一样,所以需要随机化页内偏移来减少L1的竞争。其缺点是,L1的set大小,不能超过页的大小。换言之:

L1的大小 <= 相联度 * 块的大小 * 页的大小5. start_thread(),执行_start函数开始的代码

void

start_thread(structpt_regs *regs, unsignedlongnew_ip, unsignedlongnew_sp)

{

set_user_gs(regs, 0);

regs->fs                = 0;

set_fs(USER_DS);

regs->ds                = __USER_DS;

regs->es                = __USER_DS;

regs->ss                = __USER_DS;

regs->cs                = __USER_CS;

regs->ip                = new_ip;

regs->sp                = new_sp;

/*

* Free the old FP and other extended state

*/

free_thread_xstate(current);

}参考:[1] Computer Architecture: A Quantitative Approach, Fourth Edition. Page 291-292. 0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值