1.Informix常用命令

2.电脑中REQ,GNT,INT,INIT,SMI各代表什么信号

3.我买了台电的一个8g的u盘检查的结果芯片制造商: 慧荣(SMI) 芯片型号 : SM3257ENAA 。这个是你们的真的吗?

4.关于电脑BIOS

5.T480(MX150)安装英伟达驱/cuda(lspci|grep VGA只有一个)

6.我的SMI慧荣SM321/SM325量产失败了,用短接法,怎么量产也量产不回来了,能帮帮我吗?

7.64位扩展技术的Intel的64位扩展技术

然后更新电脑系统_smi电脑系统更新

smi usb disk指的是smi移动硬盘。

需要转到图2中的Boot选项,去那里查看启动项中是否有硬盘。还可以转到图2中的advanced,找到sata选项,以查看硬盘驱动器通道中是否有硬盘驱动器。

主要I / O设备的驱动程序和中断服务:因为BIOS直接处理系统硬件资源,所以它始终针对特定类型的硬件系统,并且各种硬件系统都不同,因此随着BIOS的发展,类型也有所不同基于硬件技术,出现了同一BIOS的不同版本。 BIOS的新版本比旧版本更强大。

扩展资料:

EPROM(可擦除可编程ROM)芯片,解决了ROM芯片只能写入一次的缺点。 EPROM芯片具有非常明显的功能。在其前面的陶瓷封装上,有一个玻璃窗,通过它可以看到内部的集成电路。

紫外线可以通过孔照射内部芯片以擦除其中的数据。 EPROM擦除器用于完成芯片擦除操作。在EPROM中写入数据需要专用的编程器,并且在向芯片写入内容时必须添加一定的编程电压。

EPROM模型以27开头。例如,27C020(8 * 256K)是2M Bits EPROM芯片。写入数据后,EPROM芯片还必须用不透明的标签或胶带密封窗口,以免周围的紫外线辐射损坏数据。

Informix常用命令

BIOS里设置USB启动项操作步骤:

1、首先启动计算机,按DEL,进入主板的BIOS设置。

2、选择高级BIOS设置:Advanced BIOS Features。

3、高级BIOS设置(Advanced BIOS Features)界面,首先选择硬盘启动优先级:Hard Disk Boot Priority。

4、硬盘启动优先级(Hard Disk Boot Priority)选择:使用小键盘上的加减号“+、-”来选择与移动设备,将U盘选择在最上面。然后,按ESC键退出,回到图2的设置界面。  

5、再选择第一启动设备(First Boot Device):此版本的BIOS这里没有U盘的“USB-HDD”、“USB-ZIP”之类的选项,经尝试选择移动设备“Removable”不能启动,但选择“Hard Disk”可以启动电脑。 

电脑中REQ,GNT,INT,INIT,SMI各代表什么信号

常用命令oninit

将系统从off-line模式变为on-line模式oninit -iy

(初始化数据库,删除所有dbspace和chunk)oninit -s (

脱机-->静态)onmode -ky offlineonmode -s graceful shutdown-->quiescent(联机到静态,让用户处理完成)

onmode -u

immediate shutdown-->quiescent(联机到静态,所有用户立即终止)

onmode -m

quiescent--->onlineonmode -z sid 删除某session onmode -l 将当前正在使用的逻辑日志下移onmode -c

强制执行检查点操作即onmonitor->force ckpt onstat - 查看服务器状态onstat -d 查看dbspace和chunk情况onstat -l

查看逻辑日志onstat -F 查看写入磁盘的页刷新和类型情况,从共享内存缓冲区向磁盘写入页面有三种方式(fg:前台写 LRU:队列写 chunk:块写)onstat -R

打印LRU队列onstat -p 显示系统的基本I/O与性能配置文件onstat -c 查看onconfig文件onstat -m 查看消息日志onstat -f

查看受DATASKIP影响的dbspaceonstat -x 查看事务onstat -k

显示所有活动的锁onstat -g sub_option 运行多线索选项

onstat -g ses/sql onstat -r <value> 每隔<value>秒后重复选项 onstat -g act

显示系统中所有的活动线索 onstat -g ath -r 2 每隔两秒显示系统中所有的活动的线索 onstat -i 交互方式 >sql>sql sidipcs

查看共享内存情况ipcrm

删除某个共享内存ipcrm -m id ipcrm -s id

Ontape命令:

1)零级(一级或二级)备份$>ontape -s$>ontape -s -L 0$>ontape -s -L 1$>ontape -s -L

2自动备份逻辑日志文件 $>ontape -a

3)连续逻辑日志备份(日志文件写满一个,online系统自动备份一个,你可以插盘磁带到磁带机上,让IDS自动备份。

要占用磁带机)$>ontape -c

4)备份恢复(对应零级备份或一级备份或二级备份)$>ontape -r (详细过程见ontape恢复文挡)

5)备份恢复几个DBSPACE(一定要存在逻辑日志备份,否则物理恢复完后,还是不能用)$>ontape -r -D dbs1 dbs2 。。。

6)配置HDR时使用的物理恢复$>ontape -p

7)修改数据库日志模式$>ontape -s -B db_name 修改为buffer_log 即缓冲日志模式$>ontape -s -U db_name

修改为unbuffer_log 即非缓冲日志模式$>ontape -s -N db_name

