以下引用摘自“了解Linux内核第三版”一书:
当用户模式进程尝试通过以下方式访问I / O端口时: 输入或输出指令,CPU可能需要访问I / O权限 位图存储在TSS中,以验证是否允许该过程 地址端口。
更准确地说,当进程执行输入或输出I / O指令时 在用户模式下,控制单元执行以下操作:
它检查eflags寄存器中的2位IOPL字段。如果设置为3,则控制单元执行I / O指令。否则 执行下一个检查。
它访问tr寄存器以确定当前的TSS,从而确定正确的I / O权限位图。
它将检查与I / O指令中指定的I / O端口相对应的I / O权限位图的位。如果清除,则 指令执行;否则,控制单元会提出“一般 保护”例外。
以下引文也来自同一本书:
尽管Linux不使用硬件上下文切换,但是 尽管如此,仍然被迫为每个不同的CPU设置一个TSS 系统。
现在,如果Linux的所有进程都只有一个TSS结构(而不是每个进程都具有自己的TSS结构),并且我们知道每个进程都必须具有自己的I / O权限位图,这意味着当Linux调度执行到另一个进程,Linux会将CPU使用的唯一TSS结构中的I / O许可权位图的值更改为要执行的进程的I / O许可权位图的值(Linux可能将其存储在内核内存中的某个位置) )?
答案 0 :(得分:1)
是的。在本书的同一部分,它说:
tss_struct结构描述了TSS的格式。就像已经 第2章提到过,init_tss数组为每个CPU存储一个TSS 在系统上。在每个进程切换时,内核都会更新一些字段 TSS,以便相应的CPU的控制单元可以安全地 检索所需的信息。因此,TSS反映了 当前进程在CPU上的特权,但是不需要 在进程不运行时维护它们的TSS。
在内核的更高版本中,init_tss
到cpu_tss
到renamed。每个处理器的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。