0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么进程地址空间中要包括操作系统(内核)呢?

dyquk4xk2p3d 来源:码农的荒岛求生 2023-04-18 09:09 次阅读

今天聊聊进程地址空间这点小事。

说到进程的地址空间,大家可能都知道这样一张图:

2b7bd68c-dd79-11ed-bfe3-dac502259ad0.png

这张图就是Linux程序运行起来后所谓的进程地址空间,这里包括我们熟悉的代码区、数据区、以及堆区和栈区,今天我们不讲解这些区域,而是重点关注这个地址空间中最上面的一块区域——内核,这里的问题是:

为什么进程地址空间中要包括操作系统(内核)呢?要想知道这个问题的答案,你需要知道操作系统到底是如何管理内存的。

现代操作系统大都利用虚拟内存系统来管理内存,我们看的上图,这一段连续的内存区域其实只是一个假象,物理内存中并不一定真的存在这样一个内存布局,利用虚拟内存系统将一些非连续的内存块(页)映射到一段连续的地址空间——也就是我们看到的上图,这就是所谓的虚拟内存。

我们看到的地址都是虚拟地址,物理内存与虚拟内存的映射关系维护在页表中,当CPU执行机器指令时需要根据页表将虚拟地址转为物理内存地址,但这个过程对程序员来说是透明的,我们看不到这样的一个转换过程。

那么为什么内核要将自己映射到进程的地址空间呢? 我们知道CPU在执行指令时是有权限状态的,x86处理器有4个权限状态,操作系统一般使用其中两个,这就是所谓的用户态与内核态,我们写的程序运行在用户态,操作系统运行在内核态。

2b875dd6-dd79-11ed-bfe3-dac502259ad0.png

在一些场景下,像我们读写文件、收发网络数据等都需要操作系统的帮助,也就是调用操作系统提供的服务,这个过程就是所谓的系统调用,关于系统调用我们在之前的文章中已经多次讲解过了,在系统调用这个场景下就涉及从用户态切换到内核态。 此外还有其它场景涉及用户态与内核态的切换,像中断处理以及异常处理等。

既然你知道我们的程序运行时需要频繁的进行用户态与内核态切换那么剩下的就简单了。

2b93e6f0-dd79-11ed-bfe3-dac502259ad0.png

如果内核与用户态程序位于不同的地址空间,那么当用户态与内核态进行切换时就势必涉及页表的切换——从用户态进入内核态需要将用户进程的页表切换为内核页表,而如果从内核态退出回到用户态就涉及将内核页表切换为用户进程页表,切换页表对于计算机系统来说算是一个不小的开销。

而如果内核与用户态程序位于同一个地址空间中,那么上述页表切换的开销就可以避免了,这就是为什么内核要将自己映射到进程地址空间的重要原因。 好啦,这篇就到这里,希望对大家理解进程地址空间有所帮助。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18304

    浏览量

    222394
  • 操作系统
    +关注

    关注

    37

    文章

    6293

    浏览量

    121919
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26930

原文标题:为什么进程地址空间中包括操作系统?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    linux操作系统下的进程通信设计

    信号量值大于0,进程被唤醒,转入步骤(1)。(4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。维护信号量状态的是Linux
    发表于 04-16 09:17

    什么是QNX操作系统

    网络通信和中断处理,其进程在独立的地址空间中运行。所有其他操作系统服务都实现为协作的用户进程,因此QNX
    发表于 06-07 14:16

    什么是Linux系统调用,包括哪些内容

    (调用内核空间程序),这时操作系统就必须利用系统提供给用户的“特殊接口”——系统调用规定用户进程
    发表于 08-23 11:55

    Linux操作系统基础知识学习

    什么是系统调用?为什么引入系统调用?A:(1)操作系统为用户态的进程与硬件设备(如CPU、磁盘和打印机等)之间的交互提供了一组接口,这些接
    发表于 11-30 10:43

    开发必读,操作系统进程和线程

    模式中用户的线程对操作系统不可见。优点:用户线程开几个都没问题,且上下文切换发生用户空间,切换的效率较高;缺点:一个用户线程如果阻塞了,则整个进程都将会阻塞,另外在多核 CPU中,是
    发表于 06-18 09:35

    开发必读,操作系统进程和线程

    模式中用户的线程对操作系统不可见。优点:用户线程开几个都没问题,且上下文切换发生用户空间,切换的效率较高;缺点:一个用户线程如果阻塞了,则整个进程都将会阻塞,另外在多核 CPU中,是
    发表于 07-01 06:30

    操作系统为什么分内核态和用户态?这两者如何切换?

    操作系统为什么分内核态和用户态,这两者如何切换?进程地址空间会划分为哪些区域?堆和栈有什么区别?
    发表于 07-23 09:01

    为何将Linux操作系统划分为用户和内核

    :使用Linux操作系统提供的功能2、Linux操作系统的组成:用户和内核空间——为何将Linux操作系统划分为用户和
    发表于 12-15 08:35

    有关Linux系统的PBC (进程控制块)基础知识介绍

    ,比如打开的文件,挂起的信号,处理器状态,内核数据结构,内存映射地址空间等。在操作系统中,内核的调度对象时线程,而不是
    发表于 06-23 16:27

    什么是操作系统内核

    什么是操作系统内核 操作系统内核是指大多数操作系统的核心部分。它由操作系统中用于管理存储器、文
    发表于 06-17 07:23 9661次阅读

    深入浅出Linux的进程地址空间

    我们知道,在32位机器上linux操作系统中的进程地址空间大小是4G,其中0-3G是用户空间,3G-4G是
    的头像 发表于 06-20 09:57 1784次阅读

    浅谈鸿蒙操作系统的微内核

    获取用户所有权限的做法,在安全性上大大提升。 什么是微内核呢? 微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成;这些原语,仅仅包括了建立一个
    的头像 发表于 10-13 12:36 5840次阅读

    Linux系统为什么需要区分内核空间与用户空间

    ,或叫线性地址空间)为 4G(2的32次方)。也就是说一个进程的最大地址空间为 4G。 操作系统
    的头像 发表于 10-14 14:38 3382次阅读
    Linux<b class='flag-5'>系统</b>为什么需要区分<b class='flag-5'>内核</b><b class='flag-5'>空间</b>与用户<b class='flag-5'>空间</b>?

    以32位系统为例介绍内核空间和用户空间

    )为 4G(2的32次方)。也就是说一个进程的最大地址空间为 4G。 操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问
    的头像 发表于 11-12 17:41 2812次阅读
    以32位<b class='flag-5'>系统</b>为例介绍<b class='flag-5'>内核</b><b class='flag-5'>空间</b>和用户<b class='flag-5'>空间</b>

    Linux系统为什么需要引入虚拟地址

    在 Linux 系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!在 Linux 系统中,每一个进程都在自己独立的地址
    的头像 发表于 10-07 17:28 547次阅读
    Linux<b class='flag-5'>系统</b>为什么需要引入虚拟<b class='flag-5'>地址</b>