修改为无日志模式 数据库不含日志,即不支持事务,对数据库的任何修改都不会记录到逻辑日志中去$>ontape -s -A db_name

修改为ansi logging模式,从个模式无法改到其它模式,因此一般不要用该项。oncheck 命令 oncheck -pe

extendoncheck -ceoncheck -cr reserved pagesoncheck -cd TBLspace data rows including bitmaponcheck -ci

table indexes databases对逻辑日志的操作:以informix用户登录, $ onmode -uy (由Online切换到Quiescent状态,所有用户立即中止)

onmode -m (切换到Online) $ onparams -a -d logdbs -s 100000 其中logdbs为dbspaces 名,-s 100000 表示增加了100M空间。

再连续执行4遍上述命令,这样新的逻辑日志空间总共为500M,可以用 onstat -l 查看逻辑日志情况,接下来就要删除前面3个旧逻辑日志,

删除前做一个0级备份 # ontape -s -L 0 执行该命令做0级备份,建议: 如果允许可以每天在业务系统结束工作

后做一次0级备份,做完备份后管理好备份磁带,做好标记。 $ onparams -d -l logid

logid 为逻辑日志id号,可以用onstat -l 查看,然后就可根据id号删 除3个旧逻辑日志。

将当前正在使用的逻辑日志下移 $onmode -l 三、DBSPACE及数据库导入导出1.增加一个新的dbspace:(datadbs,15M, 偏移为0)

onspaces -c -d datadbs -p /home/informix/datadbs -o 0 -s 150002.

在datadbs这一个dbspace中增加一个chunk:(datadbs_chunk1)onspaces -a datadbs -p /home/informix/datadbs_chunk1 -o 0 -s 150003.将上述chunk删除onspaces -d datadbs -p /home/informix/datadbs_chunk1 -o 0 4.删除dbspace(仅当要删除的dbspace空间没有数据时才可删除)onspace -d datadbs 导出数据库: 用dbexport工具将数据卸成文本,并装载到其它服务器上。(1)卸载文本的步骤如下:用informix用户注册 dbexport cleardb -o WORKDIR -ss 当系统提示dbexport completed!数据卸载完毕。其中: -ss 确保数据库的建库信息或建表信息被保留如日志模式、初始extent尺寸、lock mode、表所在dbspace等。 -o 指定存放卸载数据的目录数据存放在目录cleardb.exp目录下,其中包含cleardb.sql和形如*.unl的文件,

提示信息存放在dbexport.out文件中。

(2)装载文本的步骤如下:用informix用户注册确保数据库处于On_Line状态,服务器上没有同名数据库。

dbimport cleardb -i WORKDIR 当系统dbimport completed!提示数据装载完毕。其中: -i

指定从何处装载。如何在不破坏库本身信息情况下(如行级锁等)将数据库卸载到磁带设备,并装载在其它服务器上?1)

p; 卸载的步骤如下:用DBA用户注册将存放数据的磁带插入磁带机,确认磁带及磁带机完好可用。

dbexport cleardb -t /dev/rmt/0m -b 512k -s 2048000k -ss当系统提示dbexport completed!数据卸载完毕。其中: -ss 确保数据库

的建库信息或建表信息被保留如日志模式,初始extent尺寸,lockmode,表所在dbspace -t 磁带设备/dev/rmt/0m -s

磁带容量2G -b 块大小512KB 提示信息存放在dbexport.out文件中2)装载的步骤如下:

用DBA用户注册将存放卸载数据的磁带放在磁带机上,确认磁带机正常,确认数据库系统处于On_Line状态,

服务器上没有同名数据库。

$ dbimport cleardb -t /dev/rmt/0m -b 512k -s 2048000k 当系统dbimport completed 提示数据装载完毕!提示信息存放在dbimport.out 文件中。

重建表格:1) dbschema -d dbname -t tabname -ss tabname.sql /*将表格结构放进tabname.sql*/编辑此文件并在create table

语句末尾增加新的区域长度暂时将生成表格索引的tabname.sql部分标为说明语句,即在索引句前后加上“{}”,

例如:{ create index xl on customer(last_name); create index x2 on customer(cust_nbr);}

最好在后面生成索引,因为这样表格能快速装入,索引能在连续磁盘空间生成,使其更加有效。

2)锁定表格lock table tabname in exclusive mode;

3)用SQL UNLOAD 将表格卸载到磁盘或磁带中unload to file_or_tape_path select * from tabnameunload to "/usr/data/unload/customer.unl" select * from customer;

检查表中的行数(用SQL中的Table/Info命令),验证卸载是否成功。比较这个数与装入完成后SQL显示的消息。用此验证file_or_tape_path中的行数:wc -l file_or_tape_path

4)删除表格

5)用dbacess生产表格并运行tabname.sql。这时不要生成索引

6)用SQL的LOAD FROM 或用 dbload重新装入表格load from file_or_tape_path insert into tabname;load form "/usr/data/unload/customer.unl" insert into customer;

对于日志数据库,上面的装入语句可能产生长事务或“to many lock”错误。

这时建议用dbload之类的实用程序将数据插入表中。dbload的 -n 选项强制在插入一定行后进行commit work(建议选1000行)。

