以下引用自“理解Linux内核第三版”一书:
当用户模式进程试图通过
输入或输出指令,CPU可能需要访问I/O权限
存储在TSS中的位图,用于验证是否允许进程
地址端口。
更准确地说,当一个进程执行一条输入输出指令时
在用户模式下,控制单元执行以下操作:
它检查eflags寄存器中的2位iopl字段。如果设置为3,则控制单元执行输入/输出指令。否则,它
执行下一个检查。
它访问tr寄存器以确定当前tss,从而确定正确的i/o权限位图。
它检查与I/O指令中指定的I/O端口对应的I/O权限位图的位。如果它被清除,
指令被执行;否则,控制单元将
保护“例外。
以下引文也出自同一本书:
虽然linux不使用硬件上下文开关,但是
尽管如此,在
系统。
如果Linux对所有进程只有一个TSS结构(而不是每个进程都有自己的TSS结构),并且我们知道每个进程都必须有自己的I/O权限位图,这是否意味着当Linux将执行调度到另一个进程时,Linux会将CPU使用的唯一TSS结构中的I/O权限位图的值更改为要执行的进程的I/O权限位图的值(哪个Linux可能存储在内核内存中)?

最佳答案

对。在书的同一部分,它说:
tss结构描述tss的格式。像以前一样
如第2章所述,init-tss数组为每个cpu存储一个tss
在系统上。在每个进程开关处,内核更新一些字段
使相应CPU的控制单元可以安全地
检索它需要的信息。因此,tss反映了
CPU上当前进程的权限,但不需要
在进程不运行时维护它们的tss。
在后来的内核版本中,init_tssrenamedcpu_tss。每个处理器的tss结构在cpu_init中初始化,在引导系统时每个处理器执行一次。
switching从一个任务转到另一个任务时,将调用__switch_to_xtra,这将调用switch_to_bitmap,它只需将下一个任务的io位图复制到计划在其上运行下一个任务的处理器的tss结构中。
相关:How do Intel CPUs that use the ring bus topology decode and handle port I/O operations

09-17 00:20