X86平台的中断和异常

英特尔的官方文档如下定义x86平台下的中断和异常:

中断:

  • 可屏弊中断(Maskable Interrupts)

            所有由I/O设备发出的IRQ(Interupt Requests)都是可屏弊中断。可屏弊中断可以有两个状态:屏弊和未屏弊。屏弊状态的中断会被中断控制硬件忽略。

  • 不可屏弊中断(Nonmaskable Interrupts)

           只有一些关键的事件(如硬件失败)会发出不可屏弊中断。不可屏弊中断总是可以被CPU识别到。

 

异常:

  • 处理器可侦测异常(Processor-detected Exceptions)

           CPU执行指令时侦测到不正常的状态(anomalous condition)时产生这个异常。这种异常又根据存在内核栈上的EIP寄存器的值被划分为三组。

  • 错误(Faults)

           发生错误时,一般情况下可以被纠正。纠正以后,程序继续运行,不会损失连续性。保存下的EIP寄存器的值就是产生这个错误的指令,当异常处理句柄(exception handler)结束后,程序从这条指令继续运行。

  • 陷入(Traps)

          当被中止的指令无需重新执行时就产生陷入,这点与错误(Faults)不同。陷入主要被用来实现调试器。

  • 中止(Aborts)

           严重出错。控制硬件出现故障,此时不可能把造成异常的指令精确地址存入EIP寄存器。Aborts被用来报告严重的出错,比如硬件出错或者无效的,不一致的系统表结构。由控制硬件单元发出的中断信号被用来把控制权转交给中止异常句柄(Abort Exception Handler)。句柄通常只有强制结束造成Abort的程序。

  • 可编程异常(Programmed Exceptions)

          这是由程序员发出的。程序员可以用int 或者int 3指令发出可编程异常。Into(检查溢出)bound(检查数组越界)指令也可以用来发出可编程异常。可编程异常常常被称之为软中断(software interrupts)。这种异常通常用来实现系统调用,还被用来在调试器中报告事件。(into和bound指令在IA64体系中已经被废弃了,见另一篇博文:C语言和它的安全性)

copyright ykyi.net

中山大学离散数学考试试题

《离散数学》期末试题(A卷)

ykyi.net

(考试形式:闭卷  考试时间:2小时)

《中山大学授予学士学位工作细则》第六条

考试作弊不授予学士学位

方向:                       姓名:                   学号:            

出卷:                      复核:            

1. (10 points)  A, B and C are sets, prove or disprove the following statements.

(1). if A – B = A – C, then B = C

(2). if A ´ B = A ´ C, A ¹ Æ, then B = C

2. (10 points)  Write each of the following statements in terms of propositional variables, predicates, quantifiers and logical connectives. You can choose any propositional variables and predicates freely.

(1). If I like the course or the teacher, I will attend the class. (statement and its negation)

(2). For all students of our school, someone studies hard and has good score, someone studies hard and does not have good score.

Note: The first question is expressed in propositional logic, the second is expressed in predicate logic.

3. (15 points) Let A={a,b,c,d,e}, a relation R on A is {(a,b), (b,b), (b,c), (b,d), (c,d), (d,d), (d,e), (e,d)}.

(1) Give the digraph and matrix of relation R;

(2) Compute R2, reflexive closure r(R) and symmetric closure s(R).

4. (15 points) Let SÎZ+ and A=S×S. Define the following relation R on A:

(a,b) R (a′,b′) if and only if ab′=a′b

(1) Show that R is an equivalent relation;

(2) Let S={1,2,3,4,5,6,7,8,9}, compute the equivalent class [(2,4)].

5. (10 points) Let function f(x, y)=( x+3y, 2x+y), (x, y)ÎR×R, prove that f is bijection.

6. (15 points) Let A={2, 4, 5, 6, 8, 10, 12, 20, 120}, R is the relation of divisibility on A.

(1) Draw the Hasse diagram of the poset <A, R>;

(2) Find all the minimal elements, the maximal elements, the least element and the greatest element of the poset <A, R> if they exist;

(3) Let B = {2, 4, 6}, find the upper bound, the lower bound, the least upper bound and the greatest lower bound of B if they exist.

 

7. (15 points) Use the labeling algorithm (Ford-Fulkerson’s) to find a maximum flow for the following transport network in Fig. 1. Use of figures is required to show the variety of flows during the procedure.

 

labeling algorithm (Ford-Fulkerson’s) to find a maximum flow for the following transport network

 

 