检查表中的行数(用SQL中的Table/Info命令),验证装入是否成功。7)如要生产索引,运行第一步中标为说明语句的tabname.sql部分。

8)更新表格统计信息 update statistics on tabname;

语法 oninit [-s] [-i] [-p] [-y]

oninit   将系统从off-line模式变为on-line模式

oninit -s将系统从off-line模式变为quiescent模式

oninit -i初始化系统

oninit -p在共享内

存初始化时,不搜索,删除临时表

oninit -y对提示自动回答yes

oninit -v 加入这个选项显示oninit处理过程

oninit-- 键入此命令可以获得使用帮助

oninit命令用来改变系统的运行模式。其中-i选项用于初始化系统的root dbspace。注意,root-dbspace一旦被初始化,则等于整个数据库系统被初始化。

如果用户希望在计算机启动时自动自动启动动态服务器系统,请在系统初启文件(在许多UNIX系统中为/etc/rc)中加入oninit命令(不加任何选项)。

onmode 命令

语法: onmode [-k] [-m] [-s] [-u] [-y]

onmode -k   执行立即shutdown,将系统变为off-line模式

onmode -m   将系统从quiescent模式变为on-line模式

onmode -s   执行graceful shutdown

onmode -u   执行immediate shutdwon

onmode -y  对提示自动回答yes

onmode 命令同样用于改变动态服务器的运行模式。除了上述选项外,onmode还有很多与改变系统运行模式无关的选项。

利用onspaces命令创建数据空间

语法: onspaces -c [-b] [-d] [-z] [-m] [-o] [-p] [-s] [-t]

-c    创建blobspace或dbspace

-b blobspace blobspace名

-d dbspace dbspace名

-g page size  blobpages大小

-m mirror 镜像设备设的全路径名和偏移量(KB)

-o offset 偏移量(KB)

-p pathname chunk设备的全路径名

-s size    dbspace大小(KB)

-t      创建临时dbspace

onspaces 命令用于创建数据空间、临时空间和存储blob数据的空间(blobspace)。键入onspaces--可以获得该命令的联机帮助。

利用onstat -D或onstat -d可以看到系统中的关于数据空间的重要信息。包括:chunk的状态、空闲、每一chunk读写的次数。

系统中可能包括的多个系统空间,特别当进行数据分片后,我们建议用户最好能利用命令行来创建数据空间。

可以利用如下命令创建数据空间:

onspaces -c -d datadbs1 -o 0 -p /dev/rrvol3 -s 60000

可以用如下的方式创建临时数据空间:

onspaces -c -d tempdbs1 -t -o 0 -p /dev/rrvol5 -s 80000

在系统中,临时数据空间非常重要,通常情况下,应将多个临时数据空间分布在独立的物理设备上。

利用onspaces命令删除数据空间

增加或删除chunks

语法: onspaces -a -d [-m] [-o] [-p]

-a spacename  为dbspace新增chunk

-m pathname    镜像设备的全路径名和偏移量(KB)

-o offset   主设备的偏移量(KB)

P>

-p pathname   chunk设备的全路径名

-s size      chunk大小

-d spacename  删除chunk

-o offset    chunk设备的偏移量(KB)

onspaces不仅能创建数据空间还能删除数据空间、临时数据空间或存储blob数据的空间。在删除数据空间时,必须首先保证它是无用的,即该数据空间上无数据库或表。

如需删除数据空间,请键入如下命令:onspaces -d dbspace_name /blobspace_name

数据空间最初由一个chunk(first chunk)构成,一旦其空间用尽,用户必须追加chunk为了提高系统性能,用户在为数据空间分配chunk时需要计算以保证它的大小能适应未来的需要,否则在追加chunk的时候,它与先前的chunk在物理上不一定相邻,导致增加读取数据的时间。关于如何计算空间需求将在以后章节中阐述。利用 onspaces命令可以对数据空间增加或者删除chunk,除此之外,利用该命令还可以完成如下任务:启动镜像、中止镜像或改变chunk的状态。

例如可以用如下命令为数据空间增加chunk:

onspaces -a -d datadbs1 -0 60002 -p /dev/rrvol3 -s 60000

再如可以用如下方式从数据空间中删除chunk:

onspaces -d datadbs1 -o 60002 -p /dev/rrvol3 -s 60000

onparams 命令

语法:onparams -a -d -p [-d] [-s] [-l]

-a   新增逻辑日志

-d dbspace 指定日志存放的dbspace

-s size新增逻辑日志的大小(KB)

-d   删除逻辑日志

-l logid 指定删除一个逻辑日志

-p   改变物理日志

-d dbspace 新物理日志存放的dbspace名

-s size  物理日志大小(KB)

系统在初始化时自动地在root dbspace中创建逻辑日志和物理日志。在DBMS系统中,尤其在OLTP环境下,数据库的操作非常频繁,日志中必须记录大量的信息,所以用户最好能将多个日志文件分布在不同的设备上。有一种非常简单的方法:即按所需大小创建逻辑日志,同时创建一个较小的物理日志,系统初始化完毕后,再将物理日志移至其它设备。关于如何确定所需的物理日志的大小,将在以后的章节详述。利用onstat -l命令可以看出系统中所有新增的逻辑日志被标识为A。这些逻辑日志只有在系统进行归档后才会真正被使用。为了激活这些逻辑日志有一种简单的方法:执行一次"伪"归档。具体步骤如下:将参数TAPEDEV设置为/dev/null然后运行一次ontape -s。也可以执行onbar -F命令。由于伪归档并不真正归档系统信息,所以千万要适时地对系统进行真正的归档操作。

