linux 内核栈 用户栈,linux - 内核堆栈和用户空间

内核堆栈和用户堆栈之间的区别是什么?

简而言之,没有 - 除了在内存中使用不同的位置(因此堆栈指针寄存器的值不同),以及通常不同的内存访问保护。即 在用户模式下执行时,内核内存(其中一部分是内核堆栈)即使映射也无法访问。 反之亦然,没有明确地被内核代码请求(在Linux中,通过诸如makecontext()之类的功能),用户存储器(包括用户堆栈)通常不能直接访问。

为什么使用[单独的]内核堆栈?

权限和安全性的分离。 例如,用户空间程序可以使他们的堆栈(指针)成为他们想要的任何东西,并且通常没有架构要求甚至没有有效的架构。 因此,内核不能信任用户空间栈指针有效也不可用,因此需要一组在其自己的控制之下。 不同的CPU架构以不同的方式实现这一点; 当特权模式切换发生时,x86 CPU会自动切换堆栈指针,并且可以配置用于不同权限级别的值 - 特权代码(即只有内核)。

如果在ISR中声明了局部变量,它将在何处存储?

在内核堆栈上。 内核(Linux内核,即)不直接将ISR挂接到x86架构的中断门,而是将中断调度委托给公共内核中断进入/退出机制,该机制在调用注册之前保存预先中断寄存器状态。处理器(S)。 调度中断时CPU本身可能会执行权限和/或堆栈切换,这由内核使用/设置,以便公共中断入口代码可以依赖于存在的内核堆栈。

也就是说,执行内核代码时发生的中断将在那时简单地(继续)使用内核堆栈。 如果中断处理程序具有深度嵌套的调用路径,则会导致堆栈溢出(如果深度内核调用路径中断且处理程序导致另一个深度路径;在Linux中,文件系统/软件RAID代码被iptables活动的网络代码中断 已知在未经调整的旧内核中触发此类内容...解决方案是增加此类工作负载的内核堆栈大小)。

每个进程都有自己的内核堆栈吗?

不仅仅是每个进程 - 每个线程都有自己的内核堆栈(事实上,它也有自己的用户堆栈)。 请记住,进程和线程(对Linux)之间的唯一区别是多个线程可以共享一个地址空间(形成一个进程)。

这两个堆栈之间的进程是如何协调的?

完全没有 - 它不需要。 调度(如何/何时运行不同的线程,如何保存和恢复其状态)是操作系统的任务和过程,不需要关心它。 在创建线程(并且每个进程必须至少有一个线程)时,内核为它们创建内核堆栈,而用户空间堆栈由用于创建线程的任何机制显式创建/提供(函数如makecontext()或pthread_create()允许 调用者指定用于"子"线程的堆栈的内存区域,或继承(通过访问时内存克隆,通常称为"写入时复制" / COW,在创建新流程时)。

也就是说,该过程可以影响其线程的调度和/或影响上下文(状态,其中之一是线程的堆栈指针)。 有多种方法:UNIX信号,setcontext(),pthread_yield() / pthread_cancel(),... - 但这与原始问题有点不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值