我是汇编语言的初学者,并试图了解这些是如何工作的。我的问题可能看起来很愚蠢,但无论如何,对我来说并不是很清楚。
考虑以下简单程序:
section .text
global _start
_start:
mov eax, [text]
mov [val], eax
mov ecx, val
mov eax, 4
mov edx, 7
mov ebx, 1
int 0x80
mov eax, 1
int 0x80
segment .bss
val resb 2
segment .data
text db "Th"
len equ $- text
这里我们更新寄存器中的值并使用系统调用将其打印出来。但是我想知道如果OS
(我使用的是Ubuntu 16.04)在同一个核心上安排一些进程会怎么样。这意味着该进程以自己的方式更新CPU寄存器。 OS linux如何处理它?我的意思是每个进程都有自己一致的寄存器值,而不受其他进程的影响?
答案 0 :(得分:5)
当内核运行时,它会在某处(在内核内存中)保留当前任务的寄存器内容的备份(在许多处理器上,可能有一些机器指令或硬件机制来帮助它)。
当内核运行scheduler并且它选择运行某个任务时,将恢复该寄存器状态。请注意,Linux有preemptive个调度。阅读context switching和interrupts以及CPU modes。在终端中尝试多次cat /proc/interrupts
。有关/proc/
的详情,请参阅proc(5)。详细了解x86-64。
当该任务要求(例如通过一些系统调用)运行时,内核首先备份寄存器内容。
阅读Operating Systems : Three Easy Pieces(可免费下载的书籍)。
从process代码的角度来看,每个user-space都有它的寄存器内容,它的文件描述符集,它的virtual address space等......(和内核,包括它的调度程序,正在管理所有这些)。对于多线程进程,每个thread都有其注册内容(但它们共享 一些状态 - 特别是虚拟地址空间,文件描述符等... - 与同一进程中的其他线程一起使用。)
答案 1 :(得分:3)
在同一内核上的进程之间切换时,操作系统会保存先前进程的寄存器。这称为上下文切换(您可以搜索更多详细信息)。然后,OS恢复下一个进程的寄存器。