只有在逻辑日志真正无用时才能将其删除。利用onstat -l 可以看出所有的空闲日志被标记为F。如果逻辑日志中包含事务回滚或快速恢复所需的信息,该逻辑日志是不能被删除的。利用onstat -l命令可以看出接受当前事务的日志被标记为C。如果逻辑日志包括最后一个检查点记录,它也是不能被删除的,只有当检查点记录被写入下一个日志忠并且上一个日志被备份后,该日志才能被删除。利用onstat -l命令可以看出包含最后一个检查点记录的日志被标记为L。用户可以利用

onmode -c命令强制写检查点记录直至最后一个检查点记录被写入所要求的日志为止。

onstat 工具

显示动态服务器共享内存中的信息

涉及少量磁盘I/O操作

将对系统性能的影响极小

提供关于系统有价值得信息

命令行交互式监控系统

在本章中将讲解onstat 的各种重要选项,请熟悉它们的使用

onstat 命令是一种非常有用的系统实时监控工具。该命令直接从共享内存的数据结构中读取信息,报告当时的系统状况。通常onstat 命令不会进行磁盘I/O操作,也不会对系统资源加锁,所以它对系统性能的影响减少到最小。简言之,onstat是informix提供的一种交互式的系统监控工具。

onstat 的一些常用选项:

onstat --   列出所有选项

onstat -i   设置进入交互模式

onstat -   显示运行模式和数据库引擎状态

onstat -g sub_option 运行多线索选项

onstat -r 每隔秒后重复选项

onstat -g act 显示系统中所有的活动线索

onstat -g ath -r 2 每隔两秒显示系统中所有的活动的线索

系统监控界面

sysmaster数据库在系统初始化时自动创建

数据库中包括指向系统共享内存结构数据字典信息

提供瞬时的系统性能和状态信息

提供SQL界面了解数据字典信息

允许管理员将系统管理工作自动化

用于执行重复性的监控任务

系统监控界面(system Monitoring Interface --SMI)是一种基于SQL的系统工具,

用户通过SMI可以非常方便地获取系统信息。系统在初始化时,自动地在root dbapace创建sysmaster系统数据库。

每一系统包括一个sysmaster数据库,该数据库中的大部分表为虚表,是指向共享内存中数据结构的指针。利用SMI可以自动监控系统,特别是在执行重复任务时。

sysmaster数据库是只读的,即不允许对其进行INSERT UPDATE,或DELETE操作。所有用户都拥有对该数据库的查询权限。

在系统初始化后,用户一定要注意检查sysmaster数据库是否建立成功。创建sysmaster数据库的信息都保存在消息日志文件中(online.log)请注意由于所有的DDL语句都将被记录在日志中,

所以一定要在日志文件中留出足够的空间以保证创建sysmaster所需。

sysmaster数据库模式记录在$INFORMIXDIR/etc/sysmaster.sql文件中。

oncheck 命令

检查动态服务器磁盘上的数据结构

定位并修补损坏的索引和数据

有磁盘I/O操作

一些操作在处理时将在表上加锁

oncheck命令用于修复磁盘上损坏的索引和数据页,该命令也可用于检查并打印系统的数据结构。在使用oncheck时一定要当心,因为改命令的某些选项会对表加共享锁,例如:oncheck -pt

>

为防止对系统的损坏,系统会对所有共享内存中的数据进行一次一致性检查。一旦发现数据页出现一致性错误或发现索引错误,系统将把问题和可能的解决方案(利用oncheck)写入消息日志文件,并返回isam错误代码105。

如果发现一致性错误信息,用户应该立即关闭系统并按消息日志文件中的提示运行oncheck。如果oncheck运行失败,则应尝试卸出表再重新装入;如果是索引得问题,则应先删除索引再重建之。如果所有这些步骤都失败了,只有根据原有的系统归档备份来恢复系统。

下面的命令可以提供extend信息:

oncheck -pe

在onstat –l中,flag位表示了逻辑日志的状态,

A表示新加了还不能使用的日志

F表示空闲的可以使用的日志,一般是在0级备份之后才有这样的状态

U表示已经使用的逻辑日志

L表示当前的日志文件包含一个检查点

C表示正在使用当前的日志文件

B表示已经备份的日志文件

我买了台电的一个8g的u盘检查的结果芯片制造商: 慧荣(SMI) 芯片型号 : SM3257ENAA 。这个是你们的真的吗?

req是一个方法的返回,是一个ajax方式的请求服务器的方法的返回

GNT三相的意思

INT指数据库中常用函数中的"取整函数.常用来判别一个数能否被另一个数整除

INIT标示符在gcc编译器中指定将该函数置于内核的特定区域。在内核完成自身

初始化之后,就试图释放这个特定区域。实际上,内核中存在两个这样的区域,

.text.init和.data.init—第一个是代码初始化使用的,另外一个是数据初始化使用的(

可以在进程间共享的代码和字符串常量之类的“文本(Text)”是在可执行程序中的“纯

区域”中使用的一个术语)。另外你也可以看到__initfunc和__initdata标志,前者和

