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 网络协议栈之内核锁—— 进程上下文与中断上下文的理解

linux下怎么实现内核态和用户空间进程共享内存

linux 用户态和内核态以及进程上下文中断上下文 内核空间用户空间理解

Linux - 用户态内存映射 和 内核态内存映射

Linux内核——用户堆栈和内核堆栈

Linux系统调用及用户编程接口(API)