TASK_SIZE是一个内核常量,它定义了在最低权限级别工作的代码的可访问内存的上限。
在物理内存小于1GB的系统上,其值通常设置为0xc0000000(本文中包含的所有示例均引用此值)。超出此限制的内存包含内核代码。
有没有办法通过c程序确定正在运行的内核TASK_SIZE?
答案 0 :(得分:3)
经过大量的谷歌搜索和分析后,我得到了一个逻辑
假设净虚拟地址为4gb,并以1:3的比例进行划分。
粗略的假设: -
内核(高1 gb):c0000000 -ffffffff
USer space(低于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)的比例,并得到了正确的结果。
这是一个公平的逻辑,请评论???