__init类似,标志初始化专用代码,后者则标志初始化专用数据。

SMI是字幕文件

关于电脑BIOS

台电产品可以根据机器查询码查询是否正品,方法一:拨打电话020-38731788,方法二:送到台电服务网点检测,台电全国各地服务网点查询: style="font-size: 18px;font-weight: bold;border-left: 4px solid #a10d00;margin: 10px 0px 15px 0px;padding: 10px 0 10px 20px;background: #f1dada;">T480(MX150)安装英伟达驱/cuda(lspci|grep VGA只有一个)

boot option#1 (PCI ROM setup...)

后面 把他选为SMI USB Disk 1100 就可以了 保存退出 就可以从U盘启动了

我的SMI慧荣SM321/SM325量产失败了,用短接法,怎么量产也量产不回来了,能帮帮我吗?

# lspci | grep? VGA

# lspci | grep? 3D

有点坑,比较奇葩。一般来说第一个因为要有两条信息出来的

1、 在系统设置->软件更新->附加驱动->选择nvidia最新驱动(384)->应用更改

2、结果:系统设置->详细信息 显示为GeForce MX150

安装成功,轻松简单,重装十来次ubuntu才试成功的。然后可以安装官网方式安装cuda

成功验证:

# nvidia-smi

# nvidia-settings

第二种方法,

(查看系统设置->软件更新->附加驱动里面的英伟达数字版本,如384)

Ctrl+Alt+F1,进入图形界面

# sudo service lightdm stop

# sudo apt-get install nvidia-384

# sudo service lightdm start

第三种方式,添加源的方式,可以参考网上的以及参考链接,

另外如果使用英伟达官网驱动,直接各种出错安装不了,

cuda安装参考官网或者其他网页方式即可,安装deb文件,比较简单。

安装完成后添加cuda环境变量即完成。

# nvcc –V 查看版本

cuda/samples目录下运行例子即可

有用参考:

以及链接里面的附加链接

64位扩展技术的Intel的64位扩展技术

1、首先要确定你下载的量产工具版本是不是正确,可以兼容的。

2、所谓的短接法,其含义是在于电脑USB找不到U盘的通信数据,故用金属物短路IC引脚,起到清空内存内部的电子数据,达到复位作用,但在量产低格时是不用短路的。

3、如果上述操作都正确,那就是量产工具里的设置参数存在问题,(正确指标:等级2,ECC 1,低级格式化)

4、以上操作均不能量产通过,就可以确定为U盘硬件出现故障,必须找专业维修人员确认故障并维修,建议先咨询U盘厂家售后人员。

具有64位扩展技术的处理器能运行在传统IA-32模式或IA-32e模式。传统的IA-32模式允许处理器运行在保护模式、实地址模式或虚拟8086模式。

IA-32E模式是处理器在运行64位操作系统的时候使用的一种模式。带有64位扩展技术的处理器将初始进入传统的、页式地址、保护模式,然后,当IA32-EFER寄存器中的某位被设置并且PAE(Physical Address Extensions,物理地址扩展)模式被使能。下表显示了64位扩展技术所支持的操作模式和他们之间的区别。

1.IA-32e模式

IA-32e模式有两个子模式:64位模式和兼容模式。IA-32e模式只能在装载64位操作系统的情况下进入。

2.64位模式

64位模式用于运行在64位操作系统中的64位应用程序它支持以下的特性:

支持64位线性地址结构;然而支持64位扩展技术的IA-32处理器将用少于64位地址来实现

寄存器扩展后,可以使用新的操作码前缀来访问(REX)

现有的通用寄存器被加宽到64位(RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP)

8个新的通用寄存器(R8–R15)

8个新的128位流SIMD扩展(SSE)寄存器(XMM8–XMM15)

一个64位的指令指针(RIP)

一个新的RIP相关数据寻址模式

对单一的代码、数据和栈空间能用平板地址空间

扩展的和新的指令

支持大于64GB的物理地址;然而支持64位扩展技术的IA-32处理器的实际物理地址要特殊实现

新的中断优先级控制机制

64位模式能够在以代码段为基础的操作系统中被使用。它的缺省地址大小是64位;它的缺省操作宽度大小是32位。注意这些缺省设置能够在使用新的REX操作码前缀的指令-指令对中被超越。当操作在64位模式下时,REX前缀允许指定一个64位操作数。利用这个机制,很多现有的指令被修改或重新定义来允许使用64位寄存器和64位地址。

3.兼容模式

兼容模式允许传统的16位和32位应用程序无需重新编译就可以运行在64位操作系统下(然而运行在虚拟8086模式下或使用硬件任务管理中的传统应用程序将无法工作)。就像64位模式那样,操作系统在一个专门的代码段使能兼容模式。这意味着64位应用程序能运行在处理器中(64位模式)的同时,32位应用程序(没有为64位重编译的)运行再兼容模式。

兼容模式像传统的保护模式。应用程序只能存取线性地址空间中的第一个4GB,处理标准IA-32指令前缀和寄存器。在兼容模式下不提供REX前缀。(REX前缀编码已经处理成传统IA-32指令)兼容模式也必须使用16位和32位地址和操作数。和传统保护模式一样,兼容模式也允许应用程序使用PAE(物理地址扩展)处理64GB的物理存储。

