fs gs 寄存器
FS 寄存器
在多数现代的x86_64 Linux系统中,FS
寄存器用于指向线程特定数据(Thread Local Storage, TLS)。每个线程都有其自己的TLS区域,用于存储线程内部变量等线程私有数据。这样,即使多个线程执行相同的代码,它们也能保持各自的状态信息,因为每个线程都通过FS
寄存器访问其自己的数据。这对于编写可重入代码和线程安全的应用程序非常重要。
GS 寄存器
在x86_64 Linux系统中,GS
寄存器的使用相对较少,但在某些情况下,它被用于类似的目的,比如访问特定于线程或CPU的数据结构。有的实现可能会用它来存储指向内核数据结构的指针,如内核的per-cpu变量等。
不过,具体到每个操作系统版本或特定的场景,FS
和GS
寄存器的确切用途可能有所不同。操作系统内核开发者可能会根据需要调整这些寄存器的用途以优化性能或实现特定的功能。
保留(callee-saved)寄存器:这类寄存器在函数调用过程中应该保持不变。如果一个被调用的函数(callee)想要修改这些寄存器,它必须在函数入口处保存原始值,并在返回前恢复这些值。这些寄存器包括
RBX
、RSP
、RBP
、R12
、R13
、R14
、R15
以及XMM8
-XMM15
(用于保存浮点数和 SIMD 状态)。易失(caller-saved)寄存器:这类寄存器在函数调用过程中可能会被更改,调用者不能期望它们的值在函数调用后保持不变。如果调用者需要保持这些寄存器的值,它必须在调用函数之前自行保存这些值。易失寄存器包括
RAX
、RCX
、RDX
、RSI
、RDI
、R8
-R11
、以及XMM0
-XMM7
。
xv6:Multithreading
进程加上楽锁之后就不会在多个 cpu 上运行
swtch
在 swtch.S 文件中,用于交换 context 里面的寄存器。将 cpu context 和 proc context 置换
sched
sched 将某一个进程从 cpu 上移出,换成 scheduler 进程
yield
调用 sched