原创: http://www.imet.me/post/2018/09-19_linux_kernal_basic/
关于linux内核
- 用户态和内核态,有啥区别 ?
- 虚拟地址空间怎么划分的 ?
用户空间 vs 内核空间
用户空间和内核空间的划分:
下图展示了用户空间和内核空间的划分:
- user space: 应用程序和C库运行在用户空间
- kernal space: 而核心内核和设备驱动程序,以及硬件则常驻内核空间
虚拟地址空间 vs 物理内存
用户空间和内核空间不是物理内存的空间划分,而是抽象的,依据 CPU 的字长来决定空间的大小的。
- 32位CPU 寻址空间: 2的32次方 B = 4GiB
- 64位CPU 寻址空间: 2的64次方 B (实际使用位数是42位或47位寻址空间)
现代的 CPU 基本上都是 64 位,所以最大寻址空间远超目前的物理内存 4GiB, 8GiB, 64GiB 等
- 关于 TASK_SIZE: IA32 位架构, TASK_SIZE 为 3GiB, 所以内核空间为 1GiB
- 64位架构,实际上用不了这么多, 可能会造成一定的空洞,参考 arm 64 的架构
所以虚拟地址空间和物理内存空间是独立的
地址空间切换
应用程序要打印一段字符:
- 应用程序在用户空间调用 C 库的 print 函数
- C 库中 print 函数进行 write() 系统调用
- 然后 CPU 切换到内核空间执行系统 write() 调用
- 当 CPU 执行完系统调用后,又切换到用户空间
参考
- 《深入Linux内核架构》
- 《Linux内核设计与实现》(原书第3版)
- 《深入理解计算机系统》
- [Linux 虚拟内存和物理内存的理解][3]
- ARM64 Linux 内核虚拟地址空间