8. (10 points) Use Kruskal’s algorithm to find a minimal spanning tree of graph in Fig. 2. The sequence of edges-selecting is ordered to be shown up.

Use Kruskal’s algorithm to find a minimal spanning tree of graph.

ykyi.net

什么是MediaWiki的Gadget(小部件)

 

译自MediaWiki的官网,URL: http://www.mediawiki.org/wiki/Extension:Gadgets

Gadget简介:

MediaWiki,为用户提供了一种方法,使用户方便使用其它用户基于Javascript或者CSS创建的小部件Gadget.

 

Gadget是由Javascript或者CSS代码片断组成的,被放置在MediaWiki名字空间里(对于MediaWiki的名字空间的概念请参看其它文章)。每一个Gadget都在MediaWiki:Gadgets-definition中占用一行,用来定义这个gadget。定义包括这个Gadget的名字,和描述以及组成这个Gadget的Javascript和CSS代码。

 

因为Gadget被放置在MediaWiki名字空间里,只有系统管理员可以编辑Gadget。这很容易理解:只有充分被信任的用户才可以编辑被其它更多用户使用的Javascript代码。Javascript代码是把双刃剑,如果被用来做坏事,会很容易被用来实现劫持账号或者监视用户的功能。

 

下载Gadget:

从https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Gadgets.git;a=tree 可以下载到Gadget,或者也可以用git工具clone一份gadget,如下:

git clone https://gerrit.wikimedia.org/r/p/mediawiki/extensions/Gadgets.git

 

如何安装:

把Gadget目录复制到你安装MediaWiki的扩展目录(Extensions Folder)。然后在localSetting.php文件中,接近文件末尾的地方加上一行:

require_once( "$IP/extensions/Gadgets/Gadgets.php" );

 

使用Gadget:

可以使用的Gadget定义在MediaWiki:Gadgets-definion。只要有一个有效的Gadget在MediaWiki:Gadgets-define被定义,就能在每个用户的Special:Preference的Gadgets节选择是否启用这个Gadget(小部件)。在Special:Gadgets也能浏览Gadgets的列表,并有链接指向各自的系统消息(System Message),以方便编辑。

 

定义Gadget的格式:

在MediaWiki:Gadgets-definition中的每个Gadget的定义都以一个或者多个"*"开始,必须符合下面的格式定义。

 * Gadget的名字 [ 选项(可以忽略) ] | 页名字

 (* gadget_name [options (can be omitted)] | page names)

第一个域,Gadget的名字指的是gadget的内部名字。这隐含了一个系统消息的引用(System Message)。此例中,如果你定义了内部名为 my_gadget_name 这样一个gadget,则在MediaWiki:Gadget-my_gadget_name有一个使用wiki语法的关于这个gadget的简短描述。

 

注意,gadget的内部命令规则:必须以字母起头,后面可以接26个字母的大小写或者数字,以及连字符“-”,下划线“_”,冒号“:”,点号“.”。

 

选项的格式:

[option1 | option2 | … optionN]

空格将被忽略。每一个选项可以包括一个选项名,或者选项名还能被赋值,这些值以逗号隔开。如: option = value1, value2, value3

 

举一些Gadget定义的例子:

 * mygadget|mygadget.js|mygadget.css

or

 * mygadget[ResourceLoader]|mygadget.js|mygadget.css

or

* mygadget[rights=foo,bar]|mygadget.js|mygadget.css

or

* mygadget[ ResourceLoader | rights=foo, bar ] | mygadget.js | mygadget.css

 

选项的说明:

选项名

参数

描述

ResourceLoader

None

注明Gadget与ResourceLoader兼容。

dependencies

用逗号分隔开的ResourceLoader模块名

这里有默认依赖的模块列表.如果当前的gadget没有与ResourceLoader兼容的资源,这个选项将失效。

rights

用逗号分隔开的权限名

权限名列表在这里 privileges.

skins

用逗号分隔开的皮肤名

皮肤名列表在这里 skins.

default

注明对每个用户,包括匿名用名默认启用的gadget。不过注册用户仍然可以在它们的使用偏好设定中禁用gadget.

你可以为你的gadget指定额外的依赖,如:

* mygadget[ResourceLoader|dependencies=jquery.ui, jquery.effects.clip]|mygadget.js|mygadget.css

 

此例中,我们请求RescourceLoader与mygadget一起加载jquery.ui和jquery.effects.clip模块。注意只有在ResourceLoader中注册中的模块可以被设置成依赖项。

 