下列传统保护模式下的项目,在兼容模式下不支持。

虚拟8086模式,任务切换和栈参数拷贝特性在兼容模式下不可用

从操作系统的角度看:使用64位机制替代32位机制来处理系统数据结构,地址变换,中断和异常处理等结构和事务。

4.传统模式

为什么Intel现在做这件事情?

传统模式包括保护模式,实地址模式和虚拟8086模式。现有的为这些模式中的任何一种模式而编写的软件都完全能兼容地运行在具有64为扩展技术的IA-32处理器中。

5.系统管理模式

系统管理模式(SMM)提供与传统IA-32架构中的系统管理中断(SMI)处理程序相同的执行环境。SMM支持从一个模式到另一个操作模式(包括IA-32e和传统模式)的转换。一个SMI处理程序能够通过PSE机制处理任何的物理存储页。然而由于不支持PAE,SMM环境不支持64位线性地址。提交给SMI的事务,处理器将转换到SMM,并根据SMM存储映射(save map)将存储器的状态存储到SM RAM中。因此,一个SMI处理程序将执行在和传统IA-32架构中一样的环境中。 下表比较了运行在64位模式的应用程序和运行在传统的IA-32环境的应用程序中寄存器数据结构的不同。传统环境包括那些存在于现有IA-32处理器、支持64位扩展技术的处理器中的传统模式以及IA-32e兼容模式中的环境。兼容模式应用程序不能在64位模式或64位操作系统中运行,因此应用程序需要运行在传统IA-32保护模式环境中。

1.通用寄存器(General-Purpose Registers,GPRs)

IA-32结构运行在传统或兼容模式时,有8个通用寄存器。AX, BX, CX, DX, DI, SI, BP, SP对16位操作数有效,EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP对32位操作数有效。

在64位模式,缺省的操作数是32位的,然而GPRs可以针对32位和64位操作数。如果是32位操作数 EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D - R15D可用,如果是64位操作数RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8-R15可用,R8-R15是8个新的GPRs。所有的这些寄存器能够具有字节、字、双字和四字四个级别。这些级别的划分主要是看REX前缀。

在64位模式,将限制指令存取字节寄存器,指令不能同时使用传统的高字节(比如AH, BH. CH, DH)和新的字节寄存器(比如RAX寄存器的低字节)。然而指令将可同时用传统低字节(比如AL,BL,CL或DL)和新的字节寄存器(比如R8寄存器或RBP)。这种结构将强迫大家遵守以上的限制,并将任何代REX前缀的指令对高字节(AH, BH, CH, DH)的使用转换到低字节(BPL, SPL, DIL, SIL; 这些是RBP,R SP, RDI 和 RSI的低8位) 的使用。

在64位模式下,操作数的大小决定了目标GPR的有效位数:

64位操作数产生一个64位的结果到目标通用寄存器

32位操作数产生32位的结果,采用0-扩充的方法将64位结果写到目标通用寄存器

8位和16位操作数产生一个8位或者16位的结果。目标通用寄存器的高56位或48位在操作中不会被修改。如果一个8位或16位操作数的结果被用作64位地址计算,则会对其进行符号扩展,扩展到64位。

因为64位通用寄存器的高32位在32位模式中没有定义,所以当从64位模式转换到任何一种32位模式(比如传统模式或兼容模式)时,高32位的数据将不被保留。同样,在64位转换到32位模式之后,软件也不必要用这些没有定义的高字节位来存放数据。这些值回从一个硬件实现转换到下一个,或从一个周期转换到下一个。

2.流SIMD扩展(SSE)寄存器

在兼容和传统模式下,SSE寄存器组由8个128位的传统寄存器XMM0-XMM7组成。在64位模式,有了8个附加的128位SSE寄存器,XMM8-XMM15。通过使用REX指令前缀访问这些存储器。XMM寄存器能够在任何模式下,在SSE, SSE2, SSE3指令中使用。

3.系统寄存器

64位引入新的寄存器也改变了现有的系统寄存器。他们是:

MSRs.扩展特性允许MSR(IA-32_EFER)包含控制,允许与禁止64位扩展技术特性的那些位

控制寄存器。所有的控制寄存器扩充到64位,增加了一个新的控制寄存器(任务优先级寄存器CR8或TPR)

描述符表寄存器。全局描述符表寄存器(GDTR)和中断描述符表寄存器(IDTR)被扩展到10字节,以便他们能够包含全部64位地址。局部描述符表寄存器(LDTR)和任务寄存器也别扩展来包含64位地址。

调试寄存器。调试寄存器扩展到64位。

1)扩展特性允许寄存器(IA-32_EFER)

LMA(IA-32e模式激活,位10):该位是只读状态位,任何对该位的写入操作都将会被忽略。当IA-32e模式和页式管理被允许后,处理器将该位置1,这表明处理器运行在兼容模式或64位模式,具体在那个模式就要看代码段描述符的L位和D位的值。LMA=0时,处理器运行在传统模式,在这个模式下,处理器处理器的行为如同标准32位的IA-32处理器。

LME(IA-32e模式允许,位8):设置该位为1可以使处理器的能力转换到IA-32e模式,但是IA-32e模式并没有真正被激活,只有当软件使能PAE模式进行页式管理。当PAE页式管理被允许,并且LME被设置为1,处理器将设置LMA位为1,这指明IA-32e模式不仅被允许,同时被激活。IA32_EFER的其他所有保留位必须位0。

