我是靠谱客的博主 强健大象,最近开发中收集的这篇文章主要介绍linux 内核空间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原创: http://www.imet.me/post/2018/09-19_linux_kernal_basic/

关于linux内核

  1. 用户态和内核态,有啥区别 ?
  2. 虚拟地址空间怎么划分的 ?

用户空间 vs 内核空间

用户空间和内核空间的划分:

下图展示了用户空间和内核空间的划分:

  • user space: 应用程序和C库运行在用户空间
  • kernal space: 而核心内核和设备驱动程序,以及硬件则常驻内核空间

linux_kernel_space

虚拟地址空间 vs 物理内存

用户空间和内核空间不是物理内存的空间划分,而是抽象的,依据 CPU 的字长来决定空间的大小的。

  • 32位CPU 寻址空间: 2的32次方 B = 4GiB
  • 64位CPU 寻址空间: 2的64次方 B (实际使用位数是42位或47位寻址空间)

现代的 CPU 基本上都是 64 位,所以最大寻址空间远超目前的物理内存 4GiB, 8GiB, 64GiB 等

linux_virtual_address_space

  1. 关于 TASK_SIZE: IA32 位架构, TASK_SIZE 为 3GiB, 所以内核空间为 1GiB
  2. 64位架构,实际上用不了这么多, 可能会造成一定的空洞,参考 arm 64 的架构

arm64_kernel_space

所以虚拟地址空间和物理内存空间是独立的

地址空间切换

应用程序要打印一段字符:

  1. 应用程序在用户空间调用 C 库的 print 函数
  2. C 库中 print 函数进行 write() 系统调用
  3. 然后 CPU 切换到内核空间执行系统 write() 调用
  4. 当 CPU 执行完系统调用后,又切换到用户空间

kernal_space_user_space_switch

参考

  1. 《深入Linux内核架构》
  2. 《Linux内核设计与实现》(原书第3版)
  3. 《深入理解计算机系统》
  4. [Linux 虚拟内存和物理内存的理解][3]
  5. ARM64 Linux 内核虚拟地址空间

最后

以上就是强健大象为你收集整理的linux 内核空间的全部内容,希望文章能够帮你解决linux 内核空间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部