- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
内核栈和用户栈有什么区别?为什么使用内核堆栈?如果在 ISR 中声明了局部变量,它将存储在哪里?每个进程都有自己的内核栈吗?那么这两个堆栈之间的进程是如何协调的呢?
最佳答案
- What's the difference between kernel stack and user stack ?
简而言之,除了使用内存中的不同位置(因此堆栈指针寄存器的值不同)以及通常不同的内存访问保护之外,什么都没有。 IE。在用户模式下执行时,即使映射了内核内存(其中一部分是内核堆栈)也将无法访问。反之亦然,如果内核代码没有明确请求(在 Linux 中,通过 copy_from_user()
等函数),用户内存(包括用户堆栈)通常不能直接访问。
- Why is [ a separate ] kernel stack used ?
权限和安全性分离。一方面,用户空间程序可以使他们的堆栈(指针)成为他们想要的任何东西,而且通常没有架构要求,甚至有一个有效的。因此,内核不能信任用户空间堆栈指针是有效的或可用的,因此需要一组在它自己的控制之下。不同的 CPU 架构以不同的方式实现这一点;当特权模式切换发生时,x86 CPU 会自动切换堆栈指针,并且用于不同特权级别的值是可配置的 - 通过特权代码(即仅内核)。
- If a local variable is declared in an ISR, where will it be stored ?
在内核堆栈上。内核(即 Linux 内核)不将 ISR 直接 Hook 到 x86 架构的中断门,而是将中断调度委托(delegate)给一个通用的内核中断进入/退出机制,该机制在调用已注册的处理程序之前保存中断前的寄存器状态。 CPU 本身在调度中断时可能会执行特权和/或堆栈切换,这是由内核使用/设置的,因此公共(public)中断入口代码已经可以依赖于存在的内核堆栈。
也就是说,在执行内核代码时发生的中断将简单地(继续)使用此时的内核堆栈。如果中断处理程序具有深度嵌套的调用路径,这可能会导致堆栈溢出(如果深度内核调用路径被中断并且处理程序导致另一个深度路径;在 Linux 中,文件系统/软件 RAID 代码被 iptables 处于事件状态的网络代码中断是已知会在未调整的旧内核中触发此类事件...解决方案是为此类工作负载增加内核堆栈大小)。
- Does each process have its own kernel stack ?
不仅仅是每个进程——每个线程都有自己的内核栈(事实上,也有自己的用户栈)。请记住,进程和线程(对于 Linux)之间的唯一区别是多个线程可以共享一个地址空间(形成一个进程)。
- How does the process coordinate between both these stacks ?
根本不需要 - 它不需要。调度(如何/何时运行不同的线程,如何保存和恢复它们的状态)是操作系统的任务,进程不需要关心这一点。当线程被创建(并且每个进程必须至少有一个线程)时,内核为它们创建内核堆栈,而用户空间堆栈要么由用于创建线程的任何机制显式创建/提供(像 makecontext 这样的函数()
或 pthread_create()
允许调用者指定要用于“子”线程堆栈的内存区域)或继承(通过访问内存克隆,通常称为“写时复制”/COW,创建新进程时)。
也就是说,进程可以影响其线程的调度和/或影响上下文(状态,其中是线程的堆栈指针)。有多种方法:UNIX 信号、setcontext()
、pthread_yield()
/pthread_cancel()
、... - 但这是与原始问题有点离题。
关于linux - 内核栈和用户空间栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12911841/
栈一种常见的特殊线性数据结构,其特殊之处在于其操作顺序,下面会详细介绍,也正因为其特性,因此栈可以轻松解决表达式求值、括号匹配、递归算法、回溯算法等等问题。 01、定义 栈的特殊性表现为操作受
目录 实践1 —— 从字符串中移除星号 栈和数组存储数据的方式一样,它们都只是元素的列表。不同之处在于栈的以下3个限制: 数据只能从栈末插入; 数据只
准备工作 工具:idea+jdk8 技术要求:java基础语法 编码环节 首先,我们得先确定下来,用什么数据来模拟栈的操作。由于是一个一个的元素放入栈里面,我们可以考虑用数组来实现。
0. 学习目标 栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有着巨大的不
在可以使用递归(在堆栈中存储状态)和对象创建(在堆中创建新对象)的场景中。 问题 在对象创建和递归之间进行选择时应考虑哪些参数? 我的研究得出以下结论(需要验证这一点) 当可用内存较少时:使用递归 可
下面是我编写的用于检查内存对齐的示例程序。 Pavan@Pavan-pc:~/working_dir/pavan/C$ cat mem3.c #include #include
Instapaper 和 Twitterrific 等应用启动的 View 不是其导航堆栈的 Root View 。我们知道这一点,因为初始 View 已经有一个后退按钮。 Instapaper 推出
有没有办法在调试或正常运行期间的某个时刻可视化 Activity 堆栈? 最佳答案 您可以通过 Activity 管理器获取一些有用的信息。 ActivityManager manag
我想编写一个应用层协议(protocol),在发送 GET 请求时使用 TCP 返回特定的 ASCII 文本。我读了第一HTTP specification和 the SMTP specificati
1、堆和栈的速度性能分析 堆和栈是jvm内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内
一: 概念 栈,同样是一种特殊的线性表,是一种last in first out(lifo)的形式,现实中有很多这样的例子,
java中stack类继承于vector,其特性为后进先出(lastinfirstout). 入栈和出栈实例图: 实例图的java代码实例: ?
1、单链表 1、在我们数据结构中,单链表非常重要。它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList、Ha
本文实例讲述了Python编程实现双链表,栈,队列及二叉树的方法。分享给大家供大家参考,具体如下: 1.双链表 ?
我一遍又一遍地阅读定义,但我仍然不明白ARM中的SP和LR是什么?我了解PC(它显示下一条指令的地址),SP和LR可能类似,但我只是不明白它是什么。你能帮我一下吗? 编辑:如果你能用例子来解释它,那就
我必须使用索引 0 作为堆栈的顶部,并且在实现此操作时遇到问题。我得到了所有 null,但输出 100、200 和 300 是我得到的唯一数字。我忽略的实现有什么问题吗? push 方法应该实现 Ar
我正在用 Java 解决汉诺塔问题。我选择使用 Stacks 作为钉子,除了 move 方法之外,一切都正常。我有规范和 JUnit 测试类,目前通过了 7 项测试中的 6 项,但在移动测试中失败了。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Does this type of memory get allocated on the heap or
首先,抱歉我的英语不好。我将尝试解释我的问题: 我有一个 RootViewController(基于导航的项目)。因此,它显示了表格 View ,当用户选择表格的一行 (didSelectRowAtI
我有一个看起来像这样的类 class A { int b; void B() { int c; } } int main() { A asdf;
我是一名优秀的程序员,十分优秀!