下面是设定gadget只对有某些权限的用户生效:

* ImprovedDeletion [rights=delete] | ImprovedDeletion.js 

此例中,我们设定gadget只有对有权限删除页面的用户有效。注意权限指点是这里的 permissions, 而不是像 administrators 一样的用户组。下面再给出一些例子:

modrollback[ResourceLoader|rights=rollback]|modrollback.js

UTCLiveClock[ResourceLoader|rights=purge]|UTCLiveClock.js

Ajax_sysop[ResourceLoader|rights=patrol,rollback,markbotedits,delete]|Ajax_sysop.js

 

ResourceLoader:

所有的gadget的css总是通过ResourceLoader被加载的。但是,一些老旧的javascript写法经常与ResourceLoader不兼容,所以每一个gadget必须被显式地注明兼容性才能被ResourceLoader加载。

否则,会使用旧式的写法 <script src="/w/index.php?title=MediaWiki:Gadget-gadget_name.js&action=raw"> 。

 

页面:

Gadget的定义行后面部分提定了组成gadget的Javascript或者css代码的文件,这些代码文件被放置在系统消息中(System Message)。所以的文件都必须以.js或者.css为扩展名。每个gadget都可以使用任意多个系统消息。一些共用的功能可以被多个Gadget使用。如下:

 * frobinator|commonStuff.js|frob.js|frob.css|pretty.css

 * l33t|commonStuff.js|tools.js|l33t.js

 

节(Sections):

定义在MediaWiki:Gadgets-definition中的gadget列表可以被分成多个节。每个节用两个或者多个"="号起头和结尾,“=”中间指定节的名字。如:

 == interface-gadgets ==

这样就定义了一个节(Section),标题在 MediaWiki:Gadget-section-interface-gadgets 页面中定义。

copyright ykyi.net

 

 

显卡信息检测利器,GPU Caps Viewer介绍

怎么知道我的显示是不是支持OpenCL?GPU Caps Viewer可以告诉你答案。

 
GPU Caps Viewer是一款让监控你的显卡工作情况的好工具。
 
比如,如果你是一个骨灰级游戏玩家,或一个WEB开发者,需要一款图形显示卡方面的应用软件,那么GPU Caps Viewer是你的最佳选择。
 
GPU Caps Viewer的操作界面非常直观。你可以方便地查看你的GPU的各种信息,包括:光影核心(Shader Core),BIOS,设备ID号,次设备ID号,GPU的温度,当前和最大时钟,GPU的负载,显卡的驱动程序,OpenGL, OpenCL,CUDA,PhySX,并且支持多GPU。
 
你还可以启动一个OpenGL或者OpenCL的演示程序,查看OpenGL的版本号和它的扩展链表,CUDA设备的数目,核心数据 — 如名字,计算力,光影时钟,多处理器,变形和网格尺寸(warp and grid size)等等。
 
还可以查看更多的内容。你可以查看到显卡的OpenCL信息,如版本号,CL设备的数目,CL设备的类型,计算单元,时钟,驱动程序,全局和局部内存,2D和3D图象的尺寸,工作项目的尺寸(work item size),常量缓冲区,最大采样器,扩展,工作组的尺寸,等等。
 
另外,还能查看到系统信息。如CPU的名字,CPU的型号,CPU的核心,使用了什么操作系统,内存的信息,显示模式等等。界面上有各种链接导向相应的网页以供查看更详细的信息。界面上的大部分信息可以被导出到txt或者xml文件。
 
需要注意的是,GPU Caps Viewer运行时使用非常多的系统资源,而且软件作者也没有提供一个帮助文档。面对满界面的专业术语,GPU Caps Viewer软件的定位应该是高级用户。该软件可以在各大下载论坛下载到。
 
本文一开始的问题“如何知道显卡是否支持OpenCL”则可以在OpenCL标签项中得到答案。如果显示卡不支持OpenCL,则不会有关于这块显卡OpenCL方面的信息,当然也不能运行OpenCL的演示程序(Demo)。
 
copyright ykyi.net

 

 

ThreadX简介

 

ThreadX是由在美国加利费尼亚州,圣地亚戈的Express Logic有限责任公司开发并注册商标。它是一个实时操作系统,类似于VxWorks, Nucleus RTOS, OSE, QNX, LynxOS这些实时操作系统。ThreadX的作者是William Lamie,它是Express Logic有限公司的董事长兼CEO。
 
