gpt4 book ai didi

assembly - CPU 寄存器和多任务处理

转载 作者:行者123 更新时间:2023-12-02 19:28:01 24 4
gpt4 key购买 nike

我目前正在学习汇编,但我对 CPU 寄存器如何与多任务一起工作感到困惑。所以在多任务系统中。 CPU 可以随时暂停某个程序的执行并运行另一个程序。那么在这一步中寄存器值是如何保存的呢?寄存器是压入堆栈还是以其他方式?

最佳答案

how the CPU registers work with Multitasking.



CPU 基本上可能无法处理多任务,任务切换可能(并且正在)在软件中实现。某些 CPU (intel x86) 可能具有硬件状态 (TSS https://en.wikipedia.org/wiki/Task_state_segment) 和 TR(任务寄存器)以原子地将状态从一个任务更改为另一个任务。 (TSS 仍可用于切换 protection rings ring0/ring3;但不能用于切换任务。)

So in a Multitasking System, CPU can pause the execution of a certain program at any time and run another program.



几乎。

在大多数能够运行操作系统和用户空间任务的 CPU 中,有 interrupts用于在某些外部事件(来自硬件的信号、中断请求、IRQ)的情况下暂停当前代码(任务)的执行并跳转到几个特殊的内核函数之一,称为 interrupt handlers (ISR,中断服务程序)。

So how are the register values preserved during this step ?



大多数寄存器在中断进入时保持不变。有些是在中断进入过程中由CPU保存的。

CPU内部实现了中断支持机制,它确实将当前任务的一些cpu寄存器保存到了一些空间(是的,它 can save to stack,x86 cpu推送*FLAGS,CS,IP)。 CPU跳转到这些例程,注册于 Interrupt Vector Table/ Interrupt Descriptor Table (IDT) 数组(在 IVT 的情况下存储在特殊的内存位置或由特殊的 CPU 寄存器 IDT 指向 IDT);对于 IRQ 1,它将选择记录号 1(例程 1);对于 IRQ 20,它将选择例程 20。

Are the registers pushed to stack or any other way ?



两个都。有的在中断中由CPU推送,有的由中断处理程序的命令推送。 (还有在内核模式下更改EIP的代码......)

ISR 例程知道 CPU 保存了什么,如果它想使用更多的寄存器(它基本上是想要的),它将压入堆栈(或保存到其他地方)其他用户寄存器,然后做它的中断工作,然后手动恢复保存注册回来,然后将使用特殊命令退出中断( iret in x86 word ,它将从堆栈中重新加载“CS:IP 和 FLAGS”)。如果堆栈中的原始 IP 未受影响,CPU 将继续执行原始用户代码(原始任务),并且所有寄存器都保持不变。如果作者或中断处理程序想要,他可以在做 iret 之前更改堆栈中的 IP 地址。 ,所以它会在其他地方返回(它可能会返回内核模式或某些任务或重新启动 PC 等)。

更改当前正在运行的任务(上下文切换, wikiosdev )是可以使用中断完成的问题之一。基本上有两种上下文切换:非自愿(当任务刚运行时不想离开 CPU 时)和自愿(当任务要求操作系统进行上下文切换时,要么因为当前任务可能不再运行,要么当前任务被礼貌并给其他任务机会运行 - sched_yield 在 linux 世界中)。

无意识的上下文切换通常是在周期性定时器中断的帮助下完成的。几年前,这个定时器用于每 10、1 或 3 毫秒生成一些特定的 IRQ(定时器/RTC IRQ);和定时器中断处理程序调用 OS scheduler决定当前任务运行时间过长(超过其 time slicetime-sharing 的量程)还是有更高优先级的任务准备运行。

自愿上下文切换通常在系统调用的帮助下完成(当操作系统使用权限分离时,在 ring3 中运行用户空间代码,在 ring0 中运行内核空间代码 - protection rings 的概念),这是在特权级别之间切换的特殊 CPU 指令(它可能/使用软件生成的中断实现; int 80h 在较旧的 linux/BSD 中)。用户空间代码要求内核做一些工作,例如 read来自文件或套接字或 write归档。如果有的话,它也可能会要求内核运行调度程序以切换到其他任务 - 使用 sched_yield系统调用。如果系统调用代码决定请求需要一些时间并且任务在请求完成之前不能进一步运行(系统调用 blocks - 阻止当前任务运行;从 TASK_RUNNING 切换它的状态),它也会调用操作系统调度程序.

操作系统调度程序可能会保持当前任务运行(如果它处于可运行状态)或可能决定切换到其他任务(实际上是其他任务的内核模式;也会有从系统调用返回来恢复任务的 CS:IP+ FLAGS) 并使用 switch_to 执行此操作asm 宏: http://lxr.free-electrons.com/source/arch/x86/include/asm/switch_to.h?v=4.6#L27 :
 33         /*                                                              \
34 * Context-switching clobbers all registers, so we clobber \
35 * them explicitly, via unused output variables. \
36 * (EAX and EBP is not listed because EBP is saved/restored \
37 * explicitly for wchan access and EAX is the return value of \
38 * __switch_to()) \
39 */ \
40 unsigned long ebx, ecx, edx, esi, edi; \
41 \
42 asm volatile("pushfl\n\t" /* save flags */ \
43 "pushl %%ebp\n\t" /* save EBP */ \
44 "movl %%esp,%[prev_sp]\n\t" /* save ESP */ \
45 "movl %[next_sp],%%esp\n\t" /* restore ESP */ \
46 "movl $1f,%[prev_ip]\n\t" /* save EIP */ \
47 "pushl %[next_ip]\n\t" /* restore EIP */ \
48 __switch_canary \
49 "jmp __switch_to\n" /* regparm call */ \
50 "1:\t" \
51 "popl %%ebp\n\t" /* restore EBP */ \
52 "popfl\n" /* restore flags */ \
53 \

如果有唯一的非 sleep 用户任务并且它进入休眠状态,则没有准备好运行的可见任务。但实际上有一个 pid 为 0 的不可见任务,有时称为 swapper 或 idle ,它具有最低优先级并随时准备运行。它将在循环中运行一些特殊的 CPU 指令来冷却 CPU - HLT ;它还可能会检查事件/调用调度程序以查找可运行的任务。

一些奇怪的实时操作系统(名称以“V”开头,以版本 5 结尾)没有用户空间/内核空间分离和隔离(所有代码都在 ring 0 中运行)可能会实现自愿上下文切换,而无需系统调用或软件中断;但通常调用调度程序。

有用的链接:
  • https://en.wikibooks.org/wiki/X86_Assembly/Advanced_Interrupts
  • http://wiki.osdev.org/Interrupt
  • http://wiki.osdev.org/Context_Switching
  • http://www.informit.com/articles/article.aspx?p=364068 - How Multitasking Works at the Hardware Level,2005,非常好的书“Unabridged Pentium 4, The: IA32 Processor Genealogy”的章节。
  • Task management on x86提到“Protected Mode Software Architecture”一书和“Understanding the Linux Kernel, 3rd Ed.”, Bovet, Chapter 3 Processes, 3.3.2。任务状态段。
  • http://wiki.osdev.org/Task_State_Segment硬件任务切换
  • 关于assembly - CPU 寄存器和多任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38024730/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com