【问题标题】:Linux kernel memory layoutLinux内核内存布局
【发布时间】:2019-08-21 22:44:06
【问题描述】:

我正在使用 64 位 x86 Linux 计算机。

在这种架构上,每个进程都有自己的 64 位地址内存空间。

内存块由 MMU 组件映射到物理内存(或交换)。

现在,我想知道内核内存是如何工作的。 如果我用这段代码写一个 linux 内核模块:

char * address;
address = 0x.....;
*address = 0x42;

这个 0x42 会写在哪里? 直接在物理内存中?

或者 linux 内核是否像任何用户和进程一样作为 64 位内存空间?

谢谢

【问题讨论】:

  • Linux内核模块的代码被某个进程执行。进程根据其地址空间访问内存。这适用于用户空间和内核空间的访问。区分用户空间和内核空间访问的是地址空间。在此处查看更多信息:stackoverflow.com/questions/13013491/…

标签: linux-kernel


【解决方案1】:

每个进程都分配有 64 位虚拟地址空间。其中用户空间最多可以映射 128TB,另一半用于内核。基本上内核驻留在RAM中,并且映射到每个进程的虚拟地址空间。

在内核中,所有内核线程共享相同的地址空间。因此,如果您访问内存(考虑到存在映射,没有页面错误),它将写入该位置。

【讨论】:

  • 好吧,如果我有 2 个进程,那么 2 个进程之间的内核空间是完全相同的吗?
  • 是的。所有过程的映射都是相同的。阅读罗伯特爱Linux内核开发,你会得到更多的想法。
  • 谢谢。但是有一点我不明白:current_task 是一个指向 task_struct 的指针。但是这个值在每个进程上是不同的。因此,如果一个值可以从一个进程到另一个进程不同,我们不能说映射是相同的......
  • 来自elixir.bootlin.com/linux/v4.0/source/arch/x86/kernel/cpu/… current_task 是 percpu 变量,它保存在该 cpu 上执行的 current_task。所以它会改变核心上正在执行的内容。
  • 谢谢。你知道找到地址的方法吗(我只需要当前进程的 task_struct 的地址?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2014-11-13
  • 2013-07-12
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多