SCE(Syscall/Sysret允许,位0):这位设置为1将支持Syscall/Sysret。Syscall/Sysret只在64为模式下被支持。操作系统负责为64位操作来使能它。

2)控制寄存器

控制机存器CR0-CR4在64位扩展模式下被扩展到64位。在64位模式,MOV CRn指令读或写这些寄存器的全部64位。操作数宽度前缀被忽略。兼容和传统模式,控制寄存器的高32位被全部填0,读控制寄存器也只返回低32位。

在64位模式,CR0和CR4的高32位被保留并且必须被写0。对高32位的任何一位进行写的结果是引起一般性保护异常,#GP(0)。CR2的所有64位都可通过软件来写。CR3的位[51:40]被保留,必须为0。然而MOV CRn指令不检查写到CR2或CR3的地址是否在线性地址或物理地址的实现界限内。

64为扩展结构引入了一个新控制寄存器—CR8,它被定义为任务优先级寄存器(TPR)。操作系统能够基于中断的优先级别,使用TPR来控制是否允许外部中断来中断处理器。

3)描述符表寄存器

四个系统描述符表寄存器(GDTR, IDTR, LDTR和TR) 被扩展到能容下64位基地址。这允许运行在IA-32e模式的操作系统能够将描述符表定位在可用的线性地址空间的任何地方。下表给出了这四个寄存器。在所有的情况下,基地址必须符合范式。线性和物理地址位数能够用执行CPUID通过EAX设置80000008H来决定。

4)调试寄存器

在64位模式下,调试寄存器DR0-DR7是64位的。MOV DRn指令读或写所有的64个寄存器位。操作数宽度前缀被忽略。

在IA-32e平台上所有16位模式或32位模式(传统模式或兼容模式)写调试寄存器时高32位全部填0,读调试寄存器的时候只返回低32位。在64位模式下,DR6和DR7的高32位保留并必须是0,对高32位的任何一位写1都会引发#GP(0)异常。

DR0-DR3的所有64位都是软件能写的。然而MOV DRn指令不检查写到DR0-DR3的地址在线性地址的限制内。只在处理器产生有效地址的时候支持地址匹配。 1.地址宽度和操作数宽度前缀

64位模式中,缺省的地址宽度是64位,缺省的操作数宽度是32位。地址宽度和操作数宽度前缀允许32位和64位数据和地址在指令序列中混用。下表(1-7)显示了在IA-32e模式下需要指令前缀地址宽度。注意,在64位模式下不支持16位地址。在敬爱内容和传统模式下,地址宽度函数的功能和在IA-32传动架构中一样。

在64位模式下, 缺省的操作数宽度是32位,REX前缀包括4位域来指定16个不同的值。REX前缀的W位域指定为REX.W。REX.W=1时前缀表明操作数位64为操作数。注意,软件依然能使用操作数宽度66H前缀来切换到16位操作宽度。然而如果同时用REX.W和66H前缀,REX.W的优先权要高。

在SSE/SSE2/SSE3 SIMD指令的情况下,66H, F2H和F3H前缀作为操作码扩展,并被认为是指令的一部分。在这些情况下,有效的REX.W前缀和66H代码扩展前缀之间没有相互关系。

2.REX前缀

REX前缀是64位模式下引入的新的指令前缀字节,他作以下工作:

指定新的GPRs和SSE寄存器

指定64位代码宽度

指定扩展的控制寄存器(只给系统软件使用)

不是所有的指令都需要REX前缀。这个前缀只在指令引用扩展的寄存器或使用64位操作数的时候才有必要。如果该前缀放在不需要的地方将会被忽略。

一个指令只能有一个REX前缀。这个前缀一旦使用,就必须直接放在操作码字节或两字节操作码扩展前缀之前。 其他位置的REX前缀将被忽略。

包含有REX前缀的指令依然要遵循传统的15字节的指令宽度的限制。下图描述了REX前缀如何符合指令的字节次序的。

3.控制和调试寄存器的新编码

在64位模式下,有为控制机存器和调试寄存器指定的附加的编码。当ModRM寄存器的域编码一个控制或调试寄存器的时候,REX.R位被用来修改这些域。这些编码允许处理器访问CR8-CR15和DR8-DR15。

