Linux2.6对新型CPU的支持

文章分析了在 Linux 2.6 中引入的对 Intel CPU 快速系统调用指令 SYSENTER/SYSEXIT 支持的实现。Linux 驱动及内核开发者通过了解快速系统调用指令的机制,可以在自己的代码中通过利用这一机制,提高系统性能,并避开由快速系统调用方式带来的一些局限(如系统调用中嵌套系统调用)。  

前言

在 Linux 2.4 内核中,用户态 Ring3 代码请求内核态 Ring0 代码完成某些功能是通过系统调用完成的,而系统调用的是通过软中断指令(int 0x80)实现的。在 x86 保护模式中,处理 INT 中断指令时,CPU 首先从中断描述表 IDT 取出对应的门描述符,判断门描述符的种类,然后检查门描述符的级别 DPL 和 INT 指令调用者的级别 CPL,当 CPL<=DPL 也就是说 INT 调用者级别高于描述符指定级别时,才能成功调用,最后再根据描述符的内容,进行压栈、跳转、权限级别提升。内核代码执行完毕之后,调用 IRET 指令返回,IRET 指令恢复用户栈,并跳转会低级别的代码。

其实,在发生系统调用,由 Ring3 进入 Ring0 的这个过程浪费了不少的 CPU 周期,例如,系统调用必然需要由 Ring3 进入 Ring0(由内核调用 INT 指令的方式除外,这多半属于 Hacker 的内核模块所为),权限提升之前和之后的级别是固定的,CPL 肯定是 3,而 INT 80 的 DPL 肯定也是 3,这样 CPU 检查门描述符的 DPL 和调用者的 CPL 就是完全没必要。正是由于如此,Intel x86 CPU 从 PII 300(Family 6,Model 3,Stepping 3)之后,开始支持新的系统调用指令 sysenter/sysexit。sysenter 指令用于由 Ring3 进入 Ring0,SYSEXIT 指令用于由 Ring0 返回 Ring3。由于没有特权级别检查的处理,也没有压栈的操作,所以执行速度比 INT n/IRET 快了不少。

不同系统调用方式的性能比较:

下面是一些来自互联网的有关sysenter/sysexit 指令和 INT n/IRET 指令在 Intel Pentium CPU 上的性能对比:

1:系统调用性能测试测试硬件:

Intel? Pentium? III CPU, 450 MHz Processor Family: 6 Model: 7 Stepping: 2

用户模式花费的时间 核心模式花费的时间

基于 sysenter/sysexit 指令的系统调用 9.833 microseconds 6.833 microseconds

基于中断 INT n 指令的系统调用     17.500 microseconds 7.000 microseconds

2:各种 CPU 上 INT 0x80 和 SYSENTER 执行速度的比较

CPU           Int0x80 sysenter

Athlon XP 1600+     277   169

800MHz mode 1 athlon  279   170

2.8GHz p4 northwood ht 1152  442

上述数据为对 100000 次 getppid() 系统调用所花费的 CPU 时钟周期取的平均值

自这种技术推出之后,人们一直在考虑在 Linux 中加入对这种指令的支持,在 Kernel.org 的邮件列表中,主题为 "Intel P6 vs P7 system call performance" 的大量邮件讨论了采用这种指令的必要性,邮件中列举的理由主要是 Intel 在 Pentium 4 的设计上存在问题,造成 Pentium 4 使用中断方式执行的系统调用比 Pentium 3 以及 AMD Athlon 所耗费的 CPU 时钟周期多上 5~10 倍。因此,在 Pentium 4 平台上,通过 sysenter/sysexit 指令来执行系统调用已经是刻不容缓的需求。

时间: 2024-10-31 22:39:41

Linux2.6对新型CPU的支持的相关文章

Linux2.6对新型CPU的支持(2)

由用户态经库函数进入内核态 为了配合内核使用新的系统调用方式,glibc中要做一定的修改.新的glibc-2.3.2(及其以后版本中)中已经包含了这个改动,在glibc源代码的sysdeps/unix/sysv/linux/i386/sysdep.h文件中,处理系统调用的宏INTERNAL_SYSCALL在不同的编译选项下有不同的结果.在打开支持sysenter/sysexit指令的选项I386_USE_SYSENTER下,系统调用会有两种方式,在静态链接(编译时加上-static选项)情况下,

