Linux内核中一种利用宏对变量赋值的方式
扫描二维码
获取更多精彩
嵌入式杂牌军
编辑|追梦星空
公众号|嵌入式杂牌军
过去的时间总是可以对上的,只是更多的时候我们关心的是做成了或没做成什么,可能会有所失,但却容易忽略了这“”有所失“”是如何造成的。很多事不可能“”严丝合缝”的去完成,时间不可能完全的被利用,时间总是会掺入一些沙子,你的双手并不能抓住所有。你给了自己余暇就要接受那沙子的意义,但要注意每个人时间里掺入沙子的意义是不同的。
上升之人一直处于半逆境之中;生命回落,逆向生长。
文 章 导 读
最近在看Linux内核关于内存管理相关的内容,在内核源码中看到有一种利用宏对变量进行赋值的一种方式,感觉很不错,可以借鉴一下哈,分享出来以便大家推而广之!
阅读过程中有什么问题可以后台交流哈,!
1 代码背景介绍
0)科普——什么是缓冲区溢出攻击
缓冲区溢出是指写入缓冲区的数据量超过缓冲区的设计大小,溢出的数据覆盖了相邻存储单元中的数据。
攻击方式:攻击者通过溢出缓冲区将恶意代码注入内存,使进程运行时跳转并执行恶意代码来进行攻击。
缓冲区溢出攻击主要分为栈溢出、堆溢出、格式化字符串溢出和整型变量溢出等,其中以栈溢出最为常见。
1)代码的目的
为了让Linux内核更加安全,为了让缓冲区溢出攻击变得困难,Linux内核对内存映射区域、栈和堆添加了可以选择起始地址随机属性的开关。
2)代码区域随机属性起作用的条件
① 首先要看进程描述符成员personality是否设置了ADDR_NO_RANDOMIZE。
② 全局变量randomize_va_space所赋的值是多少。
2 实际代码
1)代码的位置
mm/memory.c文件中100行左右。
2)全局变量可能的赋值
① randomize_va_space = 0。
关闭虚拟地址空间随机化,即对上面的区域起始地址不进行随机化处理。
② randomize_va_space = 1。
使内存映射区和栈的起始地址随机化(两个区域的随机化处理)。
③ randomize_va_space = 2。
使内存映射区域、栈和堆的起始地址都进行随机化处理(三种区域全部随机化处理)。
3)实际代码
/*
* Randomize the address space (stacks(栈), mmaps(内存映射区), brk(堆), etc.).
*
* ( When CONFIG_COMPAT_BRK=y we exclude brk from randomization,
* as ancient (libc5 based) binaries can segfault. )
*/
int randomize_va_space __read_mostly =
#ifdef CONFIG_COMPAT_BRK
1;
#else
2;
#endif
代码很简单,通过CONFIG_COMPAT_BRK定义与否,来对randomize_va_space进行赋值控制。
补充说明:
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
randomize_va_space后面的__read_mostly是将randomize_va_space指定存放到.data..read_mostly段中。
定义到这个段的数据,再linux内核被加载时,数据会自动被存放到cache中,以提高整个系统的执行效率。
需要注意的是平台没有cache,或者有cache,但是并没有提供存放数据的接口就不能用__read_mostly指定数据自动放到cache了。
今天就到这吧,希望对小伙伴有所帮助哈,喜欢的话欢迎转发、点赞、分享、在看、转载哈,。
免责声明:本文内容源于网络、技术手册或相关书籍,版权归原作者所有。如涉及侵权问题,请与我联系删除。
推荐一款Linux下好用的截图工具shutter——shutter的安装、配置与使用