了解cpu寄存器

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如何处理它?我的意思是每个进程都有自己一致的寄存器值,而不受其他进程的影响?

Bas*_*tch 5

当内核运行时,它会在某处(在内核内存中)保留当前任务的寄存器内容的备份(在许多处理器上,可能有一些机器指令或硬件机制来帮助它).

当内核运行调度程序并选择运行某个任务时,将恢复该寄存器状态.请注意,Linux具有抢占式调度.阅读有关上下文切换中断以及CPU模式的信息.cat /proc/interrupts在终端尝试几次.有关更多信息,请参阅proc(5)/proc/.阅读有关x86-64的更多信息.

当该任务要求(例如通过一些系统调用)运行时,内核通过备份寄存器内容开始.

阅读操作系统:三个简单的部分(可免费下载的书).

用户空间代码的角度来看,每个进程都有其寄存器内容,文件描述符集,虚拟地址空间等......(内核,包括其调度程序,正在管理所有这些).对于多线程进程,每个线程都有其寄存器内容(但它们共享一些状态 - 特别是虚拟地址空间,文件描述符等...... - 与同一进程中的其他线程).

  • 不,没有办法.您需要阅读*操作系统:三个简单的部分*书.是的,它是操作系统和处理器特定的.是的,上下文切换是一项繁重的操作,但处理器运行速度足够快,可以在几微秒内完成,并且在最近的笔记本电脑或台式机上每秒发生数百次. (4认同)