在64位模式中附加了一个控制寄存器(CR8)。CR8成为任务优先级寄存器(TPR)。在IA-32e技术的首次实现的时候,CR9-CR15和DR8-DR15都没有实现,对它们的访问将引起无效代码异常(#UD)。

4.新的指令

下面的新指令在带有64位扩展的64位模式下被引入。

SWAPGS 指令

SYSCALL and SYSRET 指令

CDQE 指令

CMPSQ 指令

CMPXCHG16B 指令

LODSQ 指令

MOVSQ 指令

MOVZX(64-bits) 指令

STOSQ 指令

5.堆栈指针

在64位模式,堆栈指针为64位。堆栈大小不是像兼容模式或传统模式中那样靠SS段描述符中的某位来控制,也不通过指令前缀来指示。

对隐式堆栈引用将忽略地址大小的指示。除远分支以外,所有隐式引用RSP的指令在64位模式下缺省为64位操作数。影响到的指令包括:PUSH, POP, PUSHF, POPF, ENTER, 和LEAVE。使用这些指令在64位模式下将不可能产生32位堆栈值的压栈和退栈。如果使用66H操作数前缀,将支持16位的压栈和退栈。

当寄存器RAX-RSP被用作操作数的时候,64位模式缺省的操作尺寸无需REX前缀作为这些指令的先导。如果式R8-R15作为操作数,则REX依然是需要的。这是因为前缀在访问新扩展寄存器中是需要的。

6.分支转移

64位扩展技术扩充2个分支机制来适应64位线性地址空间的分支。他们是:

64位模式下近分支转移被重新定义

在64位模式和兼容模式下,64位调用门描述符定义成远调用

64位模式下,所有近分支转移(CALL, RET, JCC, JCXZ, JMP 和 LOOP)被强迫为64位。这些指令被更新为提供64位的RIP值而无需REX前缀。下面的近转移被有效的操作数宽度所控制:

指令指针的宽度的截断

由于CALL或RET引起的退栈压栈或退栈的大小

由于CALL或RET而引起的堆栈指针增加或减少的大小

间接转移操作数大小

在64位模式下,以上的所有操作都被强制为64位而不管操作数前缀(操作数大小的前缀被忽略)。然而相对转移的位移区域依然受到32位的限制;近转移的地址大小没有被强制为64位。

地址大小影响到JCXZ和LOOP中RCX的大小;他们也影响到内存间接转移的地址计算。这样的地址缺省是64位,但是他们可以通过地址宽度前缀转换到32位宽度。

软件会用远转移来改变优先级。传统IA-32结构提供调用门机制来允许软件去从一个优先级转到另一个优先级,尽管调用门也可以不改变优先级而只是做转移。当调用门使用的时候,直接或间接的选择器指针会指向一个门描述符(指令重的便宜被忽略)目的代码段的偏移可以从调用门描述符中获得。IA-32e模式重新定义了32位调用门描述符的类型值,使其成为64位调用门描述符,并扩展64位描述符使其能够容纳64位的偏移。64位模式调用门描述符允许远转移访问有效的线性地址空间的任何地方。这些调用门也控制代码段选择器(CS),允许转换到特权级和缺省尺寸并作为门转换的结果。

因为通常情况下是指定32位的,唯一在64位模式下指定完全64位绝对RIP的是间接分支转移,由于这个原因,直接远分支转移被从64位模式的指令集中删除了。

IA-32e模式扩充了SYSENTER和SYSEXIT指令的语义,以便他们操作在64位存储空间。IA-32e也引入了两个新的指令:SYSCALL和SYSRET,他们只在64位模式有效。 1.64位模式下的地址计算

在64位模式(如果没有地址大小的转变),有效地址计算的大小是64位的。一个有效地址计算使用一个64位的基和索引寄存器以及符号扩展变换成64位。

对于64位模式下平面地址空间,线性地址等同于有效地址。在使用FS和GS段的非0为基的事务中,这个规则不被使用。在64位模式下,有效地址成分被加进来,并且有效地址在加64位基地址之前被缩短。地址映射模式在64位模式时,基地址从不会被缩短。

在IA-32e模式下,指令指针被扩展到64位来支持64位代码偏移。64位指令指针在调用中将值赋给RIP。下表描述了RIP、EIP和IP之间的不同。

通常,替换和直接在64位模式下不被扩展到64位。他们在有效地址计算中依然被限制在32位和符号扩展。然而,在64位模式提供了MOV指令的64位替换和直接形式的支持。

所有的在IA-32e模式下的16位和32位地址计算用0扩展来形成64位地址。地址计算搜现是缩短到当前模式的有效地址宽度,就像地址宽度前缀的指定那样。其结果是用0扩展得到完全的64位地址宽度。因为这个,16位和32位应用程序运行在兼容模式只能存取64位模式有效地址的低4GB。同样,在64位模式产生一个32位地址只能访问64位模式有效地址的低4GB。

2.规范的寻址

一个规范形式的地址有地址位63直到更有效的实现位,宏结构设置其为全1或全0。

IA-32e模式定义一个64位的线性地址,但实现的时候支持的位数要少些。第一个具有64位扩展技术的IA-32e结构的处理器将支持48位线性地址。这意味着规范的地址必须将位63到位48全填0或全填1,填0还是填1要看位47是0还是1。

尽管实现并不用先行地址的全部64位,他们需要检查位63知道更有效的实现位来看是否地址是规范形式。如果一个线性存储引用不是规范形式,该实现将会产生一个异常。在很多情况下,会产生一个一般保护异常(#GP)。然而,在显示或隐式对战应用的情况下,会产生一个堆栈错(#SS)。隐式堆栈引用指令包括PUSH/POP指令和使用RSP/RBP寄存器来作为缺省堆栈段寄存器的指令。在这些情况下,一个规范错误式#SF,如果一个指令使用RSP/RBP作为基寄存器并且有段超越给出一个非SS段,将引起一个一般保护错误(#GP)的规范错误。隐式堆栈引用包括所有PUSH/POP类型指令和任何使用RSP或RBP作为一个基寄存器。规范地址形式的检查将在特权检查之后页面和边界检查之前完成。