我是汇编语言的初学者,并试图理解这些都是如何工作的。我的问题可能看起来很愚蠢,但无论如何,我不太清楚。
考虑以下简单的程序:
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操作系统是如何处理的?我的意思是每个进程都有自己一致的寄存器值并且不受其他进程的影响?
当内核运行时,它会在某处(在内核内存中)保存当前任务的寄存器内容的备份(在许多处理器上,可能有一些机器指令或硬件机制来帮助实现这一点)。
当内核运行时调度程序 https://en.wikipedia.org/wiki/Scheduling_(computing)并且它选择运行某个任务,寄存器状态被恢复。请注意,Linux 有先发制人 https://en.wikipedia.org/wiki/Preemption_(computing)调度。阅读上下文切换 https://en.wikipedia.org/wiki/Context_switch and 中断 https://en.wikipedia.org/wiki/Interrupt and CPU模式 https://en.wikipedia.org/wiki/CPU_modes。多试几次cat /proc/interrupts
在终端中。看proc(5) http://man7.org/linux/man-pages/man5/proc.5.html了解更多关于/proc/
。阅读更多关于x86-64 https://en.wikipedia.org/wiki/X86-64.
当该任务要求(例如通过某些系统调用)运行时,内核首先备份寄存器内容。
Read 操作系统:三个简单的部分 http://pages.cs.wisc.edu/~remzi/OSTEP/(可免费下载的书)。
Each process https://en.wikipedia.org/wiki/Process_(computing)有,从用户空间 https://en.wikipedia.org/wiki/User_space代码,它的寄存器内容,它的文件描述符集,它的虚拟地址空间 https://en.wikipedia.org/wiki/Virtual_address_space等等...(内核,包括它的调度程序,正在管理所有这些)。对于多线程进程,每个thread https://en.wikipedia.org/wiki/Thread_(computing)有其寄存器内容(但它们共享
某些状态 - 特别是虚拟地址空间、文件描述符等... - 与同一进程中的其他线程)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)