St.*_*rio 2 linux cpu assembly cpu-registers
我是汇编语言的初学者,试图理解这些都是如何工作的.我的问题可能看起来很愚蠢,但无论如何,这对我来说并不十分清楚.
考虑以下简单程序:
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
Run Code Online (Sandbox Code Playgroud)
在这里,我们更新寄存器中的值并使用系统调用将其打印出来.但我想知道如果OS(我正在使用Ubuntu 16.04)在同一个核心上安排一些进程.这意味着该进程以自己的方式更新CPU寄存器.OS linux如何处理它?我的意思是每个进程都有自己一致的寄存器值,而不受其他进程的影响?
当内核运行时,它会在某处(在内核内存中)保留当前任务的寄存器内容的备份(在许多处理器上,可能有一些机器指令或硬件机制来帮助它).
当内核运行调度程序并选择运行某个任务时,将恢复该寄存器状态.请注意,Linux具有抢占式调度.阅读有关上下文切换和中断以及CPU模式的信息.cat /proc/interrupts在终端尝试几次.有关更多信息,请参阅proc(5)/proc/.阅读有关x86-64的更多信息.
当该任务要求(例如通过一些系统调用)运行时,内核通过备份寄存器内容开始.
阅读操作系统:三个简单的部分(可免费下载的书).
从用户空间代码的角度来看,每个进程都有其寄存器内容,文件描述符集,虚拟地址空间等......(内核,包括其调度程序,正在管理所有这些).对于多线程进程,每个线程都有其寄存器内容(但它们共享一些状态 - 特别是虚拟地址空间,文件描述符等...... - 与同一进程中的其他线程).