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

Linux如何处理TSS结构中的I/O权限位图?,linux,io,linux-kernel,x86,Linux,Io,Linux Kernel,X86,以下引用自《理解Linux内核第三版》一书: 当用户模式进程试图通过 输入或输出指令,CPU可能需要访问I/O权限 存储在TSS中的位图,用于验证是否允许进程 地址是港口 更准确地说,当进程执行输入或输出I/O指令时 在用户模式下,控制单元执行以下操作: 它检查eflags寄存器中的2位IOPL字段。如果设置为3,则控制单元执行I/O指令。否则, 执行下一个检查 它访问tr寄存器以确定当前TSS,从而确定正确的I/O权限位图 它检查与I/O指令中指定的I/O端口对应的I/O权限位图位。如果已清除

以下引用自《理解Linux内核第三版》一书:

当用户模式进程试图通过 输入或输出指令,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可能将其存储在内核内存中的某个位置)

    是。书的同一部分写道:

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

    在内核的更高版本中,
    init\u-tss
    是要
    cpu\u-tss
    。每个处理器的TSS结构在中初始化,在引导系统时每个处理器执行一次

    当从一个任务切换到另一个任务时,会调用
    \u switch\u to_xtra
    ,调用只需将下一个任务的IO位图复制到计划在其上运行下一个任务的处理器的TSS结构中


    相关:。

    我很久没有看过Linux内核了(关于它的软件任务切换),但有一次它用于将下一个任务的IO位图(如果IO位图偏移量指示存在IO位图)物理复制到TSS中。如果下一个任务中没有IO位图(没有IO位图的默认情况下是拒绝所有端口访问),则不会复制任何内容,并且IO位图偏移量设置为指示没有位图的值。这都是软件上下文切换机制的一部分。每个进程都有自己的位图(或没有位图)PS:每个处理器有一个TSS。在多核系统上,每个正在使用的处理器都有一个TSS。当然,每个处理器可以运行多个进程。