社区
Linux_Kernel
帖子详情
请教一个linux进程内核栈的问题
wf521yezi
2011-05-04 10:54:24
进程内核栈的空间和一般意义上的在用户态的进程的栈空间有啥区别的哈
...全文
226
12
打赏
收藏
请教一个linux进程内核栈的问题
进程内核栈的空间和一般意义上的在用户态的进程的栈空间有啥区别的哈
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Kyph
2011-05-13
打赏
举报
回复
系统调用没有用堆栈传参,而是用寄存器传参;一旦进入内核态,立刻就在内核堆栈中保存用户态上下文环境。
Kyph
2011-05-13
打赏
举报
回复
系统调用,没有采用堆栈传递参数的方式,而是采用寄存器传递参数的方式;一旦进入内核,就在内核堆栈中保存用户态上下文。。。
wf521yezi
2011-05-08
打赏
举报
回复
[Quote=引用 8 楼 keywie007 的回复:]
引用 7 楼 hqin6 的回复:
引用 6 楼 wf521yezi 的回复:
引用 4 楼 keywie007 的回复:
这个可以从硬件上来讲:
我们知道x86体系的cpu有4(0~3)种模式(当然arm也有这样的模式[用户模式,系统模式等]),没一种模式都对应的有堆栈,也就是说,我们从3级模式进入0级模式,会跟新栈顶指针,从3到0时又会还原从0进入3的栈顶指针。也就是说0~3……
[/Quote]
我的意思是系统调用的时候,刚开始参数都是存储在用户的栈空间的,那它是如何传递到内核态去的呢
太乙
2011-05-07
打赏
举报
回复
[Quote=引用 8 楼 keywie007 的回复:]
引用 7 楼 hqin6 的回复:
引用 6 楼 wf521yezi 的回复:
引用 4 楼 keywie007 的回复:
这个可以从硬件上来讲:
我们知道x86体系的cpu有4(0~3)种模式(当然arm也有这样的模式[用户模式,系统模式等]),没一种模式都对应的有堆栈,也就是说,我们从3级模式进入0级模式,会跟新栈顶指针,从3到0时又会还原从0进入3的栈顶指针。也就是说0~3……
[/Quote]呵呵,我错了……学习了!http://oss.org.cn/kernel-book/ch04/4.4.1.htm
玩世不恭
2011-05-07
打赏
举报
回复
[Quote=引用 7 楼 hqin6 的回复:]
引用 6 楼 wf521yezi 的回复:
引用 4 楼 keywie007 的回复:
这个可以从硬件上来讲:
我们知道x86体系的cpu有4(0~3)种模式(当然arm也有这样的模式[用户模式,系统模式等]),没一种模式都对应的有堆栈,也就是说,我们从3级模式进入0级模式,会跟新栈顶指针,从3到0时又会还原从0进入3的栈顶指针。也就是说0~3级都保存的有自己栈顶指针的现场。我们通常……
[/Quote]
这里没有进程对应的内核栈一说吧?!
每个用户进程都会有自己的内核态的堆栈(就是进程进入内核态使用的堆栈),在Linux内核里面,是和task_struct 一起分配的
参数应该都是在进程所对应的用户空间中……??
太乙
2011-05-07
打赏
举报
回复
[Quote=引用 6 楼 wf521yezi 的回复:]
引用 4 楼 keywie007 的回复:
这个可以从硬件上来讲:
我们知道x86体系的cpu有4(0~3)种模式(当然arm也有这样的模式[用户模式,系统模式等]),没一种模式都对应的有堆栈,也就是说,我们从3级模式进入0级模式,会跟新栈顶指针,从3到0时又会还原从0进入3的栈顶指针。也就是说0~3级都保存的有自己栈顶指针的现场。我们通常所说的用户态的堆栈是指3级时栈顶指针(esp)所……
[/Quote]这里没有进程对应的内核栈一说吧?!参数应该都是在进程所对应的用户空间中……
wf521yezi
2011-05-07
打赏
举报
回复
[Quote=引用 4 楼 keywie007 的回复:]
这个可以从硬件上来讲:
我们知道x86体系的cpu有4(0~3)种模式(当然arm也有这样的模式[用户模式,系统模式等]),没一种模式都对应的有堆栈,也就是说,我们从3级模式进入0级模式,会跟新栈顶指针,从3到0时又会还原从0进入3的栈顶指针。也就是说0~3级都保存的有自己栈顶指针的现场。我们通常所说的用户态的堆栈是指3级时栈顶指针(esp)所指的堆栈,核心态堆栈是指0级时栈顶指针所指的堆栈(……
[/Quote]
那是否在系统调用的时候,系统调用函数的参数也是存在在进程所对应的内核栈上,最终执行系统调用时取参数也是从进程对应的内核栈去取的??
用心飞翔
2011-05-04
打赏
举报
回复
内核栈空间不占用内存资源,用户栈空间占用内存资源
YTerrenceLau
2011-05-04
打赏
举报
回复
1,内核栈不能换出,用户栈可以换出;
2,内核栈物理地址连续(如果是多页),用户栈只是逻辑连续;
3,内核栈起始地址非固定,创建的时候分配的,用户栈起始地址固定,有系统映射的;
Kyph
2011-05-04
打赏
举报
回复
普通线程其实有三种状态:用户态\内核态\中断态
内核线程只有两种状态:内核态\中断态
用户态一般在虚拟空间运行,堆栈负责函数调用之间的切换;
内核态和中断态一般在实空间运行,堆栈负责三态之间的切换和内核态/中断态函数调用之间的调用.
基于上述基本原则,就可以自己推算内核堆栈和用户堆栈之间的其他区别.
玩世不恭
2011-05-04
打赏
举报
回复
这个可以从硬件上来讲:
我们知道x86体系的cpu有4(0~3)种模式(当然arm也有这样的模式[用户模式,系统模式等]),没一种模式都对应的有堆栈,也就是说,我们从3级模式进入0级模式,会跟新栈顶指针,从3到0时又会还原从0进入3的栈顶指针。也就是说0~3级都保存的有自己栈顶指针的现场。我们通常所说的用户态的堆栈是指3级时栈顶指针(esp)所指的堆栈,核心态堆栈是指0级时栈顶指针所指的堆栈(当然,这进针对x86系统结果,arm也是一样的道理,大同小议)。
如果要从软件上面讲的话,这个需要的篇幅就很长了。
总的来说,核心态的堆栈是和进程控制块(PCB)一起分配的,好像是3个页面(我不是很记得了),内存数量不是很多,所以写核心代码时要注意不要分配很大的临时变量(因为临时变量是放在堆栈里面的)。
可以推荐LZ理解下x86的保护模式,看看TSS那东西
fish_phenix
2011-05-04
打赏
举报
回复
内核栈和进程pcb在一起,是一片连续的区域,只有当进程转化为内核态才会用到,里面数据也只和内核相关
内核栈很小,好象就8k
用户栈则存放一些普通的栈数据,进程在任何状态下都会有用户栈,一般有1m大小吧
LINUX
内核
完全剖析
LINUX
内核
完全剖析19.pdf 从入门到精通,还得好好看才行
新手如何搞定
Linux
操作系统.pdf
新手如何搞定
Linux
操作系统.pdf
c++/
linux
转正申请书
工作总结\转正申请书,个人c++/
linux
转正申请书 最后我会用谦逊的态度和饱满的工作热情做好我的本职工作,为公司创造价值, 同公司一起展望美好的未来! 我深信我的选择是正确的,感谢您的阅读,诚挚希望公司考虑我的申请!
操作系统试验
本资源为操作系统试验报告,包括5个试验,包含源码!
Linux_Kernel
4,468
社区成员
17,459
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章