标签:linux-kernel c-3 linux
TASK_SIZE是一个内核常量,它定义了以最低特权级别运行的代码的可访问内存的上限.
在物理内存少于1GB的系统上,其值通常设置为0xc0000000(本文中包含的所有示例均参考此值).超出此限制的内存包含内核代码.
有没有一种方法可以通过c程序确定正在运行的内核TASK_SIZE?
解决方法:
经过大量的Google搜索和分析,我得到了一个逻辑
假设网络虚拟地址为4gb,并且以1:3的比例划分.
粗略的假设:
内核(上1 GB):c0000000 -ffffffff
用户空间(低于3GB):0-c0000000
比
#define GB *1073741824
unsigned int num;
unsigned int task_size;
task_size=(unsigned)&number+ 1 GB / 1 GB * 1GB;
[进程的堆栈区域将分配到内核空间以下]
因此,num的地址(在堆栈中)=在3 GB范围内,例如:[3214369612]
现在添加1 GB = 1073741824 3214369612 = 4288111436
除以1GB = 3.993614983,即3(无符号整数)
现在乘以1GB = 3 * 1073741824 = 3221225472,即(十六进制的0xC0000000)
因此我得到了内核的起始地址(TASK_SIZE)
我也假设(2:6)比率尝试了它,并获得了正确的结果.
这是一个合理的逻辑,请评论???
标签:linux-kernel,c-3,linux 来源: https://codeday.me/bug/20191119/2032891.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。