当前位置: 首页 > 面试题库 >

为什么内核映射到与进程相同的地址空间?

丘畅
2023-03-14
问题内容

这是一个要阐述的问题:为什么说内核在进程地址空间中?

这可能是一个愚蠢的问题,但在我脑海中浮现出来。有关进程地址空间和虚拟内存布局的所有文字都提到进程地址空间具有为内核保留的空间。例如,在32位系统上,进程地址空间为4GB,其中1
GB为Linux中的内核保留(其他OS上可能有所不同)。

我只是想知道为什么当进程无法直接寻址内核时,为什么说内核位于进程地址空间中。为什么我们不说内核具有与进程不同的地址空间,为什么我们不能为内核本身提供与进程的页表不同的页表呢?

我可以得到有关Linux(Debian或Ubuntu)特定操作系统的解释吗?


问题答案:

进程在这里“拥有”整个虚拟地址空间,内核和其中的用户部分。

它不能窥视和戳内核代码和数据不是由于地址空间不同,而是由于页表中设置的访问权限不同。内核页面的设置方式使常规应用程序无法访问它们。

但是,习惯将一个整体的两个部分称为内核空间和用户空间,这可能会造成混淆。



 类似资料:
  • 问题内容: 在玩Go代码时,我发现映射值不可寻址。例如, 产生错误 mapaddressable.go:7:无法获取mymap [1]的地址 而代码, 工作完美。 为什么会这样呢?为什么Go开发人员选择使某些值无法解决?这是语言的缺点还是功能? 编辑 :来自C ++背景,我不习惯于这种流行趋势。例如,以下代码可以正常工作: 如果有人可以指出为什么在Go中无法实现(或故意没有实现)相同的 寻址 能力

  • 问题内容: 这是关于Linux中的C语言。 我在其中创建2个子进程。然后,在两个子进程中都运行一个函数,其中有一个局部变量。我在其中写一些价值。然后,我用打印此变量的地址。 这两个过程都打印相同的地址。我以为每个孩子都会得到父母记忆的(独立)副本。我需要每个进程都有自己的变量。我该怎么办或我做错了什么? 问题答案: 您需要了解,物理内存与进程的虚拟地址空间之间存在脱节。 每个进程都有 自己的 4G

  • 问题内容: 我正在一个小型嵌入式系统上工作。当我的linux启动到用户空间时,我知道物理内存中的设备在哪里。我想将它们映射到用户空间虚拟地址。目前,我正在通过内核模块进行操作。我使用vmalloc / kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range映射我的物理地址。我不认为这是正确的方法。首先,我分配内存,然后要求内核将虚拟地址空间重新映射到一些不同的

  • 问题内容: 似乎在Windows 32位上,内核将从全部4G用户虚拟内存空间中保留1G虚拟内存,并将 某些 内核空间映射到此1G空间中。 所以我的问题是: 在32位Linux上是否有类似情况? 如果是这样,我们如何看到整个内存布局? 我认为 只能看到某些过程的用户空间布局。 谢谢! 问题答案: 实际上,在32位Windows上,如果没有引导选项,内核将映射到线性地址空间的前2GB,剩下2GB的空间

  • contiki os如何将IP地址映射到MAC地址,该地址存储在哪里? 我知道ICMPv6和RPL的基础知识,但是一旦网络建成,在发送IPv6数据包时,如何知道下一跳的MAC地址?我假设不是每次都发送邻居请求消息。此外,在Cooja上,我看到的唯一ICMPv6消息是RPL消息。 我试图通过grep、谷歌搜索和文档找到答案,但我找不到。

  • 问题内容: 假设使用基于页面的方案分配缓冲区。一种实现mmap的方法是使用remap_pfn_range,但LDD3表示这不适用于常规内存。看来我们可以通过使用SetPageReserved标记保留的页面来解决此问题,以便将其锁定在内存中。但是,不是所有内核内存都已经不可交换,即已经保留了吗?为什么需要显式设置保留位? 这与从HIGH_MEM分配的页面有关吗? 问题答案: 使用mmap方法从内核映