一、用户态和内核态

内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利。

内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态。相对来说,用户态就是非特权态,访问的而资源将受到限制。如果一个程序运行在特权态,该程序就可以访问计算机的任何资源,它的资源访问权限不受限制。如果一个程序运行在用户态,其资源需求将受到各种限制。如:要访问操作系统的内核数据结构,如进程表,则需要在特选态下才能办到。如果要访问用户程序里的数据,在用户态即可。

二、用户栈和内核栈

内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每一个进程都有两个栈,一个用户栈,存在于用户空间;一个内核栈,存在于内核空间。当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容都是用户栈地址,使用用户栈;当进程在内核空间时,CPU堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

当进程因为中断或者系统调用陷入到内核态时,进程所使用的堆栈也要从用户栈转到内核栈。进程陷入到内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态之后时,在内核态之后的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了用户栈和内核栈的互转。

那么,知道从内核转到用户态时,用户栈的地址是在陷入内核的时候保存在内核栈里面的,但是在陷入内核的时候,如何知道内核栈的地址?关键在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为当进程在用户态运行时,使用的用户栈,当进程陷入到内核态时,内核保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。所以在进程陷入内核的时候,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了。

转载于:https://www.cnblogs.com/linhaostudy/p/9551822.html

用户态/内核态、用户栈/内核栈相关推荐

  1. 42.Linux应用调试-初步制作系统调用(用户态-内核态)

    1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...

  2. 操作系统用户态内核态线程同步

    1.计算机系统中有两类程序:系统程序和应用程序.为了保证系统程序不被应用程序破坏,为计算机设置了两种状态:内核态和用户态. 内核态运行的程序可以访问计算机的任何资源不受限制. 用户态运行的程序可以直接 ...

  3. 5分钟搞懂用户态,内核态

    5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O.内核必须提供一组通用的访问接口,这些接口就叫系统调用 ...

  4. Linux预备知识(三):系统调用-用户态/内核态

    1)示例 void testfork() { if(0 = = fork()){ printf("create new process success!\n"); }printf( ...

  5. 理解用户态切换到内核态——内核态下有一个特殊的进程

    现在想想,从用户态进入到内核态,相当于一次进程切换--这就好像内核态下有一个特殊的进程. 我就把进入内核态后,理解为进入了一个特殊的进程,一切都忽然合理了,恍然大悟--所以所有用户态的task(称之为 ...

  6. 【Linux 内核】Linux 内核体系架构 ( 硬件层面 | 内核空间 | 用户空间 | 内核态与用户态切换 | 系统调用 | 体系结构抽象层 )

    文章目录 一.Linux 内核体系架构 二.内核态与用户态切换 ( 系统调用层 ) 三.体系结构抽象层 一.Linux 内核体系架构 Linux 内核最初的源码不足一万行 , 当前的 Linux 内核 ...

  7. 【Java 并发编程】线程池机制 ( 测试线程开销 | 启动线程分析 | 用户态 | 内核态 | 用户线程 | 内核线程 | 轻量级进程 )

    文章目录 一.测试线程开销 1.正常测试 2.不创建线程 3.只创建不启动线程 4.只启动不等待执行完成 二.分析测试结果 1.启动线程分析 2.用户线程与内核线程 3.轻量级进程 4.验证 Java ...

  8. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)

    这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...

  9. netlink实现与使用方法详解(用户态/内核态)

    一.什么是netlink Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口. 在Linux 内核中,使用netlink ...

最新文章

  1. 从JSON数据中取出相关数据
  2. 苹果自己设计芯片,但是还是绕不过高通
  3. mysql 常用命令
  4. android录音相关
  5. Spring MVC (mvc框架)
  6. Bzoj3262 陌上花开
  7. 计算几何-判断两条线段是否相交
  8. 【freeradius】使用radclient调试radius协议
  9. 集成运放的电压跟随器有什么作用?
  10. 一种简单的生成伪随机数的方法(翻译)
  11. 集成calibre到cadence virtuoso环境中 load: can‘t access file - “/opt/eda/Mentor/lib/calibre.skl“
  12. 抑郁症自测量表测试软件,抑郁自评:医用抑郁自测量表,快来测一测你的抑郁指数是多少...
  13. ACM教程 - (数论)正整数分解使得乘积最大问题
  14. bam文件读取_SAM/BAM 格式文件内容解析
  15. java如何把汉字转换成机内码_java语言如何将汉字转化成五笔
  16. 飞思卡尔16位单片机(十五)—— 如何批量烧写芯片
  17. 使用three.js + geojson 完成广西地图的绘制(上篇)
  18. Rust结伴学习 — 前言
  19. 【游戏】Pes2021补丁
  20. 【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)

热门文章

  1. mysql中文乱码的一点理解
  2. oracle 创建database link
  3. SimpleAdapter真不简单!
  4. SQL SERVER 优化 50法
  5. 改变TabNavigator控件第一个tab标签的偏移量.
  6. Purism 宣布推出 PureOS 应用商店
  7. SolarReserve在加州开发2GW项目 美国市场将再度崛起?
  8. Class.forName解析以及使用
  9. GitHub 上值得关注的 iOS 开源项目
  10. php中this的含义