内核如何防止用户程序访问内核数据?内核如何读取用户态数据?
以X86处理器为例,用户的数据和内核的数据在不同的数据段中,用户的代码和内核的代码在不同的段中。每个段的描述信息存储在段描述符表中,描述信息中包含了该段的访问权限。段的选择信息存入相应的CPU寄存器中,例如,CS寄存器存放代码段的选择符,DS存储数据段的选择符,由段的选择符在段描述符表中找到段的描述信息。CS寄存器中还存有当前的访问权,当控制器发现CS中的当前访问权低于数据段的访问权时,触发异常。
用户态的当前访问权低于内核数据段的权限,当用户访问内核数据时触发异常。内核可以访问用户段的数据,也可以将数据从内核态拷贝到用户态的数据段。内核态的当前访问权限高于用户数据段的访问权。内核可以使用串指令将数据从内核数据段拷贝到用户数据段,或反方向。在拷贝之前,要设置好DS和ES两个寄存器的值,具体的用法参考处理器文档。String Instructions—String instructions reference two memory operands. By default, they reference both the DS and ES segments (DS:rSI and ES:rDI). These instructions can override their DS-segment reference, as shown in Table 1-5, but they cannot override their ES-segment reference.