进程中的用户堆栈、内核栈
来源:互联网 发布:元数据和数据字典 编辑:程序博客网 时间:2024/04/26 19:10
1.什么是内核栈?
在创建进程(即在内存中构建task_struct结构体)时,内核会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。
2.进程用户栈和内核栈的切换
当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。
进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态之行时,在内核态之行的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。
那么,我们知道从内核转到用户态时用户栈的地址是在陷入内核的时候保存在内核栈里面的,但是在陷入内核的时候,我们是如何知道内核栈的地址的呢?
关键在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为,当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。所以在进程陷入内核的时候,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了。
3.用户栈和内核栈在源码中的具体实现
可以参考我的其他博文
用户栈详解:http://blog.csdn.net/tiankong_/article/details/75676131
内核栈详解:http://blog.csdn.net/tiankong_/article/details/75647488
- 进程中的用户堆栈、内核栈
- 内核堆栈和用户堆栈
- 内核进程的堆栈
- 内核进程的堆栈
- 内核进程的堆栈
- 内核进程的堆栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- 进程内核栈、用户栈
- Linux内核-进程内核栈、用户栈
- Linux 内核:进程内核栈、用户栈
- 任务0的内核堆栈,用户堆栈
- Linux0.11 由进程睡眠函数sleep_on()中的堆栈变量tmp引发的思考 关于进程内核堆栈
- Codeforces851B
- Linux下几款C++程序中的内存泄露检查工具
- C 位级操作
- [LeetCode]20. Valid Parentheses
- Java web学习总结2:Tomcat服务器的学习和使用
- 进程中的用户堆栈、内核栈
- LeetCode 27. Remove Element
- gitlab常用维护命令
- Vue中的父子组件通讯以及使用sync同步父子组件数据
- Java web学习总结3:Tomcat服务器学习和使用2
- SQL 基础 总结(12) SQL语句
- linux进程间通信之管道
- 函数指针怎样传递
- 搭建vue + webpack项目环境