为什么ThreadX取这样一个名字呢?ThreadX的这个名字缘于线程(Thread)是被操作系统调度的单位,字母X就表示切换线程。ThreadX可以被看成是SystemC的QThreads的抢先式实现。
 
与大多数实时操作系统一样,ThreadX的内核是多任务抢先式内核,支持快速响应中断,内存管理,线程通讯,互斥,事件,线程同步等特性。
 
ThreadX的一些独有的特性有:优先级继承,抢先阀值,高效定时器,pico内核设计,事件链,高速软定时器,以及精致的内核尺寸。ThreadX是开源发布的,并且使用ThreadX不需要任何授权费用。
 
ThreadX常常被使用在实时嵌入式操作系统中,特别是嵌入程度很大的嵌入式系统(Deeply embedded system)。ThreadX的开发通常都在运行Linux或者windows操作系统的机器上用交叉编译环境开发。交叉编译工具可以生成在目标平台上运行的二进制代码。已经有很多可以用来开发ThreadX的开发工具,比如:Wind River Workbench, ARM RealView, Green Hills Software's MULTI, Metrowerks CodeWarrior, IAR C-SPY,Lauterbach TRACE32, 和visionCLICK
 
最近,Hewlett-Packard已经被授权可以使用ThreadX开发喷墨打印机,激光打印机,一体化设备。早些时候,开发多功能激光打印机使用lynxOS操作系统,目前仍然有很多打印机设备设用lynOS。如今,ThreadX已经被广泛使用在很多消费电子设备,医疗设备,datanetworking applications,还有SoC的开发。

红帽的云计算机解决方案

 

Red Hat Cloud
未来的云计算一定是开放的
 
对于一个公司负责IT的领导层来讲,选择一个正确的云计算机架构是一件极为重要的战略决策。这将影响到你的企业在这个十年的竞争力和灵活性。所以,务必谨慎选择。
 
如果这个事做正确了,云计算将帮助你从过去的简单控制资源的配额过渡到真正的革命性变化。但是,只有一个开放的云计算解决方案可以做到。
 
只有红帽提供了一个真正的开放云计算解决方案
 
红帽作为开源软件业的引领者,为你提供了构建一个开放去计算解决方案所需要的一切。拥抱全面开放的云计算吧,你的企业才真正认识到什么是云。
 
 
1. 让数据在云之间自由迁移。
2. 全面利用已有的IT投资和基础设施。
3. 跨越物理服务器,多种虚拟化平台,以及运行着各种各样不同技术栈的公共云。
4. 使企业平滑过渡到云时代,在每一个步骤都能获得持续的收益。
5. 你对选用什么技术有真正的话语权。
 
更多的选择:
 
红帽拥用最有活力的生态系统,一大批认证的云计算提供商,硬件提供商,Paas(Platform-as-a-service)中间件的提供商。毫无疑问,红帽是能够给你提供最多最自由选择的云计算平台。
 
红帽的开放云让IT公司或者企业的IT部门在经济上容易承受,并使用开放的应用程序编程接口(API),充许用户自由的迁移到其它的云,使你能够控制和领导你的IT愿景(Let you control and lead your IT vision).
We can strengthen your open cloud by drawing on more than a decade of experience and technology powering mission-critical infrastructures and applications for the world's most demanding organizations—including top public clouds. All while providing the Red Hat service levels and control our customers expect.
 
 

flexcoin全世界第一家Bitcoin銀行

Bitcoin是互聯網上一種虛擬貨幣,欲知更多自己搜索下,已經有很多文章介紹了。

 
Flexcoin.com是網路上第一家基於於Bitcoin的銀行。Flexcoin使你可以在全世界所以可以連接到互聯網的地方使用Bitcoin。
 
如果你把Bitcoin存到flexcoin.com,你就有了一個賬戶可以轉出以及收款。另外,如果在每月月底你的賬戶中有正數值的余額的話,flexcoin還會給你一部分利息。
 
換言之,就如同真實世界中的銀行一樣,只是這裏使用的是Bitcoin,而不是任何政府發行的貨幣。
 
Flexcon是整個Bitcoin體系中一個非常重要的部分。我們的技術使我們可以為用戶做到通過用戶名快速轉賬到一個用戶名下,而不是一串奇怪的數字標志的用戶名。如下:
Before Flexcoin: 1555hjPG7pRwTHVMfukPvjXexQMHFE3qu6 
After Flexcoin: coffeeshop
 
Flexcoin解決了Bitcoin貨幣體系中一個很大的問題。
 
