内核堆栈和用户空间堆栈

2024-10-25 08:42:00
admin
原创
71
摘要:问题描述:内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在 ISR 中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么进程如何在这两个堆栈之间进行协调?解决方案 1:内核堆栈和用户堆栈有什么区别?简而言之,没有什么——除了使用内存中的不同位置(因此堆栈指针寄存器的值不同),以及通常...

问题描述:

内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在 ISR 中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么进程如何在这两个堆栈之间进行协调?


解决方案 1:

  1. 内核堆栈和用户堆栈有什么区别?

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

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

特权和安全性分离。首先,用户空间程序可以将其堆栈(指针)设置为任何它们想要的,而且通常没有架构要求甚至没有有效的堆栈指针。因此,内核不能相信用户空间堆栈指针是有效的或可用的,因此需要一组受其控制的指针。不同的 CPU 架构以不同的方式实现这一点;当发生特权模式切换时,x86 CPU 会自动切换堆栈指针,并且不同特权级别要使用的值是可配置的 - 由特权代码(即仅内核)配置。

  1. 如果在 ISR 中声明了局部变量,那么它将存储在哪里?

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

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

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

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

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

根本不需要。调度(如何/何时运行不同的线程,如何保存和恢复它们的状态)是操作系统的任务,进程不需要关心这一点。在创建线程时(每个进程必须至少有一个线程),内核会为它们创建内核堆栈,而用户空间堆栈要么由用于创建线程的机制明确创建/提供(类似makecontext()pthread_create()允许调用者指定用于“子”线程堆栈的内存区域)或继承(通过访问时内存克隆,通常称为“写时复制”/ COW,当创建新进程时)。

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

解决方案 2:

我的答案是从其他 SO 问题中收集来的。

What's the difference between kernel stack and user stack?

作为一名内核程序员,您知道内核应该限制错误的用户程序。假设您为内核和用户空间保留相同的堆栈,那么用户应用程序中的简单段错误会导致内核崩溃并需要重新启动。

每个 CPU 都有一个“内核堆栈”,就像 ISR 堆栈一样,每个进程都有一个“内核堆栈”。每个进程都有一个“用户堆栈”,但每个线程都有自己的堆栈,包括用户线程和内核线程。

http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

所以当我们处于内核模式时,需要堆栈之类的机制来处理类似于用户空间的函数调用、局部变量。

http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

它将存储在 ISR 堆栈(IRQSTACKSIZE)中。仅当硬件支持时,ISR 才会在单独的中断堆栈上运行。否则,ISR 堆栈帧将被推送到中断线程的堆栈上。

用户空间不知道,坦白说,也不关心中断是在当前进程的内核堆栈还是单独的 ISR 堆栈中处理。由于中断是按 CPU 发起的,因此 ISR 堆栈也必须按 CPU 发起。

 Does each process has its own kernel stack ?

是的。每个进程都有自己的内核堆栈。

 Then how the process coordinates between both these stacks?

@FrankH 的回答对我来说很棒。

解决方案 3:

  1. 内核栈和用户栈有什么区别

参考Robert Love的《Linux内核开发》,主要区别在于大小:

用户空间可以静态分配堆栈上的许多变量,包括巨大的结构和数千个元素的数组。

这种行为是合法的,因为用户空间有一个可以动态增长的大型堆栈。

内核堆栈既不大也不动态;它很小,大小固定。

内核堆栈的确切大小因体系结构而异。

在 x86 上,堆栈大小可在编译时配置,可以是 4KB 或 8KB。

从历史上看,内核堆栈是两页,这通常意味着它在 32 位体系结构上是 8KB,在 64 位体系结构上是 16KB——这个大小是固定的和绝对的。

每个进程都有自己的堆栈。

内核堆栈还包含一个指向保存有关线程信息的thread_info结构的指针。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用