Linux操作系统之进程空间管理的用户态和内核态是如何划分的?
Posted Dufre.WC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux操作系统之进程空间管理的用户态和内核态是如何划分的?相关的知识,希望对你有一定的参考价值。
前言
操作系统对我来说很抽象的,学了几年,工作中天天打交道,却不懂它。偶然听了极客时间的一门课(这里就不打广告了),很有启发。其实操作系统就好比一个公司:
- 进程管理:可以理解为公司的项目管理
- 内存管理:可以理解为公共资源的管理,比如会议室
- 文件系统:可以理解为项目开发过程中文档的管理
- 输入输出系统:可以理解为售前售后体系
本篇文章主要有以下内容:
- 进程空间管理之用户态和内核态是如何划分的
用户态和内核态的划分
进程task_struct
里面有一个struct mm_struct
的结构来管理内存
struct mm_struct **mm;
在struct mm_struct
里面,有一个成员变量:
//size of task vm space
unsigned long task_size;
在32位系统中,内核是这样定义TASK_SIZE的:
#ifdef CONFIG_X86_32
/*
* User space process size: 3GB (default).
*/
#define TASK_SIZE PAGE_OFFSET
#define TASK_SIZE_MAX TASK_SIZE
/*
config PAGE_OFFSET
hex
default 0xC0000000
depends on X86_32
*/
#else
/*
* User space process size. 47bits minus one guard page.
*/
#define TASK_SIZE_MAX ((1UL << 47) - PAGE_SIZE)
#define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \\
IA32_PAGE_OFFSET : TASK_SIZE_MAX)
当执行一个新的进程的时候,会做以下的设置:
current->mm->task_size = TASK_SIZE;
对于32位系统,最大能够寻址2^32=4G,其中用户态虚拟地址空间是32G,内核态是1G。
对于64位系统,虚拟地址只使用了48位。1左移了47位,就相当于48位地址空间一半的位置,0x0000800000000000,然后减去一个页,就是0x00007FFFFFFFF000,共128T。同样,内核空间也是128T。内核空间和用户空间之间隔着很大的空隙,以此来隔离。
以上是关于Linux操作系统之进程空间管理的用户态和内核态是如何划分的?的主要内容,如果未能解决你的问题,请参考以下文章
Linux 网络协议栈之内核锁—— 进程上下文与中断上下文的理解