Centos系统查看cpu是否支持64位例子

  下面看一个简单的Centos系统查看cpu是否支持64位例子,希望这个例子可以帮助到大家. 查看cpuinfo中是否有lm,如果有lm表示支持64位,lm的意思是long mode,具体命令如下: cat /proc/cpuinfo | grep flags 检查输出里面是否有 lm 字符 或 cat /proc/cpuinfo | grep flags | grep lm | wc -l 输出结果大于 0 表示支持64位 cat 语法结构; de>cat [选项] [文件]...de>

CentOS7 编译redis报错:您选择的 CPU 不支持 x86-64 指令集

问题描述 CentOS7 编译redis报错:您选择的 CPU 不支持 x86-64 指令集 Oracle VM VirtualBox 下 CentOS7 编译redis报错,adlist.c:1:0: 错误:您选择的 CPU 不支持 x86-64 指令集 CentOS版本如下 Last login: Wed Jan 27 11:32:21 2016 from 172.31.30.139 [root@localhost ~]# uname -a Linux localhost.localdoma

总结Linux和Windows服务器查看CPU是否支持虚拟化的方法

当我们要在一台已经安装了操作系统的服务器上部署虚拟化环境,为了确保后面虚拟化安装部署的成功,如何确认当前服务器的CPU是否支持虚拟化呢? 针对Linux和Windows,下面各自介绍一个查看的方法: 1. Windows平台: 搜索下载小工具:securable 用户需要查看的也就是截图中的Hardware Virtualization选项.前面3种情况很简单: NO:CPU不支持 Yes:CPU支持,赶快去将BIOS里的VT开关设为Enabled吧 Locked ON:CPU支持,且BIOS已

《Android深度探索(卷1):HAL与驱动开发》虚拟实验环境(Ubuntu Linux)及源代码免费下载,不需要CPU虚拟化支持

由于有些同学安装随书光盘虚拟环境时发现CPU不支持虚拟化,所以我特意做了个不需要虚拟化的虚拟环境,使用Virtual Box,Ubuntu Linux10.04 LTS(4G左右) 有需要的可以下载使用.该虚拟环境包含了书中所需的实验环境(除了Android源代码,太大,需要自己下,否则得接近20G了). 其他的使用说明详见虚拟环境桌面的readme.txt   用户名:root 秘密:12345678   virtual box请到oracle官方网站下载最新版本,本虚拟环境使用的是Virtu

【虚拟机】如何判断CPU是否支持硬件虚拟化

如何判断CPU是否支持硬件虚拟化 linux系统 输入   cat  /proc/cpuinfo | grep vmx --color  有结果显示,表明支持intel-vt 虚拟化 输入   cat  /proc/cpuinfo | grep svm --color  有结果显示,表明支持amd-vt 虚拟化 1  windows10查看     cmd中执行systeminfo在最后看到:   win系统 需要securable软件才能查看 使用securable来检测检测CPU是否支持虚拟

如何查看电脑cpu是否支持64位系统

今天同事想安装64位win7,不知道自己电脑是否支持64位系统 ,我们自己看可能不容易直接看出来,下面有两种方法做简单的判断和验证. 1.简单的判断方法是,如果你确信自己是双核或双核以上的cpu,基本上初步可以判断是可以支持64位 的; 如果你不知道,你可以右键"我的电脑""属性""设备管理器",看一下"处理器"标签下有几个,如果有两个就是双核,多个就是多核,如4核,8核,只要是双核和双核以上的都支持64位操作系统. 2.用工

新CPU只支持Win10 微软为市场份额不择手段?

日前,微软发布的针对Windows 10的新政在业内引发了激烈的讨论. 微软宣布,以后新的CPU(英特尔Kaby lake,AMDBristol Ridge和高通骁龙820)只会支持 Windows 10,不再支持老的系统.此外,不但新的CPU成了Windows 10专属,连现在的英特尔Skylake也在此新政范围中.也许业内对于微软Windows 10的新政感到迷惑,其实简单理解,以PC为例,就是微软Wndows 10在目前采用英特尔最新芯片的PC上才能得到最佳的体验和服务支持. -- 当然我

强迫用户升Win10?旧版Windows放弃对新CPU更新支持

使用最新CPU的用户在升级旧版Windows时会收到兼容性提示  北京时间4月14日消息我们早就已经知道微软不准备为英特尔7代CPU也就是Kaby Lake和AMDRyzen系统提供Windows 7和Windows 8.1系统更新服务不过我们不知道何时开始生效.现在答案出来了本月开始.如果用户使用的是新处理器安装老版Windows时微软会警告用户禁止更新.到底是什么意思就是说在新处理器上系统无法获得安全更新服务. 去年1月微软公布了新政策随后又对政策做了调整Kaby Lake.Ryzen以及之