+ -
当前位置:首页 → 问答吧 → 弱弱的问: 为什么要分内核栈和用户栈?

弱弱的问: 为什么要分内核栈和用户栈?

时间:2006-03-16

来源:互联网

1. 为什么要分内核栈和用户栈? 不能用一个么?
2. 为什么内核栈的大小是有限的,固定的?

谢谢!

作者: pavin   发布时间: 2006-03-16

我觉得这样做逻辑清晰,两个栈各有各的用处,而且是同一时间两个栈中都是有数据的,你怎么把他们堆到一起?内核空间只有3~4G这一块地址空间,而且有一些固定的开销,然后所有的进程的内核栈都在这里面,这就决定了栈的大小不能太大;

作者: xieweiyi   发布时间: 2006-03-16

to xieweiyi:
1. 内核栈和用户栈不可能同时使用吧? 多个处理器的不知道.
2. 我听说, 只要是32位的,内核栈就是8K;64位的,内核栈就是16K. 跟内核虚拟地址空间在3-4G没什么关系吧?

作者: pavin   发布时间: 2006-03-16

to xieweiyi:
1. 内核栈和用户栈不可能同时使用吧? 多个处理器的不知道.
2. 我听说, 只要是32位的,内核栈就是8K;64位的,内核栈就是16K. 跟内核虚拟地址空间在3-4G没什么关系吧?

作者: pavin   发布时间: 2006-03-16

为什么说 linux 稳定,两个堆栈分开是原因之一。当应用程序崩溃时不会影响到系统内核。

引用:
作者: pavin
2. 为什么内核栈的大小是有限的,固定的?
谢谢!
没研究过内核,不知道为什么。不过这也有点儿烦,比如 ndiswrapper 驱动有时会引起内核栈溢出。ndiswrapper 的开发者也解决不了这个问题。

作者: biinn   发布时间: 2006-03-17

1 硬件要求必须
别忘了,内核的代码和数据实际上是对所有进程共享的,如果不为每个进程保留
对应的内核栈,内核就没法为不同的进程执行不同的代码。
2 安全
如果用户栈和内核栈共享,用户就可以修改栈内容来突破内核安全保护。

作者: 刻苦猫   发布时间: 2006-03-17

to pavin:
我是说两个栈里面同时有数据,而且是有效的数据,你不能因为一个去破坏另外一个
虚拟地址空间,我只是想说内核的很有限,64位的虚拟地址空间是多大?

to 刻苦猫:
应该为每个进程保留栈,但是这个栈我觉得放在用户空间也是可以实现的,简单的说
现在的内核栈底为了节省空间,并没有存放整个task_struct而是放置了一个指针,
那么我们只要把一些必要的信息存放在内核空间,而运行时的堆栈放在用户空间,应该
也是可行的;
安全是一个不错的理由,我觉得这是关键;

作者: xieweiyi   发布时间: 2006-03-17

引用:
作者: xieweiyi
to 刻苦猫:
应该为每个进程保留栈,但是这个栈我觉得放在用户空间也是可以实现的,
应用程序的栈本来就在用户空间,不是吗?

作者: biinn   发布时间: 2006-03-17

引用:
作者: xieweiyi
应该为每个进程保留栈,但是这个栈我觉得放在用户空间也是可以实现的,简单的说
现在的内核栈底为了节省空间,并没有存放整个task_struct而是放置了一个指针,
那么我们只要把一些必要的信息存放在内核空间,而运行时的堆栈放在用户空间,应该
也是可行的;
安全是一个不错的理由,我觉得这是关键;
如果用户栈和内核栈在一块,马上下面两个非常严重的问题会出现
1 本地线程,内核要保存额外的信息来判断切换线程后使用那个线程栈,与其如此
,还不如直接用内核栈,因为内核栈本来与本地线程就是1,1对应的。
2 内核抢占, 内核抢占要么放弃,要么就非常沉重,因为不论抢占是否需要执行,
内核都要切换页表,为了一句if切换整个地址空间太累了。

作者: 刻苦猫   发布时间: 2006-03-17

纵观所有的操作系统大致可以非常单栈内核和双栈内核。单栈内核有单栈内核的好处,一个常见的嵌入式实时操作系统使用的就是单栈内核,我们公司将Linux移植到一个没有MMU的CPU上,就将Linux更改成单栈内核,这是出于对整个系统可靠性和实时性的考虑。现在它工作非常正常,当然双栈内核也有其好处。

作者: camelguo   发布时间: 2006-03-18

多堆栈是intel的处理器规定要这样做的,除非你的系统只运行在一个特权级上,不然任务从一个特权级到另一个特权级时同时一定会发生堆栈的切换(不知说堆栈切换对不对)。

LINUX的内核运行在特权级0,应用程序运行在特权级3,从应用程序到内核时会发生堆栈切换的。

作者: is02bing   发布时间: 2006-03-25