实时搜索: numa 哪些

numa 哪些

473条评论 1214人喜欢 1187次阅读 508人点赞
80386到现在的cpU增加了哪些知识点,除了超线程,超标量,sse指令,还有哪些 , 会经过【神奈川】吗? ...

Linux上MySQL优化提升性能 哪些可以优化的关闭NUMA特性:  一、CPU
  首先从CPU说起。
  你仔细检查的话,有些服务器上会有的一个有趣的现象:你cat /proc/cpuinfo时,会发现CPU的频率竟然跟它标称的频率不一样:
  #cat /proc/cpuinfo
  processor : 5
  model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
  cpu MHz : 1200.000
  这个是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我们发现第5颗CPU的频率为1.2G。
  这是什么原因呢?
  这些其实都源于CPU最新的技术:节能模式。操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。这对环保人士和抵制地球变暖来说是一个福音,但是对MySQL来说,可能是一个灾难。
  为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好,更彻底。由于各种BIOS类型的区别,设置为CPU为最大性能模式千差万别,我们这里就不具体展示怎么设置了。
  然后我们看看内存方面,我们有哪些可以优化的。
  i) 我们先看看numa
  非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 也是最新的内存管理技术。它和对称多处理器结构 (SMP : Symmetric Multi-Processor) 是对应的。简单的队别如下:
  如图所示,详细的NUMA信息我们这里不介绍了。但是我们可以直观的看到:SMP访问内存的都是代价都是一样的;但是在NUMA架构下,本地内存的访问和非 本地内存的访问代价是不一样的。对应的根据这个特性,操作系统上,我们可以设置进程的内存分配方式。目前支持的方式包括:
  --interleave=nodes
  --membind=nodes
  --cpunodebind=nodes
  --physcpubind=cpus
  --localalloc
  --preferred=node
  简而言之,就是说,你可以指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非 是设置为--interleave=nodes轮询分配方式,即内存可以在任意NUMA节点上分配这种方式以外。其他的方式就算其他NUMA节点上还有内 存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来获得内存。有经验的系统管理员或者DBA都知道SWAP导致的数据库性能 下降有多么坑爹。
  所以最简单的方法,还是关闭掉这个特性。
  关闭特性的方法,分别有:可以从BIOS,操作系统,启动进程时临时关闭这个特性。
  a) 由于各种BIOS类型的区别,如何关闭NUMA千差万别,我们这里就不具体展示怎么设置了。
  b) 在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:
  kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM numa=off
  另外可以设置 vm.zone_reclaim_mode=0尽量回收内存。
  c) 启动MySQL的时候,关闭NUMA特性:
  numactl --interleave=all mysqld
  当然,最好的方式是在BIOS中关闭。
  ii) 我们再看看vm.swappiness。
  vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。
  具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive 内存交换出去,还是释放数据的cache。cache中缓存着从磁盘读出来的数据,根据程序的局部性原理,这些数据有可能在接下来又要被读 取;inactive 内存顾名思义,就是那些被应用程序映射着,但是 长时间 不用的内存。
  我们可以利用vmstat看到inactive的内存的数量:
  #vmstat -an 1
  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
  r b swpd free inact active si so bi bo in cs us sy id wa st
  1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0
  0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0
  0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0
  0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0
  通过/proc/meminfo 你可以看到更详细的信息:
  #cat /proc/meminfo | grep -i inact
  Inactive: 326972 kB
  Inactive(anon): 248 kB
  Inactive(file): 326724 kB
  这里我们对不活跃inactive内存进一步深入讨论。 Linux中,内存可能处于三种状态:free,active和inactive。众所周知,Linux Kernel在内部维护了很多LRU列表用来管理内存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用来管理匿名页,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用来管理page caches页缓存。系统内核会根据内存页的访问情况,不定时的将活跃active内存被移到inactive列表中,这些inactive的内存可以被 交换到swap中去。
  一般来说,MySQL,特别是InnoDB管理内存缓存,它占用的内存比较多,不经常访问的内存也会不少,这些内存如果被Linux错误的交换出去了,将 浪费很多CPU和IO资源。 InnoDB自己管理缓存,cache的文件数据来说占用了内存,对InnoDB几乎没有任何好处。
  所以,我们在MySQL的服务器上最好设置vm.swappiness=0。
  我们可以通过在sysctl.conf中添加一行:
  echo vm.swappiness = 0 /etc/sysctl.conf
  并使用sysctl -p来使得该参数生效。
  三、文件系统
  最后,我们看一下文件系统的优化
  i) 我们建议在文件系统的mount参数上加上noatime,nobarrier两个选项。
  用noatime mount的话,文件系统在程序访问对应的文件或者文件夹时,不会更新对应的access time。一般来说,Linux会给文件记录了三个时间,change time, modify time和access time。
  我们可以通过stat来查看文件的三个时间:
  stat libnids-1.16.tar.gz
  File: `libnids-1.16.tar.gz'
  Size: 72309 Blocks: 152 IO Block: 4096 regular file
  Device: 302h/770d Inode: 4113144 Links: 1
  Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
  Access : 2008-05-27 15:13:03.000000000 +0800
  Modify: 2004-03-10 12:25:09.000000000 +0800
  Change: 2008-05-27 14:18:18.000000000 +0800
  其中access time指文件最后一次被读取的时间,modify time指的是文件的文本内容最后发生变化的时间,change time指的是文件的inode最后发生变化(比如位置、用户属性、组属性等)的时间。一般来说,文件都是读多写少,而且我们也很少关心某一个文件最近什 么时间被访问了。
  所以,我们建议采用noatime选项,这样文件系统不记录access time,避免浪费资源。
  现在的很多文件系统会在数据提交时强制底层设备刷新cache,避免数据丢失,称之为write barriers。但是,其实我们数据库服务器底层存储设备要么采用RAID卡,RAID卡本身的电池可以掉电保护;要么采用Flash卡,它也有自我保 护机制,保证数据不会丢失。所以我们可以安全的使用nobarrier挂载文件系统。设置方法如下:
  对于ext3, ext4和 reiserfs文件系统可以在mount时指定barrier=0;对于xfs可以指定nobarrier选项。
  ii) 文件系统上还有一个提高IO的优化万能钥匙,那就是deadline。
  在 Flash技术之前,我们都是使用机械磁盘存储数据的,机械磁盘的寻道时间是影响它速度的最重要因素,直接导致它的每秒可做的IO(IOPS)非常有限, 为了尽量排序和合并多个请求,以达到一次寻道能够满足多次IO请求的目的,Linux文件系统设计了多种IO调度策略,已适用各种场景和存储设备。
  Linux的IO调度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP。每种调度策略的详细调度方式我们这里不详细描述,这里我们主要介绍CFQ和Deadline,CFQ是Linux内 核2.6.18之后的默认调度策略,它声称对每一个 IO 请求都是公平的,这种调度策略对大部分应用都是适用的。但是如果数据库有两个请求,一个请求3次IO,一个请求10000次IO,由于绝对公平,3次IO 的这个请求都需要跟其他10000个IO请求竞争,可能要等待上千个IO完成才能返回,导致它的响应时间非常慢。并且如果在处理的过程中,又有很多IO请 求陆续发送过来,部分IO请求甚至可能一直无法得到调度被 饿死 。而deadline兼顾到一个请求不会在队列中等待太久导致饿死,对数据库这种应用来 说更加适用。
  实时设置,我们可以通过
  echo deadline /sys/block/sda/queue/scheduler
  来将sda的调度策略设置为deadline。
  我们也可以直接在/etc/grub.conf的kernel行最后添加elevator=deadline来永久生效。
  CPU方面:
  关闭电源保护模式
  内存:
  vm.swappiness = 0
  关闭numa
  文件系统:
  用noatime,nobarrier挂载系统
  IO调度策略修改为deadline。

中国的操作系统有哪些: 银河麒麟操作系统由863软件重大专项资助,简称KYLIN操作系统。KYLIN操作系统是参照UNIX操作系统国际主流标准,针对服务器需求,设计并开发的具有自主版权的中文服务器操作系统。它支持多种微处理器和多种计算机体系结构的,具有高性能、高可用性与高安全性,并与Linux应用二进制兼容。

《KYLIN操作系统1.0版》是KYLIN操作系统的首个发布版本, 支持X86和IA-64处理器; 支持SMP和ccNUMA体系结构;符合LSB标准,支持 Linux应用二进制兼容; 实现了从应用到核心的多层次、多策略的安全机制;支持大型数据库应用,支持http、email、中间件服务;提供面向高性能计算的集群支撑环境;提供中文化的图形安装和管理界面。

KYLIN操作系统采用层次式结构, 由类Mach的基本内核层、 类BSD的系统服务层、 类Windows桌面环境紧耦 合构成。基本内核层由基本任务管理、基本存储、中断管理、设备管理、平台设备支撑环境以及处理器支撑等模 块构成;系统服务层由 POSIX、LSB、网络服务等接口以及安全、中文、IPC、高可用、高级存储管理和高级任务管理 等模块组成;类Windows桌面环境由桌面环境、集群环境以及包括目录服务器、web服务器、J2EE应用服务器等服 务器的基础服务环境组成。

支持SMP、ccNUMA等体系结构,支持X86、IA-64结构的处理器,支持主流的IDE、SCSI以及磁盘阵列, 支持100M、1000M网络设备,支持主流的USB、显卡、声卡、光驱等设备。

麒麟操作系统基于linux内核,采用gonme图形系统.并做了专门的系统内核优化,结构优化,是系统达到了稳定,安全,可靠,速度快,的目标,她功能强大,运行安全可靠,支持软件众多,采用staroffice办公系统,实现了微软office的无缝连接.她的浏览器功能强劲.邮件收发器稳定可靠,速度快.聊天工具一应俱全.娱乐工具应有尽有.总之是办公,音乐,电影,上网,邮件.聊天,游戏一样不缺.我使用了快2个月了,目前没出现过任何的错误提示,或者死机的情况.我们自此多了一个选择,自此不再受windows病毒的侵袭.自此可以更加方便的学习linux,为我们的生活工作多加一个筹码了.大家可以到网络里下载,完全免费的.

1 深度Linux(Deepin)
2红旗Linux(RedflagLinux);
3.中标麒麟(NeoKylin);(银河麒麟与中标麒麟已在2010年12月16日宣布合并)
5.起点操作系统(StartOS 原雨林木风OS);
6.凝思磐石安全操作系统;
7.共创Linux;
8.思普操作系统;
9.睿欧 (Raspberrypi Idev Os);

JAVA有哪些适合进行数值计算,数据分析/机器学习的库: JAVA有如下适合进行数值计算,数据分析/机器学习的库:
1 Apache Commons

2 Java Numerics: Main

JS实现数组排序的方法有哪些:

从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口

function fastSort(array,head,tail){
    //考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置
    /*生成随机项*/
    var randomnum = Math.floor(ranDom(head,tail));
    var random = array[randomnum];
    /*将小于random的项放置在其左边  策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/
    var arrayTemp = [];
    var unshiftHead = 0;
    for(var i = head;i <= tail;i++){
      if(array[i]<random){
        arrayTemp.unshift(array[i]);
        unshiftHead++;
      }else if(array[i]>random){
        arrayTemp.push(array[i]);
      }
      /*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/
      if(array[i]===random){
        arrayTemp.splice(unshiftHead,0,array[i]);
      }
    }
    /*将对应项覆盖原来的记录*/
    for(var j = head , u=0;j <= tail;j++,u++){
      array.splice(j,1,arrayTemp[u]);
    }
    /*寻找中间项所在的index*/
    var nowIndex = array.indexOf(random);

    /*设置出口,当要放进去的片段只有2项的时候就可以收工了*/
    if(arrayTemp.length <= 2){
      return;
    }
    /*递归,同时应用其左右两个区域*/
    fastSort(array,head,nowIndex);
    fastSort(array,nowIndex+1,tail);
  }

JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

sort() 方法用于对数组的元素进行排序。语法如下:

arrayObject.sort(sortby)

例如:
function NumAscSort(a,b)
{
 return a - b;
}
function NumDescSort(a,b)
{
 return b - a;
}
var arr = new Array( 3600, 5010, 10100, 801); 
arr.sort(NumDescSort);
alert(arr);
arr.sort(NumAscSort);
alert(arr);

市面上哪些cpu支持numa: 不可收拾融偈获益匪浅宰藏

手机主板上的芯片和原件,哪些是CPU、字库、电源IC、WiFi模块?:

编号A:是CPU,高通(Qualcomm)生产,型号为msm7227。

编号B:是Flash闪存芯片或者RAM芯片,海力士(Hynix)生产,型号不清楚。

编号C:是cmos芯片,管摄像头的。

编号D:是天线收发器高通 rtr6285。

编号E:应该是基带芯片,也是高通的芯片。

编号F:是skywork的sky77336 gsm功率放大芯片。

编号G:是avago是a5201 功率放大芯片。

编号I:博通的bcm2124 gprs基带芯片。

编号K:是两块触片。

编号J:三大键的触键电容。

编号H:是电流检测。

80386到现在的cpU增加了哪些知识点: 先先说8086

 在8086的EU--执行单元(Execution Unit)和BIU--总线接口单元(Bus Interface Unit)两部分中包含有一些工作寄存器,这些寄存器用来存放计算过程中的各种信息,如操作数地址、操作数及运算的中间结果等。微处理器从寄存器中存取数据比从存储器中存取数据要快的多,因此,在计算过程中,合理利用寄存器保存操作数、中间结果或其它信息,能提高程序的运行效率。根据这些寄存器所起的作用,8086寄存器组可以分为通用寄存器、专用寄存器和段寄存器三类
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  1. 通用寄存器
  通用寄存器包括了8个16位的寄存器:AX、BX、CX、DX、SP、BP、DI及SI。其中AX、BX、CX、DX在一般情况下作为通用的数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。它们还可分为两个独立的8位寄存器使用,命名为AL、AH、BL、BH、CL、CH、DL和DH。这4个通用数据寄存器除通用功能外,还有如下专门用途:

  AX作为累加器用,所以它是算术运算的主要寄存器。在乘除指令中指定用来存放操作数。另外,所有的I/O指令都使用AX或AL与外部设备传送信息。

  BX在计算存储器地址时,可作为基址寄存器使用。

  CX常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器。
DX在作双字长运算时,可把DX和AX组合在一起存放一个双字长数,DX用来存放高16位数据。此外,对某些I/O操作,DX可用来存放I/O的端口地址。

  SP、BP、SI、DI四个16位寄存器可以象数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。此外,它们更经常的用途是在存储器寻址时,提供偏移地址。因此,它们可称为指针或变址寄存器。

  SP称为堆栈指针寄存器,用来指出栈顶的偏移地址。

  BP称为基址指针寄存器,在寻址时作为基地址寄存器使用,但它必须与堆栈段寄存器SS联用来确定堆栈段中的存储单元地址。

  SI为源变址寄存器,在串处理指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中的存储单元地址,并有自动增量和自动减量的变址功能。

  DI为目的变址寄存器,在串处理指令中,DI和附加段寄存器ES联用,以达到在附加段中寻址的目的,然后DI自动增量或减量。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
8086的专用寄存器包括IP、SP和FLAGS三个16位寄存器。

  IP为指令指针寄存器,它用来存放将要执行的下一条指令地址的偏移量,它与段寄存器CS联合形成代码段中指令的物理地址。在计算机中,控制程序的执行流程就是通过控制IP的值来实现的。

  SP为堆栈指针寄存器,它与堆栈段寄存器联用来确定堆栈段中栈顶的地址,也就是说SP用来存放栈顶的偏移地址。

  FLAGS为标志寄存器,这是一个存放条件码标志、控制标志的16位寄存器。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
8086的标志寄存器
条件码标志用来记录程序中运行结果的状态信息,它们是根据有关指令的运行结果由(CPU)自动设置的。由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以称为条件码。
  ① 进位标志 CF,记录运算时最高有效位产生的进位值。
  ② 符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。
  ③ 零标志  ZF,运算结果为0时ZF位置1,否则置0。
  ④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。
  ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。
  ⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。

  控制标志位有3位:
  ① 方向标志 DF,在串处理指令中控制处理信息的方向。当DF=1时,串处理从高地址向低地址方向处理。当DF=0时,串处理就从低地址向高地址方向处理。
  ② 陷阱标志 TF,用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。
  ③ 中断标志 IF,用于控制可屏蔽硬件中断。当IF=1时,允许8086微处理器响应中断请求,否则关闭中断。

  8086提供了设置某些状态信息的指令。必要时,程序员可使用这些指令来建立状态信息。
调试程序Debug中提供了测试标志位的手段,它用符号表示某些标志位的值
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  3. 段寄存器

  8086微处理器共有4个16位的段寄存器,在寻址内存单元时,用它们直接或间接地存放段地址。
  代码段寄存器CS:存放当前执行的程序的段地址。
  数据段寄存器DS:存放当前执行的程序所用操作数的段地址。
  堆栈段寄存器SS:存放当前执行的程序所用堆栈的段地址。
  附加段寄存器ES:存放当前执行程序中一个辅助数据段的段地址。

注:
执行单元(Execution Unit):负责指令的执行,实际是既有控制器的功能,也有运算器的功能。包括:ALU、标志寄存器、暂存器、寄存器组、控制单元 。EU和BIU是组成8086微处理器的两个基本功能部件,他们相互配合完成指令操作。当EU从指令队列中去走指令后,指令队列出现空字节,BIU就立即自动地从内存中取出后续的指令放入队列;当EU执行指令需要操作数时,BIU就根据EU给出的操作数有效地址,从指定的内存单元或I/O端口取出数据供EU使用;当EU运算结束后,BIU将运算结果写入指定的内存单元或I/O端口。EU和BIU这两个功能部件又是相互独立的。大多数情况下,EU的执行指令操作与BIU的取指令操作在实践上可重叠进行,既EU进行某条指令执行操作时,BIU可同时进行后继指令的取指令操作,这两个部件并行连续工作可形成指令处理流水线。这样,可减少CPU取指令的等待时间,加快了CPU的指令执行速度,也提高了系统总线的利用率。)

写这篇文章,完全是因为学习保护模式需要这些知识,读者完全可以走马观花,大致看看有什么内容,知道需要的时候来查这篇文章就可以了,完全没有必要抵抗着困意非要把这篇文章认真看完,记住里面每一个寄存器里每一位的定义,但是以后的文章如果需要,一定要记得回来查查相关的内容。

然后说一下386

80386共提供7种类型的32位寄存器,如下:

通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI)
段寄存器(CS、SS、DS、ES、FS、GS)
指令指针寄存器和标志寄存器(EIP、EFLAGS)
系统表寄存器(GDTR、IDTR、LDTR、TR)
控制寄存器(CR0、CR1、CR2、CR3、CR4)
调试寄存器(DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7)
测试寄存器(TR6、TR7)
其中后三类寄存器是80386以后的CPU才有的,以前的CPU完全没有。

下图是前四类寄存器的大致示意图:

本文只对这些寄存器做一个大致的介绍,其中有些特殊且有较大意义的寄存器,会另文介绍。

一、通用寄存器

一组八个通用寄存器是对8086/80286通用寄存器的32位扩展,其用法与在8086/80286中相似,支持8位、16位、32位操作,进行32位操作是,寄存器名称前面冠以“E”。

这八个寄存器的名称如下:EAX(累加器)、EBX(基址)、ECX(计数)、EDX(数据)、ESP(栈指针)、EBP(基址指针)、ESI(源变址)、EDI(目的变址)。

ESI EDI变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。

寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

SI是源变址寄存器,DI是目的变址寄存器。可以用来存放数据、地址,功能类似、用法类似、一般使用哪个都可以。

二、段寄存器

80386比8086/80286增加了两个段寄存器FS、GS。

除CS支持代码段,SS支持堆栈段外,程序员可以利用其它的所有段寄存器支持数据段。

每个段寄存器对应这一个64位高速缓存器(有些资料中说有96位,但值使用其中的64位),这在8086中是没有的(在80286中为48位),它的具体作用将另文介绍。

三、指令指针寄存器和标志寄存器

指令寄存器EIP是对8086/80286指令指针寄存器的32位扩展,它包含着待执行指令的32位偏移量,该值总是相对CS所代表的段基址而言的。

标志寄存器也是对8086/80286标志寄存器的32位扩展,其定义如下(这张图截自Intel关于IA32架构的最新文档):

其中OF、DF、IF、TF、SF、ZF、AF、PF和CF在8086中就已经存在,请参考相关资料。

IOPL(I/O Privilege Level)是从80286开始出现的,占2个bit表示I/O特权级,如果当前特权级小于或等于IOPL,则可以执行I/O操作,否则将出现一个保护性异常。IOPL只能由特权级为0的程序或任务来修改。

NT(Nested Task)也是从80286开始出现的,表示嵌套任务,用于控制中断返回指令IRET,当NT=0时,用堆栈中保存的值恢复EFLAGS、CS和EIP,从而实现返回;若NT=1,则通过任务切换实现中断返回。

下面的标志位是80386以后的CPU才有的标志。

VM(Virtual-8086 mode)表示虚拟8086模式,如果VM被置位且80386已出于保护模式下,则CPU切换到虚拟8086模式,此时,对段的任何操作又回到了实模式,如同在8086下运行一样。

RF(Resume flag)表示恢复标志(也叫重启标志),与调试寄存器一起用于断点和单步操作,当RF=1 时,下一条指令的任何调试故障将被忽略,不产生异常中断。当RF=0时,调试故障被接受,并产生异常中断。用于调试失败后,强迫程序恢复执行,在成功执行每条指令后,RF自动复位。

AC(Alignment check)表示对齐检查。这个标志是80486以后的CPU才有的。当AC=1且CR0中的AM=1时,允许存储器进行地址对齐检查,若发现地址未对齐,将产生异常中断。所谓地址对齐,是指当访问一个字(2字节长)时,其地址必须是偶数(2的倍数),当访问双字(4字节长)时,其地址必须是4的倍数。

但是只有运行在特权级3的程序才执行地址对齐检查,特权级0、1、2忽略该标志。

VIF(Virtual interrupt flag)表示虚拟中断标志。以下的三个标志是Pentium以后的CPU才有的。当VIF=1时,可以使用虚拟中断,当VIF=0时不能使用虚拟中断。该标志要和下面的VIP和CR4中的VME配合使用。

VIP(Virtual interrupt pending flag)表示虚拟中断挂起标志。当VIP=1时,VIF有效,VIP=0时VIF无效。

ID(Identification flag)表示鉴别标志。该标志用来只是Pentium CPU是否支持CPUID的指令。

实际上,如果不编写操作系统,大部分标志可能很难得用到一次,有个印象就好了,用到了再去查不迟。

四、系统表寄存器

80386 中有4个系统表寄存器,分别是全局描述符表寄存器(GDTR)、中断描述符表寄存器(IDTR)、局部描述符表寄存器(LDTR)、任务状态寄存器(TR)。系统表寄存器用于在保护方式下,管理4 个系统表,由于只能在保护方式下使用,因此又称为保护方式寄存器。有关描述附表的问题,另文介绍。

五、控制寄存器

80386的控制寄存器有4个,其中CR1保留以后使用,从Pentium开始,又增加了一个CR4,CR0的低16位包含了与80286的MSW一致的位定义,保持了和80286的兼容,同时也兼容了从80286开始的两条指令LMSW/SMSW,其基本定义如下:

CR0中各位含义如下:

PE(Protection Enable)保护模式允许,PE=0表示CPU工作在实模式,PE=1表示CPU工作在保护模式
MP(Monitor Coprocessor)监控协处理器,MP=1表示协处理器在工作,MP=0表示协处理器未工作。
EM(Emulation)协处理器仿真,当MP=0,EM=1时,表示正在使用软件仿真协处理器工作。
TS(Task Switched)任务转换,每当进行任务转换时,TS=1,任务转换完毕,TS=0。TS=1时不允许协处理器工作。
以上4个定义从80286开始,下面的2个定义从80386开始存在

ET(Extension Type)处理器扩展类型,反映了所扩展的协处理器的类型,ET=0为80287,ET=1为80387。
PG(Paging)页式管理机制使能,PG=1时页式管理机制工作,否则不工作。
从80486开始又增加了如下位定义。

NE(Numeric Error)数值异常中断控制,NE=1时,如果运行协处理器指令发生故障,则用异常中断处理,NE=0时,则用外部中断处理。
WP(Write Protect)写保护,当WP=1时,对只读页面进行写操作会产生页故障。
AM(Alignment Mask)对齐标志,AM=1时,允许对齐检查,AM=0时不允许,关于对齐,在EFLAGS的AC标志时介绍过,在80486以后的CPU中,CPU进行对齐检查需要满足三个条件,AC=1、AM=1并且当前特权级为3。
NW(Not Write-through)和CD(Cache Disable),这两个标志都是用来控制CPU内部的CACHE的,当NW=0且CD=0时,CACHE使能,其它的组合说起来比较复杂,如果有读者真的想搞清楚的话,可以参阅《Intel? 64 and IA-32 Architectures》中的“Software Developer’s Manual Volume 3A”这一册,在第10章对这两个标志的各种组合有比较详细的说明。
CR1保留未用;CR2存放引起页故障的线性地址,只有在PG=1时,CR2才有效,当页故障处理程序被激活时,压入页故障处理程序堆栈中的错误码提供页故障的状态信息。
CR3的bit12--bit31存放页目录的基地址,因为也目录总是页对齐的(一页为4K),所以页目录基地址从bit12开始就可以了。只有当CR0中的PG=1时,CR3的页目录基地址才有效。
从80486开始,在CR3的低12位定义了两个控制位,如下:

PCD(Page-level Cache Disable)页CACHE禁止,当PCD=0时,页目录表进行高速缓存,PCD=1时,不进行高速缓存;该位控制PCD引脚控制外部CACHE工作还是不工作。
PWT(Page-level Writes Transparent),CACHE的写入分为透写(Write-Through)和回写(Write-Back),80486以上的CPU内部的CACHE都是透写的,但对外部CACHE而言,允许某些页是回写的,而另一些页是透写的,当PWT=1时,外部CACHE对页目录进行透写,否则进行回写;此位驱动PWT引脚以控制外部CACHE是透写还是回写。
CR4是从Pentium CPU开始出现的。

VME(Virtual-8086 Mode Extensions)虚拟8086方式扩展,VME=1允许使用虚拟8086扩展模式,否则只能使用80386/80486的虚拟8086模式。
PVI(Protected-Mode Virtual Interrupts)保护模式虚拟中断,PVI=1时,在保护模式下支持虚拟中断标志VIF(EFLAGS中),PVI=0则不支持虚拟中断标志。
TSD(Time Stamp Disable)时间戳禁止,TSD=1时,允许在特权级为0的程序中执行RDTSC指令(读时间戳计数指令),TSD=0时,允许任何特权级执行RDTSC指令。
DE(Debugging Extensions)调试扩展,
PSE(Page Size Extensions)页大小扩展,PSE=1时,页大小可以扩展到2M或4M,PSE=0时,页大小只能是4K.
PAE(Physical Address Extension)物理地址扩展,PAE=1时,页物理地址可以扩展到36bits以上,PAE=0时只能用32bits的物理地址。
MCE(Machine-Check Enable)硬件检查使能,Pentium以后的CPU有一种硬件检测功能,MCE=1时允许使用该功能。
PGE(Page Global Enable)全局页使能,PGE=1时,允许使用全局页,PGE=0时禁止使用全局页。
PCE(Performance-Monitoring Counter Enable)性能监视计数器使能,当PCE=1时,允许在任何保护级下执行RDPMC指令,PCE=0时,只有特权级0的程序可以执行RDPMC指令。

OSFXSR(Operating System Support for FXSAVE and FXRSTOR instructions)
OSXMMEXCPT(Operating System Support for Unmasked SIMD Floating-Point Exceptions)
VMXE(VMX-Enable Bit)VMX使能位,VMXE=1时,允许VMX操作。
SMXE(SMX-Enable Bit)SMX使能位,SMXE=1时,允许SMX操作。
OSXSAVE(XSAVE and Processor Extended States-Enable Bit)

六、调试寄存器

一共有8个调试寄存器DR0--DR7,DR0-DR3可以分别设置4个断点的线性地址,DR4-DR5保留未用,DR6是断点状态寄存器,DR7是断点控制寄存器(包括断点类型、断点长度,断点开放/禁止)

七、测试寄存器

一共有8个测试寄存器TR0--TR7,TR0-TR2保留,TR3-TR5用作CACHE测试,TR6为命令测试寄存器,TR7为测试数据寄存器

东海道新干线的途中有哪些车站?: 东海道新干线是一条由日本东海旅客铁道营运,连接东京车站与新大阪车站的新干线高速铁路路线,可以说是全球第一个成功的高速铁路系统。因与山阳新干线直通运转的关系,故时常被合称“东海道、山阳新干线”。
沿途各站点为:东京(Tokyo)—上野(Ueno)—大宫(Omiya)—小山(Oyama)—宇都宫(Utsunomiya)—那须盐原(Nasu-shiobara)—新白河(Shin-shirakawa)—郡山(Koriyama)—福岛(Fukushima)—白石藏王(Shiroishi-zao )—仙台(Sendai)—古川(Furukawa)—くりこま高原(Kurikoma-kogen)—一ノ关(Ichinoseki)—水泽江刺(Mizusawa-esashi)北上(Kitakami)—新花卷(Shin-hanamaki)—盛冈(Morioka)—いわて 沼宫内(Iwate-numakunai)—二户(Ninohe)—八户(Hachinohe)。
http://baike.baidu.com/view/1890467.htm

热门标签: numa 哪些 numa 哪些
  • dota a杖是谁

    在南充。比亚迪F0做一次保养需要多少钱??多长时间一次???!!: 比亚迪F0需要5000公里保养一次,不过F0的只换机油机滤的首保是在3千公里。 常规保养换三滤 197 ...

    236条评论 3832人喜欢 3009次阅读 496人点赞
  • 2016春晚一想到你呀谁唱的

    coreldraw x4怎么在圆环里写字并让字逆时针转: 1.选中圆环2.单击文字3.光标移到圆环里出现一个小符号 现在就可以直接输入文字了。4.你想要的效果,可以使用左右镜像或上下镜像,旋转等命令操的、希望对你有帮助 ...

    974条评论 6211人喜欢 6229次阅读 864人点赞
  • gta5可以有几个车库

    南天PR2用USB转IEEE1284后不运作。: 你用的是什么品牌的线? ...

    873条评论 2037人喜欢 1575次阅读 551人点赞