了解cpu寄存器

时间:2017-08-29 10:46:45

标签: linux assembly cpu 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

这里我们更新寄存器中的值并使用系统调用将其打印出来。但是我想知道如果OS(我使用的是Ubuntu 16.04)在同一个核心上安排一些进程会怎么样。这意味着该进程以自己的方式更新CPU寄存器。 OS linux如何处理它?我的意思是每个进程都有自己一致的寄存器值,而不受其他进程的影响?

2 个答案:

答案 0 :(得分:5)

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

当内核运行scheduler并且它选择运行某个任务时,将恢复该寄存器状态。请注意,Linux有preemptive个调度。阅读context switchinginterrupts以及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恢复下一个进程的寄存器。