请教一个linux进程内核栈的问题

wf521yezi 2011-05-04 10:54:24
进程内核栈的空间和一般意义上的在用户态的进程的栈空间有啥区别的哈
...全文
226 12 打赏 收藏 转发到动态 举报
写回复
用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大小吧

4,468

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