从c程序确定TASK_SIZE

时间:2016-02-18 11:24:39

标签: c linux linux-kernel

TASK_SIZE是一个内核常量,它定义了在最低权限级别工作的代码的可访问内存的上限。

在物理内存小于1GB的系统上,其值通常设置为0xc0000000(本文中包含的所有示例均引用此值)。超出此限制的内存包含内核代码。

有没有办法通过c程序确定正在运行的内核TASK_SIZE?

TASK_SIZE

1 个答案:

答案 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)的比例,并得到了正确的结果。

这是一个公平的逻辑,请评论???