代码之家  ›  专栏  ›  技术社区  ›  St.Antario

了解cpu寄存器

  •  2
  • St.Antario  · 技术社区  · 7 年前

    考虑以下简单程序:

    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寄存器。操作系统linux是如何处理的?我的意思是每个进程都有自己的一致寄存器值,并且不受其他进程的影响?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Basile Starynkevitch    7 年前

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

    当内核运行 scheduler 它选择运行一些任务,寄存器状态被恢复。注意,Linux具有 preemptive 行程安排。了解 context switching interrupts CPU modes cat /proc/interrupts 在终端中。看见 proc(5) /proc/ . 了解更多信息 x86-64

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

    阅读 Operating Systems : Three Easy Pieces (可免费下载的书)。

    每个 process user-space 代码、其寄存器内容、其文件描述符集、其 virtual address space 等(内核,包括其调度程序,正在管理所有这些)。对于多线程进程,每个 thread 有其注册内容(但他们共享 一些状态-尤其是虚拟地址空间、文件描述符等…-与同一进程中的其他线程)。

        2
  •  3
  •   Serge Rogatch    7 年前

    在同一个内核上的进程之间切换时,操作系统保存上一个进程的寄存器。这称为上下文切换(您可以搜索更多详细信息)。然后,操作系统恢复下一个进程的寄存器。