2.2.3 切换时修改段选择子的方案
在x86平台下,核心态和用户态的区分主要是通过段选择子来确定的。具体的来说,在Linux环境下,核心态的代码段选择子0x10,数据段选择子为0x18;而用户态的代码段选择子为0x23,数据段选择子0x2B。如果试图使用户程序工作在核心模式,即Ring 0,一个简单的实现方案就是将用户程序的代码段和数据段选择子修改为核心态的代码段和数据段选择子。但在用户态下直接改变选择子显然是不允许的。由于模块在内核模式运行,故本方案采用动态加载模块的方式来修改选择子。
由于用户程序在系统调用过程中是在核心模式运行的,而在系统调用结束时由于选择子的重新恢复而转换回用户态继续运行,故本方案采取的方法是在系统调用中修改核心栈中保存的选择子寄存器值,使其在寄存器恢复时采用修改后的核心态的值,这样进程就得以停留在内核模式运行。
2.3 现实意义
方案的顺利实施,将使不同环境不同状况的用户进程得以在内核模式运行,对于在程序执行性能上有特殊需要的进程,如能在内核模式运行,将大幅度的提高程序运行效率。通过比较分析各种方案的原理和优缺点,可以找出各自的应用范围,为程序的编写和运行提供帮助,而一些能够实用的程序将能使符合条件的进程在适当的时候在内核运行以提高运行性能,这对于嵌入式服务器等环境非常重要。故对于用户进程在核心模式下运行方案的分析研究对于网络服务器等应用领域具有十分显著的应用前景,对于进一步提升Linux系统下进程的执行性能具有非常重要的意义。
文章来源于领测软件测试网 https://www.ltesting.net/