用户栈和内核栈

1. 操作系统中,每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。

2. 当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

3. 内核栈是内存中属于操作系统空间的一块区域,其主要用途为:

1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;

2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

4. 用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

PS:那么为什么不直接用一个栈,何必浪费那么多的空间呢?    

1)如果只用系统栈。系统栈一般大小有限,如果中断有16个优先级,那么系统栈一般大小为15(只需保存15个低优先级的中断,另一个高优先级中断处理程序处于运行)。

但用户程序子程序调用次数可能很多,那样15次子程序调用以后的子程序调用的参数、返回值、返回点以及子程序(函数)的局部变量就不能被保存,用户程序也就无法正常运行了。

2)如果只用用户栈。我们知道系统程序需要在某种保护下运行,而用户栈在用户空间(即cpu处于用户态,而cpu处于内核态时是受保护的),不能提供相应的保护措施(或相当困难)。

时间: 2024-12-28 01:58:08

用户栈和内核栈的相关文章

进程内核栈、用户栈

进程内核栈.用户栈 1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存 在于内核空间.当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈:当进程在内核空间时,cpu堆栈指针寄存器里面的内 容是内核栈空间地址,使用内核栈. 2.进程用户栈和内核栈的切换 当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈. 进程陷入内核态后,先

进程的内核栈和用户栈

进程内核栈.用户栈 1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈:当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈. 2.进程用户栈和内核栈的切换 当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈. 进程陷入内核态后,先把用

用户态/内核态、用户栈/内核栈

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

用户态、核心态详解及进程切换和系统调用原理

1)示例 void testfork() { if(0 = = fork()) { printf("create new process success!\n"); } printf("testfork ok\n"); } 这段代码很简单,从功能的角度来看,就是实际执行了一个fork(),生成一个新的进程,从逻辑的角度看,就是判断了如果fork()返回的是则打印相关语句,然后函数最后再打印一句表示执行完整个testfork()函数.代码的行逻辑和功能上看就是如此简单

操作系统知识点_用户编程接口

3.用户编程接口 函数调用和系统调用 函数调用运行在用户空间,为程序员提供调用真正的幕后完成实际事务的是系统调用接口.系统函数是内核提供给应用程序的接口,属于系统的一部分. 函数调用:调用函数库中的一段程序或函数:与用户程序联系:在用户地址空间执行:运行时间属于"用户时间":属于过程调用,系统开销小: 系统调用:各个系统的系统调用是不同的:调用系统的内核服务:是操作系统的入口点:在内核地址空间执行:"系统"时间:在用户和内核空间切换开销大:unix中有大约90个.如

面试复习重点——数据结构、操作系统、计算机网络、数据库。

必看书籍:剑指offer.程序员面试宝典 来自:腾讯.搜狐.网易.烽火.百度.大众点评.美团.风行 1. 死锁是什么?什么情况下产生?怎么解决? 2. 设计模式(尤其是单例模式,要会写该模式的程序框架,要注意同步问题,怎么实现在要用时才创建) 3. 线程的同步?为什么要同步?线程间通信方式. 4. 进程与线程的区别,进程间通信方式. 5. 容器类:hashmap与hashtable的区别,arraylist与linkedlist的区别 6. 为什么要用多线程,实现多线程的两种方式,有什么区别?

内核进程的堆栈 [转]

每一个进程(包括普通进程和内核进程)的地址空间都分为用户地址空间和内核地址空间两部分,在32位的x86机器上,用户地址空间的范围是0~3G,内核 地址空间的范围是3G~4G.对于不同的进程,其用户地址空间会随着进程不同而不同,但所有进程的内核地址空间则都是一样的.对于内核进程,由于其始终运 行在内核态,所以没有用户地址空间,其对应的tast_struct结构体中的mm域也就被赋值为NULL.而堆的概念应该是只存在于进程的用户地址空间 中,所以内核进程是没有堆一说的.内核线程可以用kmalloc

操作系统基础知识2

一.进程管理 1.进程与线程有什么区别 进程是程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU 调度和分配的基本单位,线程基本上不拥有系统资源. 区别如下: a.一个线程必定属于也只能属于一个进程:而一个进程可以拥有多个线程并且至少拥有一个线程. b.属于一个进程的所有线程共享该线程的所有资源,包括打开的文件.创建的Socket 等.不同的进程互相独立. c.线程又称为轻量级进程. d.进程是程序的一次执行,线程可以理解为程序中一段

系统调用学习笔记

开始学内核的时候,一定会讲从ring3到ring0的调用,但是网上很多的文章讲的模棱两可,这次记录下我对系统调用的研究........ 一个线程由用户态进入内核态的途径有3种典型的方式: 1.  主动通过int 2e(软中断自陷方式)或sysenter指令(快速系统调用方式)调用系统服务函数,主动进入内核 2.  发生异常,被迫进入内核 3.  发生硬件中断,被迫进入内核 现在的cpu调用api进入内核都是通过sysenter指令(AMD的处理器是syscall)进入到ring0,系统在启动的时