Linux如何处理TSS结构中的I / O权限位图?

时间:2019-04-03 17:57:22

标签: linux io linux-kernel x86

以下引用摘自“了解Linux内核第三版”一书:

  

当用户模式进程尝试通过以下方式访问I / O端口时:   输入或输出指令,CPU可能需要访问I / O权限   位图存储在TSS中,以验证是否允许该过程   地址端口。

     

更准确地说,当进程执行输入或输出I / O指令时   在用户模式下,控制单元执行以下操作:

     
      
  1. 它检查eflags寄存器中的2位IOPL字段。如果设置为3,则控制单元执行I / O指令。否则   执行下一个检查。

  2.   
  3. 它访问tr寄存器以确定当前的TSS,从而确定正确的I / O权限位图。

  4.   
  5. 它将检查与I / O指令中指定的I / O端口相对应的I / O权限位图的位。如果清除,则   指令执行;否则,控制单元会提出“一般   保护”例外。

  6.   

以下引文也来自同一本书:

  

尽管Linux不使用硬件上下文切换,但是   尽管如此,仍然被迫为每个不同的CPU设置一个TSS   系统。

现在,如果Linux的所有进程都只有一个TSS结构(而不​​是每个进程都具有自己的TSS结构),并且我们知道每个进程都必须具有自己的I / O权限位图,这意味着当Linux调度执行到另一个进程,Linux会将CPU使用的唯一TSS结构中的I / O许可权位图的值更改为要执行的进程的I / O许可权位图的值(Linux可能将其存储在内核内存中的某个位置) )?

1 个答案:

答案 0 :(得分:1)

是的。在本书的同一部分,它说:

  

tss_struct结构描述了TSS的格式。就像已经   第2章提到过,init_tss数组为每个CPU存储一个TSS   在系统上。在每个进程切换时,内核都会更新一些字段   TSS,以便相应的CPU的控制单元可以安全地   检索所需的信息。因此,TSS反映了   当前进程在CPU上的特权,但是不需要   在进程不运行时维护它们的TSS。

在内核的更高版本中,init_tsscpu_tssrenamed。每个处理器的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