Flexcoin出現前,當別人給你發來Bitcoin,你只有從你初次接收它的設備上操作它。你不能夠,至少不能輕易地通過你的手持設備或者其他什麼設備使用它。一般地講,只有在你初化接收和發送Bitcoin的機器上才能操作Bitcoin。通過使用Flexcoin,你甚至可以把Bitcoin發送到一個電郵地址。Flexcoin的設計使即使不怎麼懂技術的用戶也能夠使用。
 
Flexcoin做的工作看起來很簡單,他提供了一個集中的處理你所有Bitcoin財產的地方。Flexcoin就是全世界第一家Bitcoin銀行。你可以通過任何可以使用Web的設備用一個賬號來管理所以屬於你的Bitcoin。
 
這樣就使你可以在各種場合各個時間段也能夠發送和接收Bitcoin。只要你有一臺可以用Web方式登錄到Flexcon.com的設備。
 
Flexcoin也是整個Bitcoin界的安全引領者。比如,Flexcoin是第一個實現了在電郵件絕不放置URL的機構。從Flexcoin發出的電郵絕對不會有鏈接或者圖象。如果你收到一封違反剛才聲明的電郵,那一定是欺詐郵件。
 
Bitcoin的官方網站是 www.bitcoin.com
 
copyright ykyi.net

MediaWiki入门教程

 

MediaWiki是这个世界上使用人数最多的百科建站系统。全球最著名的Wikipedia.com就是用MediaWiki建立的。另外,MediaWiki是在GPL协议下免费开源工程,这意味着你可以免费使用它。下面将介绍如何使用MediaWiki.
 

如何安装MediaWiki?

从官网下载到MediaWiki的安装包,解压到服务器的根目录下面。然后用你的域名访问网站,就会提示你一步一步安装了。注意最后一个步骤会生成一个LocalSettings.php文件,你需要把这个文件上传到网站的根目录。如果没有把生成的LocalSettings.php放到根目录,下次输入域名访问网站会提示找不到LocalSettings.php。其实整个安装都超级简单!
 

怎么使MediaWiki只能够被私人使用?

在安装阶段有这个选项配置MediaWiki会被如何使用。如果错过了,可以删除根目录下的LocalSettings.php,再输入域名访问网站重新生成LocalSetting.php。这样有点麻烦,也可以直接编辑LocalSettings。比如:
# 禁止未登录用户编辑内容.
$wgGroupPermissions[‘*’][‘edit’] = false;
# 禁止用户注册,除非系统管理员创建用户。
$wgGroupPermissions[‘*’][‘createaccount’] = false;
 

怎么创建一个页面?

在这个例子中,我们会教你创建一个页面。页面的内容就是'如何创建一个页面'。
在网站的右上角上点击:登录。 然后用你的管理员账号登录。
在MediaWiki中创建一个页面的方法有点特殊。首先,你在搜索框中输入你将要编辑的词条名字,然后点击搜索。如果词条不存在的话,就会显示一个页面告诉你没有这个词条。在这个页面上会有一个选项提示你创建这个词条。点击“创建词条”。
输入以下内容:
 
 == Create a page ==
* 把词条输入搜索框,然后搜索。
* 搜索结果显示没有匹配到任何页面,这时有一个选项让你创建一个页面。
* MediaWiki标志语言(MediaKiki Markup Language也常被称为:wikitext)可以在 http://www.mediawiki.org/wiki/Markup_spec 找到。
* 各种编辑页面的例子可以在 http://meta.wikimedia.org/wiki/Help:Editing and http://meta.wikimedia.org/wiki/Help:Wikitext_examples 找到。
点击"预览"按钮,可以看到页面的预览效果。点击"保存页面",则这个页面被编辑完成了。
 

怎么改名一个页面?

有时候你想要把一个页面改名。MediaWiki处理改名的逻辑实际上是把这个页面使用新的名字移动到一个新的位置,MediaWiki会记住旧的名字,还会建立一个到新页面的引用。
在页面的上部找到"移动"标签页,点击!
填好新的页面名字,点击"移动页面"按钮。
系统会让你确认一次,然后改名就完成了。
 

怎么改变MediaWiki的Logo呢?

常常有人问如何把网站左上方的网站Logo换掉。
首先你创建一个宽135象素,长135-150象素的logo图象文件。把logo上传到服务器某个位置。默认是放在/skins/common/images/wiki.png。
编辑LocalSetting.php文件,修改 $wgLogo变量。
刷新页面,现在你可以看到新的Logo了。
 

