问题标签 [context-switch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
operating-system - 从内核模式返回到用户模式
我对 Unix 内核中的模式切换的理解有点困惑。我在这里给出我的理解并将其打开以供讨论/更正。
在从用户模式转换到内核模式时,处理器会在每进程用户堆栈和每进程内核堆栈之间进行切换。然后每个进程的用户堆栈段选择器和堆栈指针存储在内核堆栈中,然后eip
指令指针(用户模式下的返回地址)和其他硬件寄存器被压入内核堆栈
当内核必须返回用户模式时,trapret
代码会将存储在内核堆栈中的所有值弹出回硬件寄存器。
但是当iret
从内核堆栈中弹出 eip 时,应该执行的下一条指令是用户模式下的返回地址。
这发生在没有完全弹出内核堆栈的其他值的情况下。
其余的值 ( %cs, %eflags, %esp, %ss
) 如何恢复?
内核堆栈中存在的用户堆栈指针如何弹回 %esp ?
operating-system - 内核运行 ISR 例程时的限制
内核模式和 ISR 例程中有哪些重要的注意事项?例如 -
- 运行中断处理程序时是否禁用上下文切换?
当进程在关键部分内时会发生上下文切换吗?- 内核模式内的哪些情况值得禁用进一步的中断?
进程切换为什么会发生在页面错误上,其中进程从磁盘获取数据,但在其他中断发生期间不会发生。您如何对可执行路径是否可以中断/重新调度/抢占进行分类?
当进程处于内核模式或处理 ISR 例程时,还需要记住哪些其他事情?
performance - 在Linux中测量C程序缓存命中/未命中和cpu时间的最简单工具?
我正在用 C 编写一个小程序,我想测量它的性能。
我想看看它在处理器中运行了多少时间,以及它有多少缓存命中+未命中。关于上下文切换和内存使用的信息也很高兴。
该程序的执行时间不到一秒钟。
我喜欢/proc/[pid]/stat的信息,但是程序死/被杀后不知道怎么看。
有任何想法吗?
编辑:我认为 Valgrind 增加了很多开销。这就是为什么我想要一个简单的工具,比如 /proc/[pid]/stat,它总是在那里。
c - CPU的舍入模式什么时候可以改变?
在相当多的文章中,他们建议使用fistp
指令快速转换 float->integer。这取决于 CPU 的当前舍入模式,因此您必须设置它。
但是这种舍入模式可以在程序运行期间被其他程序改变吗?通过操作系统?
更糟糕的是,这是一种可能的情况(伪代码)吗?
x86 - (写内核)如何修改中断描述符表?
我正在编写一个小内核,只是为了稍微了解一下低级的东西。现在,它在 Virtual Box 中启动,我可以在屏幕上显示文本、分配一些内存以及其他非常基本的事情。它是用 C++ 和一点 asm 编写的。
我想探索的一件事是多任务处理背后的机制。据我了解,它是这样的:
- 内核初始化中断描述符表,以便周期性地(例如毫秒)发出中断并调用内核中定义的例程。
- 当例程被调用时,它可以决定将代码/数据段和堆栈指针设置为另一个程序的上下文,即“上下文切换”。
所以,它在概念上似乎很简单,但我知道细节会变得更加复杂。我在网上找到了一些东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如来自 Linux 内核)。
但是,设置描述符表的方式似乎是这样的:
- 将一些数据发送到 PIC(
outb
以及其他)以对其进行初始化。 - 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数能够成为信号处理程序。
- 用 加载表
lidt
。
但是,我找不到太多关于专门做这些事情的信息,或者这是否正确。有没有人有困惑的内核编写者的资源?
windows - 每个线程如何拥有 CPU 寄存器
在我读过的几个地方,
每个线程都有自己的一组 CPU 寄存器和自己的堆栈
在这里,我可以理解堆栈,它是一种数据结构。但是线程如何拥有自己的 CPU 寄存器。它们的数量是固定的,并且系统中正在运行的线程数量是无限的。
问候
c - kernel/sched.c/context_switch() 是否保证每次切换进程时都会被调用?
我想更改 Linux 内核,以便每次当前 PID 更改时 - 即,切换一个新进程 - 执行一些诊断代码(如果好奇,下面会详细解释)。我做了一些挖掘,似乎每次调度程序选择一个新进程时,context_switch()
都会调用该函数,这是有道理的(这只是粗略分析sched.c/schedule()
)。
问题是,Linux 调度程序现在对我来说基本上是黑魔法,所以我想知道这个假设是否正确。是否保证每次选择一个新进程以在 CPU 上获得一些时间时,都会调用 context_switch() 函数?或者内核源代码中是否有其他地方可以在其他情况下处理调度?(或者我完全误解了这一切?)
为了提供一些背景信息,我正在使用 MARSS x86 模拟器尝试对某些程序进行一些检测和测量。问题是我的仪器需要知道某些代码事件对应于哪个执行过程,以避免误解数据。这个想法是使用 MARSS 中的一些内置消息传递系统在每次上下文切换时传递新进程的 PID,因此它始终知道当前正在执行的 PID。如果有人能想到一种更简单的方法来实现这一点,那也将不胜感激。
operating-system - 我可以在 FreeRTOS 上下文切换期间保存 MSP430 CRC 寄存器吗?
我在中等数据模型中使用带有 FreeRTOS 7 的 MSP430F5418。
我想在 FreeRTOS 上下文切换上保存 MSP CRC 寄存器。我像这样编辑了porttext.s43。
在保存上下文宏中,将 15 个寄存器压入堆栈后,我压入 CRC 寄存器。(CRCDI是要保存的MSP寄存器)
在恢复上下文宏中,我在弹出 15 个寄存器之前弹出了 CRC。
它应该可以工作,但事实并非如此。程序控制将不知道位置。
有人有什么想法吗?
.net - 上下文切换时间是否包含在线程量子时间中?
我的意思是如果线程的量子时间是 20 毫秒,那么 20 的一些时间(15 毫秒)用于上下文切换,而其他时间(5 毫秒)用于执行?
linux - 为什么这里是 sys time 0?
当我这样做时$(time sleep 1)
,我得到了:
我不确定为什么sys
时间是 0,所以nanosleep
是从用户空间调用的?
另外,实时是否等于上下文切换时间+实际睡眠时间(1s)?