怎么在页面中建立内部链接(Internal Links)?

不像标准的HTML语法,在编辑MediaWiki的页面时建立指向内部页面的链接是非常容易的。比如你要建立一个到词条名为“我爱香港”的内部链接,则在编辑页面时在词条名前加井号。
如: #我爱香港
MediaWiki的内部链接的颜色有两种,一种是红色,一种是绿色。当内部链接的颜色是红色时,表示还没有收录这个词条,如果你点击的话,会提示你建立新词条。如果是绿色,则相反。
 

如何改变MediaWiki的导航菜单?

比如我想要把我的wiki站点上所有的category都列在导航条上,那我就需要修改导航条。
在搜索框中输入: Mediawiki:Sidebar。搜索结果会给出导航条的页面。
选择“编辑”。
增加一行以**起头,|符号前面的字符表示导航项将要显示的名字,|后表示页面的名字。
最后选择保存页面,完成!
copyright ykyi.net
 

It’s a mistake to include Xen in a Linux distro

As the title show, it's a mistake to include Xen in a linux distro. Why?

Somebody would argue that Xen is a very useful technology. Xen does the virtualization work very well and many projects are using Xen which prove Xen is so great.

I'm not mean Xen is not good. However, just because Xen is a hypervisor that is based on another microkernel that is not Linux kernel itself. Linux distros that ship Xen today actually are running an entirely different Operating System kernel that most users even don't notice that. Xen should be a separate, purpose-built kernel, so it should never be a part of the Linux kernel. Isn't it strange that you think you are running a linux OS, but this 'linux' has a kernel that is not linux, which is another kernel. You take away the Linux kernel, how could you say the OS is Linux.

Just before the born of the Linux native virtualization KVM, the distros shipped Xen because there exist no other choices. Many Linux developers at that time know little about virtualization. Xen seemed a pretty easy and pretty good choise. So the Linux community made the hasty decision to ship Xen instend of investing in makeing Linux's own hypervisor. But now KVM has come for more than five years(since kernel 2.6.20 in Feb, 2007. KVM actually has a longer history. It was out there before being merged into mainline kernel code.) and KVM has proven itself to be completent to replace Xen. The most important thing is that KVM as a part of the linux kernel leverages the features of kernel like memory management, process scheduling and so on, making the kernel a perfect hypervisor. So, there is no reasons to ship Xen in Linux distros any more.

COPYRIGHT WWW.DOGEYE.NET

什麼是敏感指令

1974年,Popek和Goldberg在美國电脑協會的通訊期刊上發表了一篇論文"虛擬化第三代架構的一般性要求"(Formal Requirements for Virtualizable Third Generation Architectures)。在這篇文章中,提出了敏感指令的概念。

敏感指令(Sensitive Instructions)的定義: 敏感指令是這樣一組指令,這些指令的行為取決於指令執行時處理器的工作模式,以及指令在記憶體中的位置。

——-

對敏感指令的處理是虛擬化技術的一個關鍵點。在用戶態執行的敏感指令如果總會造成陷入(always generates a trap),這樣的敏感指令也屬於特權 指令。在不使用Wmware提出的動態二進制翻譯機制的情況下,除非所有的敏感指令都是特權指令,虛擬機管理程式才能保證正確運行。換言之,如果某種處理器架構的所有的敏感指令都是特權指令的一個子集,我們就可以說這種處理器架構是可虛擬化的。在這種情況下,我們就可以肜經典的“陷入後模擬“(trap-and-emulate)的方法實現虛擬化。按照這個定義,在嵌入式工業中最常見的ARM架構則不是可虛擬化的,因為ARM的敏感指令有些是特權指令,有些則不是。

原文 from the paper "KVM for ARM" by Christoffer Dall and Jason Nieh, Columbia University:Popek and Goldberg define sensitive instructions as the group of instructions where the effect of their execution depends on the mode of the processor or the location of the instruction in physical memory. A sensitive instruction is also privileged if it always generates a trap, when executed in user mode. The VMM can only guarantee correct execution without the use of dynamic translation if all sensitive instructions are also privileged. In other words, an architecture is virtualizable if and only if the set of sensitive instrucctions is a subset of the seet of privileged instructions. If that is the case, the VMM can be implemented using a classic trap-and-emulate solution. Unfortunately, ARM is not virtualizable as the architecture defines both sensitive privileged instructions and sensitive non-privileged instructions.

ykyi.net 翻译