当前位置:文档之家› QNX笔记

QNX笔记

https://www.doczj.com/doc/5b6573786.html,/content/080301/11/38907_1083565.html

QNX系统下PXI多功能数据采集卡驱动程序开发

基于QNX的实时电源控制系统的设计


1.QNX只有6.0以上版本才是微内核的,4.2不是。

2.QNX来自于卡内基梅隆大学开发的MASH微内核结构。

3.工业应用中两个首选的实时操作系统是QNX和VXworks

4.IEEE发表过“便携式操作系统界面(Portable Operation System Interface of
Unix)POSIX,QNX与它相兼容。简单的说,因为以前的UNIX只定义了基本输入输出操作,硬件
管理等功能。其它的网络,文件管理,图形界面都是需要用户自己定义的。所以后来许多厂
家出来了各种版
本的UNIX。这样造成开发出来的应用程序,无法方便的移植。POSIX实际上是一组编程语法
的标准。使用这个语法开发应用程序,就能很好的移植到各种兼容POSIX标准的操作系统上
。这个好处是操作
系统开发商,只要遵循POSIX标准,可以任意的更改操作系统的语法,而不用跟高级开发语
言生产商打招呼。而高级语言生产商只要遵循POSIX标准,也可以任意的升级它自己的产品
。所以POSIX是一个
桥,一头是各种操作系统生产商,另一头是应用程序开发语言生产商,它把它们联系起来。
所以说POSIX是提供源代码级的应用程序接口。

5.微内核与宏内核。内核的意思就是操作系统的内部核心程序。操作系统分为外部管理程序
和内核程序。外部管理程序主要功能是管理用户进程和外部设备。内核程序在内存里占一个
单独空间。

宏内核就是,文件管理,中断管理,内存管理,网络协议等功能模块都放到一个内核里。各
个功能模块之间通过函数调用实现。

微内核模块,就是只有中断管理,内存管理放到内核里作为微内核。它与文件管理,网络协
议之间通过消息机制实现通信。

6.在linux上用的GCC,Gmake等应用软件开发平台都移植到了QNX上,所以linux上开发的源
程序,在QNX上编译后,也能在QNX上很好的运行。
同时在QNX也有类似与VC++的开发软件:Photon Application
Builder(PHAB),能很方便的开发QNX下的图形界面程序。

7.QNX也支持JAVA





1.1 QNX 实时操作系统介绍
QNX 实时操作系统(QNX Real Time Operating
System)是由位于加拿大渥太华的QNX软件系统公司开发的一个针对嵌入式应用的微内核操作
系统。QNX软件系统公司成立于1981年,在过去的20多年中一直致力于微内核实时操作系统
的研究与开发。目
前的QNX
实时操作系统已经发展成一个可以使用在严实时应用中的高可靠性实时操作系统,能够运行
在x86/Pentium, PowerPC, ARM, StrongARM, XScale, MIPS,
SH-4等一系列硬件平台上,是在关键任务应用中首选的两个实时操作系

统之一(另外一个是V
xWorks)。

QNX 是一个与电气工程师协会(Institute of Electrical and Electronics
Engineers,IEEE)发表的便携式操作系统界面标准(Portable Operating System
Interface, POSIX)
相兼容的实时操作系统。该操作系统提供了一系列可裁剪的功能全面的高可靠性高性能组件
,包括分布式计算,资源管理,网络应用,图形窗口系统,文件系统,以及对Java的支持等
等。此外,QNX还
是一个与Linux高度兼容的操作系统,由于gcc和gmake等Linux
平台上常用的应用程序开发工具已经被移植到QNX
平台上,很多为Linux平台编写的应用程序可以直接拿到QNX平台上编译运行。此外,QNX还
提供了一个类似于Visual C++的应用程序集成开发环境,称为Photon Applicatioin Buider
(PHAB)。在这个集成开发环境里程序开发人员能够很方便的开发和调试基于图形用户界面的
QNX 应用程序。

更为重要的是,对于应用程序开发人员来说,QNX是一个完全免费的实时操作系统。根据QNX
软件系统公司发布的使用授权协议,在一个产品商业化之前应用程序开发人员可以自由的使
用QNX实时操作系
统系统而无须向QNX
公司交付任何软件使用费用。同样,QNX的应用程序集成开发环境PHAB对于软件开发人员来
说也是免费的。QNX
实时操作系统以及QNX应用程序集成开发环境均可以从QNX公司的主页https://www.doczj.com/doc/5b6573786.html,下载。


1.2 QNX 实时操作系统对Java语言的支持

QNX
Neutrino使用IBM公司开发的业界领先的J9虚拟机为Java应用程序以及小应用程序提供了支
持。目前可供选择的方案有两个,一个是与J2ME标准完全兼容的WebSphere嵌入式环境,另
外一个是WebSphere
客户环境,提供了一个可裁剪的Java 2语言标准的子集。由于QNX
是一个多任务操作系统,因此可以同时运行多个虚拟机为不同的应用程序提供服务。基于微
内核的microGUI窗口界面系统为AWT提供了全面的支持,在其它平台上开发的基于AWT的图形
用户界面可以不
加修改的在QNX平台上运行。此外,QNX还通过使用本地线程保证了正确的线程调度。

IBM公司开发的J9虚拟机通过了Modena JT++以及Plum Hall JVS
等一系列严格的业界测试,是一个与J2ME标准完全兼容Java虚拟机。由于J9是一个专门为实
时的嵌入是应用开发的虚拟机,因此在其设计中对速度优化,内存管理,线程管理,本地方
法,垃圾回收,
及时编译,可移植性以及可裁剪性能方面做了很大的努力。根据多个公开发表的测试结果,
J9虚拟机是目前运行速度最快的嵌入式Java虚拟机。对本地方法的支持,使得应用程序开发
人员能够直接控
制外围设备,调用实时操作系统的功能。J9虚拟机本身对内存的要求极少,用户

更可以通过
一个配置工具使得应用程序在特定的嵌入式系统中对内存的要求降低到最小。就象一般的Ja
va应用程序一样
,内存的分配和回收都是通过虚拟机来自动管理的,因此在一般情况下不会产生内存泄露。
此外,J9虚拟机还提供了一个垃圾回收机制管理工具,使得用户能够在运行时刻控制和改变
所使用的垃圾回
收机制。在线程管理方面,J9虚拟机直接使用底层实时操作系统所提供的线程调度机制,从
而保证了正确的代码能够在正确的时间被执行。高度可裁剪的类库使得用户能够将应用程序
所不需要的类和
方法排除在嵌入式系统之外,从而进一步节省了对系统存储空间的要求,也间接地提高了嵌
入式应用程序的执行速度。目前版本的J9虚拟机支持大多数流行的嵌入式软硬件平台,包括
运行在x86,
MIPS, PowerPC, SH-4, 68K, SPARC平台上的Windows, Linux, QNX, Solaris, AIX, Pocket
PC, Palm OS等操作系统。由于J9虚拟机卓越不群的表现,它被Java
Pro杂志评选为2002年度最佳嵌入式Java平台。同时,使用J9作为Java平台的WebSphere
Studio Device Developer (也就是以前的Visual Age for Java Micro Edition) 也被Java
Pro杂志评选为2002年度最佳嵌入式开发工具,又被Java
World杂志评选为最佳Java设备应用程序开发工具。

值得一提的是,QNX 软件系统公司是Eclipse
Consortium的发起者和最早的成员之一。Eclipse 是由IBM
公司牵头开发的开放源代码的Java应用程序开发平台,其目的是为应用程序开发人员提供一
套完备的高度可裁剪的高性能软件开发组件。Eclipse
Consortium成立于2001年11月,目前已经拥有Borland, IBM, QNX, Red Hat, SuSE,
Sybase, Rational等18个成员。由Eclipse Consortium
发布的Java应用程序集成开发环境Eclipse是完全免费的,可以运行在Windows, Red Hat
Linux, SuSE Linux, Solaris,
QNX和AIX等操作系统上。也就是说,在QNX平台上也是可以使用集成开发环境Eclipse来开发
Java应用程序的。


1.3 QNX 实时操作系统以及集成开发环境的安装和配置

QNX实时操作系统的安装非常简单。首先你需要从QNX公司的网站下载最新版本的QNX
操作系统,下载的地址是https://www.doczj.com/doc/5b6573786.html,/nc/download.qnx。目前最新的版本是QNX
6.2,下载文件是qnxnc620.iso,这是一个CD-ROM映像文件。将这个映象文件里面的内容刻
录到一张光盘上,然后利用该光盘启动计算机即可开始安装QNX
操作系统。总的来说安装的过程相当的简单,只需要选择启动方式以及指定QNX
文件系统所在的位置即可。系统文件拷贝完成后将自动的重新启动机器,然后需要用root登
录进入系统并且自动安装其它应用程序。在一台500 MHz + 128
MB的计算机上,安装过程通常都小于15

分钟,相对来说还是非常快的。系统安装完成后,即
可直接使用PHAB以及gcc等程序开发工具, 但是要使用Java还需要进行一点小小的配置。

J9虚拟机的缺省安装位置是/usr/eclipse/ive。在这个目录下有bin和lib两个子目录,bin
目录包含了J9虚拟机的可执行文件和所需要的库文件,lib目录则包含了各种版本的Java类
库。未来在QNX
系统上使用J9虚拟机,我们需要将合适的目录包括在PATH和LD_LIBRARY_PATH
这两个环境变量中。我们需要修改用户家目录(~)下面的.profile文件,使之包含如下语句


export J9_HOME=/usr/eclipse/ive
export PATH=$PATH:$J9_HOME/bin:.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$J9_HOME/bin


应用程序集成开发环境Eclipse SDK for QNX可以从Eclipse
Consortium的主页下载,下载地址是https://www.doczj.com/doc/5b6573786.html,/downloads/。将所下载的zip
文件拷贝到/usr目录中,然后使用unzip命令解压缩。然后你还需要下载针对
J9虚拟机的插件,下载地址是https://www.doczj.com/doc/5b6573786.html,/viewcvs/index.cgi/
%7Echeckout%7E/jdt-debug-home/plugins/https://www.doczj.com/doc/5b6573786.html,unching.j9/
index.html。你需要根据你所下载的Eclipse SDK for
QNX的版本好选择一个合适的插件,然后将下载的zip文件解压缩到/usr/eclipse/plugins目
录中。同样,我们需要修改用户家目录(~)下面的.profile文件从而将Eclipse
所需要的路径和库路径包含在环境变量PATH和LD_LIBRARY_PATH中。

export ECLIPSE_HOME=/usr/eclipse
export ECLIPSE_PLUGIN=/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86
export PATH=$PATH:$ECLIPSE_HOME
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ECLIPSE_PLUGIN


到此为止我们以及成功的安装与配置了QNX
实时操作系统以及相关的Java应用程序开发工具。下面我们简单的介绍几个常用的命令:

j9c -- 类似于Java SDK中的javac命令,是用来编译Java源代码的。
j9 -- 类似于Java SDK中的java命令,是用来运行Java应用程序的。
eclipse -- 这个命令启动Eclipse for QNX应用程序集成开发环境。



1.4 一个简单的Hello World程序

在没有开始写Hello World之前,我们首先介绍一下QNX
上的文本编辑器。很多熟悉类UNIX操作系统的朋友也许会对vi比较熟悉,但是从Windows操
作系统过来的朋友也许不太喜欢。我们这里使用的是QNX
操作系统自带的图形化编辑软件ped。

利用下面命令启动ped:

#ped &

下面是HelloWorld.java的源代码:


public class HelloWorld
{
public static void main(String args[])
{
System.out.println("Hello World!");
}
}



使用j9c命令编译Java源代码:

#j9c HelloWorld.java

使用j9命令运行Java应用程序:

#j9 HelloWorld

需要注意的是,QNX
操作系统和Java语言都是大小写敏感的

,所以一定要把大小写都写对了。另外,对源代码进
行编译的时候需要加上文件扩展名,在运行一个Java应用程序的时候则不需要加上文件扩展
名。如果排除了
这几种错误之后你仍然无法正确的编译或者是运行你的Hello World程序,请参考
1.3正确配置你的PATH和LD_LIBRARY_PATH。

2.1 J9C 编译器的使用
j9c是J9虚拟机自带的字节码编译器,相当于标准版Java开发工具中的javac命令。这个编译
器的用法如下:

#j9c <编译选项> <源代码文件 | 目录名>

在j9c编译器中主要的编译选项如下:

-help
打印于编译有关的帮助信息
-version
显示编译器的版本号
-classpath
指定编译时刻使用的类路径
-d
指定存放字节码文件的目录名,如果没有指定目标目录名,编译器将不生成包目录结构
-nowarn
隐藏编译器的警告信息
-warn
设定编译器的警告水平
-g
设定是否生成调试代码



2.2 J9虚拟机的使用

和标准版Java开发工具相类似,可以使用j9命令启动J9虚拟机。这个命令的用法如下:

#j9 <运行选项> 主类名称 [运行参数]
#j9 <运行选项> -jxe:jxe文件 [运行参数]


J9虚拟机中主要的运行选项如下:

-jxe
运行所指定的jxe文件
-jxespace
为jxe文件指定所使用的内存(十六进制)
-jxeaddr
从内存中直接运行一个jxe格式的应用程序
-cp
将path指定为运行时刻所使用的类路径
-D
在运行之前设定系统的环境变量
-debug
在指定的端口启动JDWP调试服务器
-jcl
指定所使用的JCL动态连接库
-verbose
详细输出相关的调试信息其中class和gc是缺省的选项



2.3 J9虚拟机上的标准类库

嵌入式应用程序和普通应用程序的最大的区别在于嵌入式应用程序处处要受到目标平台的处
理速度,内存大小以及存储空间的限制,而基于PC
的应用程序所受的限制则相对要小很多。基于以上考虑,所选择的虚拟机必须在能够满足系
统要求的情况下尽可能的少占用系统存储空间,经过编译的字节码文件必须尽可能的以提高
执行效率。因此
,在嵌入是应用程序的开发中,虚拟机的裁剪是提高系统整体性能的至关重要的一个环节。

基于如上需求,J9虚拟机专门为不同的应用提供了不同的标准类库。这些标准类库均提供了
运行Java应用程序所必须的基本类,例如Java语言中最基本的https://www.doczj.com/doc/5b6573786.html,ng.Object和https://www.doczj.com/doc/5b6573786.html,n
g.String等等。
一个完全版的 J9虚拟机通常包括如下标准类库:

jclXtr
这是一个极小型的类库,大约90 KB,
当你的存储空间和内存极度紧张并且你能够容忍功能局限的情况下可以考虑这一个类库(QNX
的缺省安装里面没有)。这个类库提供了如下Java
2标准类库的一个子集:java.io, https://www.doczj.com/doc/5b6573786.html,ng, https://www.doczj.com/doc/5b6573786.html,, java.util。



jclCldc
这是J9虚拟机向资源极度紧张的目标平台所推荐的最小配置,大约166
KB。在jclXtr类库中仅提供了最基本的 IO功能,在jclCldc
类库中则大幅度的增加了对IO以及网络应用的支持,例如http, ftp,
comm, datagram, file, serversocket,
socket等。这个基本类库所在的位置是$J9_HOME/lib/jclCldc

jclCore
这是一个为微小型设备设计的一个轻量级的基本类库,它提供了基本的文件IO以及对网络应
用的支持,大约占用空间346
KB,是J9虚拟机为资源不太紧张的目标平台所推荐使用的核心类库(所以叫做jclCore
)。这个类库包括了Java 2中如下包里面的大部:java.io, https://www.doczj.com/doc/5b6573786.html,ng, https://www.doczj.com/doc/5b6573786.html,,
java.util,
java.util.zip。在QNX 的缺省安装中不包括jclCore基本类库。

jclGateway
这个基本类库是在jclCore基本类库的基础上构建的,大约600
KB,主要的改进是提供了安全检查的功能。这个类库除了jclCore
基本类库所包含的内容之外还提供了如下包和类:完整的https://www.doczj.com/doc/5b6573786.html,ng.reflect包;
https://www.doczj.com/doc/5b6573786.html,.URL包,但是不包括URLClassLoader包;
https://www.doczj.com/doc/5b6573786.html,ng.SecurityManager包,但是不包括java.security.acl包;提供https://www.doczj.com/doc/5b6573786.html,ng.Runtim
e.exec()方法。在QNX 的缺省安装中不包括jclGate基本类库。

jclMax
这是一个专门为资源比较宽裕的目标平台所设计的基本类库,大约2732
KB。这个基本类库里面包括了Java 2 里面的大多数包和类,包括https://www.doczj.com/doc/5b6573786.html,ng,
https://www.doczj.com/doc/5b6573786.html,ng.ref, https://www.doczj.com/doc/5b6573786.html,ng.reflect, java.io,
https://www.doczj.com/doc/5b6573786.html,, java.math, java.txt, java.util, java.util.jar,
java.util.zip。此外,jclMax基本类库还基于如下包提供了Java
2风格的安全检查功能,包括: java.security,
java.security.interfaces, java.security.acl, java.security.spec,
java.security.cert,
com.ibm.oti.security.provider。这个基本类库所在的位置是$J9_HOME/lib/jclMax

jclPersonal
这个类库提供了AWT, RMI以及对Java Bean的支持。QNX
的缺省安装中不安装这个类库,但是可以从IBM
的主页上面下载。另外,如果你已经在QNX上面安装了Eclipse的话,你也可以使用SWT来构
建你的图形界面。这些内容将会在本系列文章的后面讲述。

不包括在QNX 缺省安装中的J9标准类库可以从IBM 公司开发的Webshpere Studio Device
Developer 中获得。Webshpere Studio Device Developer是基于Eclipse项目的针对嵌入式
Java应用的一个集成开发环境,可以从IBM 公司的主页免费下载,下载地址是
https://www.doczj.com/doc/5b6573786.html,/software/ad/embedded。


2.4 一个从串口设备采集数据的简单程序

数据采集与处理是当前嵌入式应用的一个热点。在这种应用中,嵌入式系统与各种各样各样
的传感器或者是数据采集器等外接设备进行通讯,在其内部对各种数据进行处理并向外接设
备输出反馈信号
。到目前为止,串口通讯(主要是RS-232和RS-485)仍然

是传感器与主机进行通讯的主流方式
,因此在一个嵌入式应用程序中,经常需要通过串口与串口设备进行通讯。

在标准版的Java语言中,串口通讯是通过扩展类库https://www.doczj.com/doc/5b6573786.html,m来实现的。由于这个扩展类库
在标准的JDK
中并不提供,需要使用到串口通讯功能的软件开发人员必须到IBM或者是Sun公司的网站去下
载,在一定程度上影响了这个扩展类库的普及和使用。J9虚拟机在设计上充分考虑到了嵌入
式应用的需求,
在各个版本的标准类库中都提供了对串口通讯的支持。这些功能被放在serial.jar这个包里
面,可以在如下目录下找到:

$J9_HOME/lib/jclCdc/serial.jar
$J9_HOME/lib/jclFoundation/serial.jar


在QNX
系统上,J9虚拟机缺省的类路径(CLASSPATH)是jclMax标准类库,也就是$J9_HOME/lib/jclM
ax/classes.zip。也就是说,如果在程序中需要用到串口通讯的时候,我们需要将serial.j
ar添加到虚拟机
的类路径里面去。在QNX系统上设置类路径的方法于Linux系统比较相似,只需要修改
.profile文件把新的CLASSPATH定义好就可以了。

# export CLASSPATH=$J9_HOME/lib/jclCdc/serial.jar

J9虚拟机缺省的类路径,也就是$J9_HOME/lib/jclMax/classes.zip 不需要显式的定义。

serial.jar里面包含了很多用于与串口设备进行通讯的类,需要详细了解的网友可以自行参
考相关的文档。一般来说,于串口设备进行通讯需要经过如下步骤:

(1)
创建一个SerialConfiguration对象,然后根据特定设备的通讯参数修改一下波特率等值。
(2)
创建一个SerialPort对象,在创建这个对象的时候需要使用到串口的名称以及刚才创建好的
SerialConfiguration。
(3) 利用SerialPort类的getInputStream()
和getOutputStream()方法获得串口设备的输入输出流,通过该设备的输入输出流即可与该
设备进行通讯。
(4)
当不再使用这个串口设备的时候,利用SerialPort.close()关闭与该设备的连接,同时释放
所占用的系统资源。

在QNX
系统下,设备名被保存在/dev目录下,串口设备被起名为ser(n),其中n是该串口设备的编
号,从1
开始计数。例如/dev/ser1相当于晕倒死系统上的COM1,/dev/ser2相当于晕倒死系统上的CO
M2。因此,虽然J9
虚拟机在各个平台上都提供了对串口进行操作的包serial.jar,但是程序员仍然需要考虑到
在不同的平台上设备名是不一样的。

下面的示范程序演示了与串口进行通讯的一般过程。该程序与连接在ser1
的设备进行通讯,将该设备的输出信息打印到屏幕上。


import java.io.*;
import com.ibm.ive.serial.*;
public class SerialDemo
{
public static void main(String[] args)
{
// 构造SerialPortConfigurati

on对象并且配置通讯参数
SerialPortConfiguration SPC = new SerialPortConfiguration();
SPC.baudRate = 19200;
SPC.dataBits = 8;
SPC.stopBits = 1;
SPC.parity = 0;
try
{
// 构造SerialPort对象,构造成功以后系统已经与指定的设
// 备连接上了
SerialPort SP = new SerialPort("/dev/ser1", SPC);
// 获得设备的输出并读取数据
InputStream DevIn = SP.getInputStream();
for (int i = 0; i < 10000; i++)
System.out.println(DevIn.read());
// 关闭与串口设备的连接
SP.close();
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}



对上面这个示范程序进行编译的时候,由于程序中使用了jclMax标准类库之外的类,所以需
要在编译的时候指定类路径,也就是:

# j9c -classpath $CLASSPATH SerialDemo.java

在运行这个示范程序的时候,不需要再次显式的指定类路径,因为j9命令会自己到系统的CL
ASSPATH里面去找:

# j9 SerialDemo

需要说明的是,在J9虚拟机中同样提供了对扩展类库https://www.doczj.com/doc/5b6573786.html,m的支持。但是基于
J9虚拟机的嵌入式Java应用中,普遍的做法是直接使用J9虚拟机本身的serial.jar。

3.1 AWT类库的安装和配置
对嵌入式Java比较熟悉的朋友一定知道目前大多数的嵌入式虚拟机都提供了对AWT
的支持。例如Sun公司开发的Personal
Java,Insignia公司开发的Jeode,Nsicom公司开发的CrEme,还有PERC公司开发的Perc,当
然还包括我们正在介绍的IBM J9。就我个人所了解的情况,Nsicom公司开发的CrEme
是目前唯一的一个支持Swing
的嵌入式Java虚拟机。关于为什么在嵌入式Java中普遍使用AWT而不使用Swing的问题,我们
会在这一章的第三节进行讨论。

根据我们在2.3 节中的介绍,J9虚拟机在jclPersonal
标准类库中提供了对AWT的支持,但是在QNX的缺省安装中并不包括这个类库。因此,我们需
要从J9虚拟机的新家WebSphere Studio Device
Developer (也就是原先叫做Visual Age for Java Micro Edition的)中获得这个类库。

首先我们必须从IBM 的网站下载WebSphere Studio Device
Developer,下载的地址是https://www.doczj.com/doc/5b6573786.html,/software/ad/embedded/。这是IBM公司基于
Eclipse开发的嵌入式Java集成开发环境,如果你以前用过Visual Age for
Java或者是Eclipse的其它版本的话,想来应该很容易的就能够上手。WSDD有两个版本,一
个是给Windows平台的,另外一个是给Linux平台的。但是在这个标准版的WSDD中既不包括QN
X平台的运行环境
,也不包括我们所需要的jclPersonal 类库,所以我们还要下载WSDD的Software
Updates。QNX

平台的运行环境在Runtime Software Updates中,jclPersonal库在Custom
Environment Software
Updates中,所以这两个update我们都要下载。

首先安装WSDD,将下载来的Software
Updates解压到一个临时目录下,然后启动WSDD。从主菜单选取Help -> Device Developer
Updates。点击Add或者是Update
All,在随后跳出来的对话框里面选Local Predefined
Locations。在最下面的Location一栏里面填上你所需要安装的Update,格式为file:/$dir
,例如:

file:/c:/temp/wsddupdates/wsdd/4.0/runtimes/
file:/c:/temp/wsddupdates/wsdd/4.0/wce/

安装结束以后在下面这个目录找到QNX 的jclPersonal类库prsnlqnx.jar:

wsdd/wsdd4.0/ive/runtimes/qnx/common/ive/lib/jclMax/

如果你的QNX
和Windows或者是Linux主机是两台独立的计算机的话,你可以通过网络或者是其它的可移动
存储设备将prsnlqnx.jar拷贝到你的 QNX 系统上。如果你的QNX
和晕倒死或者是利怒死主机是安装的同一台计算机的不同硬盘或者是同一块硬盘的不同分区
上的话,你可以启动QNX
进入文件管理器,然后进入/fs目录看看里面是不是能够看见其它的硬盘或者是分区。如果
没有看到你所需要的硬盘或者是分区,你可以使用mount命令启用相对应的硬盘或者是分区
,使得你可以从QNX
系统下对这些硬盘或者是分区上面的文件进行操作。

将prsnlqnx.jar文件放到/usr/eclipse/ive/lib目录下,然后修改类路径,最好是在~/.pro
file文件里面改:

export CLASSPATH=$CLASSPATH:/usr/eclipse/ive/lib/prsnlqnx.jar

到目前为止,我们已经完成了AWT类库的安装和配置。

3.2 一个简单的AWT图形用户界面

AWT是Java语言中构建图形用户界面的标准。由于Java语言卓越的跨平台特性,在一个平台
上编写的基于AWT的图形用户界面可以不加修改的直接移植到另外一个平台上使用。通常来
说,构建一个基于A
WT的图形用户界面需要经过如下步骤:

(1) 创建一个顶级容器对象,例如Window或者是Frame。
(2) 在顶级容器对象上面创建用户所需要的控件。
(3) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(4) 打开主窗口。

下面是一个简单的基于AWT的图形用户界面:


import java.awt.*;
import java.awt.event.*;
public class HelloAwt extends Frame
{
public HelloAwt()
{
Label label = new Label("Hello AWT!");
add(Label);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}
public static void main(String[] args)
{
HelloAwt hello = new HelloAwt();

hello.setTitle("I Love Java!");
hello.pack();
hello.setVisible(true);
}
}



使用下面的命令编译以上例程:

#j9c -classpath $CLASSPATH HelloAwt.java

使用下面的命令运行以上例程:

#j9 HelloAwt

在Sun 公司撰写的Java入门教程The Java Tutorial中有专门的一章介绍了基于AWT
的图形用户界面。但是由于目前Swing已经正式成为标准版Java2
中构建图形用户界面的标准,这一章的内容被Sun
公司从The Java Tutorial网站上撤下,但是各位读者仍然可以从Sun
公司的网站下载这部分的教程:

https://www.doczj.com/doc/5b6573786.html,/docs/books/tutorial/information/download.html#OLDui

3.3 关于AWT和Swing的一点讨论

在第一节中我们提到了目前大多数的嵌入式Java虚拟机都提供了对AWT
的支持但是不提供对Swing 的支持。但是,在标准版的Java平台上Swing
才是推荐使用的图形界面系统,在Sun
公司所提供的Java Tutorial 中甚至把基于AWT
的图形用户界面设计这一部份从其网站中删除,需要利用到AWT
进行图形用户界面设计的用户只有将该部份下载到本地硬盘才能够使用这部份教程。在标准
版Java中正值春风得意的Swing 为什么到了嵌入式应用中便不再吃香了呢?

AWT 是Abstract Window ToolKit
(抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT
中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers
。 也就是说,当我们利用 AWT
来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作
系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能
不存在。为了实
现Java语言所宣称的"一次编译,到处运行"的概念,AWT
不得不通过牺牲功能来实现其平台无关性,也就是说,AWT
所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT
是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。

Swing是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT
所能够提供的所有功能,并且用纯粹的Java代码对AWT
的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持,
Swing 利用了AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing
控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使
用。由于在Swing
中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。

说到这里我想各位读者应该明白了AWT和Swing之间的基本区别:AWT

是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT
的Java程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常
有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高
效的AWT
当然成了嵌入式Java的第一选择。而在普通的基于PC或者是工作站的标准Java应用中,硬件
资源对应用程序所造成的限制往往不是项目中的关键因素,所以在标准版的Java中则提倡使
用Swing,
也就是通过牺牲速度来实现应用程序的功能。

4.1 SWT类库的安装和配置
Eclipse 项目的发布在IT界可以说是一次震撼,这不仅仅是因为IBM
公司无偿公开了花费4000万美元开发出来的一整套代码,也不仅仅是因为支持这个项目的包
括目前在市场上相当吃香的Rational,
Borland, Red Hat以及QNX等公司。最让人吃惊的是:Eclipse
项目的矛头直接针对的是IBM公司最亲密无间的Java合作夥伴 --
Sun公司。就象Eclipse这个名字所意味的那样,IBM
的目的是要建立一套各种程序设计语言都能够使用的模块化的开发平台,并且希望它能够成
为一个业界公认的标准平台。

Eclipse项目中最令人震撼的一点是它用称为SWT的的图形库和工具包取代了Java标准中的AW
T和Swing。根据Eclipse项目的解释,SWT直接调用了操作系统的图形库,从而使得Java应用
程序的Look &
Feel
与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SW
T
的Java应用程序的运行速度。关于SWT与AWT/Swing的优点和缺点我们将在这一章的第三节中
进行比较和讨论。

为了在我们的Java应用程序中使用SWT,我们需要做一点必要的配置,如下:

(1) /usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar
是Eclipse平台的运行库,需要将它放到类路径里面。
(2) /usr/eclipse/plugins/org.eclipse.ui/workbench.jar是Eclipse
平台的图形界面库,需要把它放到类路径里面。
(3) /usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar里面是SWT
的基本类库,需要将它放在类路径里面。
(4) /usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86 这个目录下面存放的是SWT
与本地方法的接口,需要放在LD_LIBRARY_PATH里面。

修改.profile文件,如下:

export
CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar
export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.ui/workbench.jar
export
CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86


改动过这些设置以后,最简单的办法是重新启动Photon来让这些新的设置生效。

4.2 一个简单的SWT图形用户界面



通常来说,构建一个基于SWT 的图形用户界面需要经过如下步骤:

(1) 创建一个Display对象,该对象代表一个SWT 进程(session)。
(2)
创建一个或者是多个Shell对象,一个Shell对象相当于我们在AWT/Sing里面所说的顶极容器
,也就是应用程序的主窗口。
(3) 在Shell对象上面创建用户所需要的控件。
(4) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(5) 打开主窗口。
(6) 启动事件处理循环,一直到用户结束程序的运行。
(7) 垃圾回收。


下面是一个简单的基于SWT 的Java应用程序HelloSwt:


import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
public class HelloSwt
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello SWT!");
label.setBounds(shell.getClientArea());
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}



使用下面的命令编译以上例程:

#j9c -classpath $CLASSPATH HelloSwt.java

使用下面的命令运行以上例程:

#j9 HelloSwt

我们可以看到,基于SWT的图形用户界面在外观上和基于AWT的图形用户界面有明显的不同。
更为重要的是,能够明显的感受到HelloSwt的启动速度比HelloAwt要快很多。 QNX
高效的微内核图形界面系统当然是提高用户应用程序运行速度的一个方面,但是更重要的是
SWT 直接调用了QNX 的微内核图形界面系统的功能,而AWT
则没有利用到操作系统所提供的这些优势。

SWT 是一套与AWT/Swing 完全不同的图形界面系统,新接触SWT
的程序员还是需要花费一段时间来熟悉SWT的结构和API。下面推荐的几个参考资料能够让你
轻松的开始利用SWT
进行图形用户界面设计:

The Programmer's Guide for Eclipse, 这是Eclipse项目发布的官方程序员手册,其PDF
版可以从这个地址下载:

https://www.doczj.com/doc/5b6573786.html,/documentation/pdf/org.eclipse.platform.doc.isv.pdf

这份文档也可以从这个网站联机查看:

https://www.doczj.com/doc/5b6573786.html,/downloads/documentation/2.0/html/plugins/org.eclipse
.platform.doc.isv/

另外,https://www.doczj.com/doc/5b6573786.html,最近在其网站上发布了关于SWT的结构及其应用的一系列文章,也非
常的有参考价值。如果有感兴趣的网友,请自行到 Eclipse 的网站查看。

4.3 关于SWT和AWT/Swing的一点讨论

通过3.3 的讨论我们知道在AWT 中的图形用户界面是通过本地方法来实现的,

每个AWT
方法都有一个与其对应的本地方法,称为peer。由于平台无关性的需要,AWT
所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。通过这种机制,在所
有的平台上相同的AWT 控件的Java代码是一样的,其性能也是类似的。SWT
所采取的则是一种完全相反的方法,它是通过一些本地方法将操作系统的图形库完全的暴露
给虚拟机。在这些本地方法的基础上,SWT
通过纯粹的Java代码实现了需要的图形界面功能。由于各个操作系统所提供的图形库是不一
样的,同样一个控件在不同平台上的Java实现通常来说是不一样的。基于同样的道理,同样
的SWT
程序在不同平台上的性能和表现也许是不一样的。

SWT 所采取的这种方法决定了它在技术上要比AWT 要具有更多的优点,如下:

(1) 如果操作系统A 支持某种图形控件而操作系统B 不支持,AWT
就会出于平台无关性的要求拒绝提供这个控件。SWT 则会在操作系统A
上原封不动的调用操作系统所提供的控件,在操作系统B
上则使用该操作系统所提供的其它功能对该控件进行模拟。例如Windows平台本身就提供了
树和表格等控件而其它一些操作系统不提供这些控件,SWT
在Widnows平台上就会直接调用Windows的方法来实现这些控件,AWT
为了实现平台无关性拒绝提供这些控件,Swing 则为了实现纯Java的目的在AWT
的基础上自己来画这些控件 --
尽管它画出来的东西很少有画得好的。

(2) 由于SWT 大量的采用了本地平台所提供的图形库,SWT
中的控件风格跟本地平台的UI风格是完全一致的,因为在SWT
中的控件基本上就是操作系统本身的控件。这一点对于AWT
来说是比较相似的,但是Swing 的表现就不太一样了,譬如说在Windows XP上面用Swing
画一颗树它看起来就跟Widnows 2000上面的树一模一样,尽管Windows XP跟Widnows
2000本身的树形控件是不一样的。

(3) 在SWT中,大部份的事物逻辑都是用Java写的,在SWT
中C/C++代码的比重远比AWT中C/C++代码比重要小。这样使得程序设计人员能够更加方便的
对SWT
应用程序进行调试,也能够更清楚的知道在后台运行的本地方法究竟在做什么事情。更为重
要的是,SWT利用比AWT 更少的C/C++ 代码实现了比AWT
更快的图形用户界面,这个优势在嵌入式应用中往往是决定性的。

SWT 的缺点主要在于两点:(1) 不是Java语言标准;和(2)
支持的平台太少。目前版本的Eclipse仅仅支持Windows 98/ME/2000/XP, RH 7.1, SuSE
7.l, Solaris 8, QNX,
AIX和HP-UX几个有限的平台。而作为Java 语言标准的AWT/Swing
则在目前大部份的主流和非主流操作系统上都有支持。










思考微内核Tag:向上走
版权声明:转

载时请以超链接形式标明文章原始出处和作者信息及本声明
https://www.doczj.com/doc/5b6573786.html,/logs/1335184.html



关于微内核,我最早印象来自于操作系统。Andrew Tanebaum同Linus
Torvalds的那场著名论战将微内核这个名词深深的印入了我的脑海,不过说实话,在很长一
段时间内,我只是记住了这个词而已,一直没有弄清楚微内核究竟是怎样一回事。再次听说
微内核是在工作
以后,不过是在一个完全不同于操作系统的领域中,很多人都在说自己开发的系统是微内核
的。同样,我也只是记住了名词,但是脑中却产生了一些困惑:究竟什么才是微内核,它们
所说的微内核同
操作系统中的微内核有什么关系。深入Spring为我打开了微内核的大门,因为微内核也存在
于Spring之中。

在那场关于OS的著名论战中,Tanebaum老先生为我们解释了微内核以及与之对应的宏内核,
他认为对于宏内核来说,整个操作系统就是一个整体,包括了进程管理、内存管理、文件系
统等等,而对微
内核来说,操作系统的大部分在内核之外,彼此间通过消息进行通信。换句话说,对于微内
核来说,进程管理、内存管理、文件系统根本就不是微内核的一部分,这是一个看起来难以
让人接受的结论
,怎么能把操作系统内核的重要组成部分踢出去呢?请注意,我这里说的是,它们不是微内
核的一部分,而不是说它们不是操作系统内核的一部分。有些让人糊涂,怎么又冒出一个内
核。本着高内聚
的原则,操作系统的实现让我们只需面对操作系统内核,而无需了解其内部实现。对于微内
核的实现来说,其内部还会有一个内核,负责更加底层的内容,比如消息传递、中断管理、
底层的进程管理
等等,而我们作为用户所面对的内核不过是在这个内核之上构建起来的一个应用罢了。

其实,所谓的内核不过是在我们通常意义上的内核之中,还有一个更为基础的内核而已,在
这一点上,操作系统和普通应用没有任何分别。比如作为普通的用户来说,我们通常会把应
用服务器视作一
个内核,而某些应用服务器在其内部有一个用来构建应用服务器的基础,比如JBoss前几个
版本使用的JMX,这便是它的微内核,它为我们提供的各种各样的服务都是基于这个内核构
建起来的。既然是
作为基础,微内核的设计通常都具备良好的可扩展性,只有这样,我们才能够让我们的“内
核”不断的发展壮大。JBoss已经为我们做了一个很好的演示,源源不断的新内容让我们可
以享受更好的服务。

前面说过,Spring为我打开了微内核的大门,那么Spring的微内核在哪里呢?这便是DI容器
。我们已经

知道了,Spring已经不只是一个单纯的DI容器,还提供了许多其它的功能,比如
AOP。如果我们只
是简单的学会使用它们,那可就让一个很好的学习机会从身边溜走了。研究Spring的微内核
,FactoryBean便是无论如何不可错过的,它是DI容器为我们参与容器组件组装过程中而提
供的接口。有了它
,我们就可以定制自己的组件组装过程,这样我们就有了机会对一个普通的JavaBean做手脚
,就像使用Spring
AOP中常用的ProxyFactoryBean所做的一样。FactoryBean让DI容器具备了可扩展性,这样,
我们就不必把所有功能都做到Spring的DI容器中中去,而是作为一个FactoryBean对DI容器
的功能进行扩展,
对我们来说,因为大多数功能都是由Spring提供的,因此我们把它们视作了Spring“内核”
的一部分,殊不知,其中还有一个叫做DI的微内核。除了Spring自身之外,现在已经有一些
项目开始利用这个
特性扩展Spring,比如,Acegi Security和Spring
Modules。关于FactoryBean更多的细节,Spring参考文档是一个不错的去处。

有一些功能性的工作,我们即可以放到“微内核”中,也可以作为“微内核”的外挂存在像
AOP功能,在Spring中,AOP是以外挂的形式存在,而在Hivemind中,它则被做到了内核之中


这让我想起了《C++沉思录》上的经典论断,“库设计就是语言设计,语言设计就是库设计
”。同样的同步功能,在Java中就是语言特征,而在C/C++中往往是以库的形式存在。在这
里,语言就是我们的
微内核,库就是微内核的外挂,而对普通的语言用户而言,这些东西都是我们可以直接拿过
来用的,都属于我们的内核。按照这种说法,程序设计语言也是某种意义上的微内核,只不
过,我们大多数
时间内会直接同这个“微内核”打交道。

有一些微内核通过内部实现降低接口的复杂度,让用户使用起来简单了许多,同时也减少了
用户无意而为的错误,这方面最好的例子就是现在已经让人习以为常的Garbage
Collection,因为许多程序设计语言已经把它做到了语言特征,我们便无需忧虑内存管理了
。既然微内核提供给接口给内核使用,我们当然也可以直接使用这些功能,比如,我们为JB
oss添加自己的服
务,比如我们使用FactoryBean扩展自己的功能,甚至为微内核的操作系统添加新的服务。
只不过在大多数情况下,我们面对的是内核而已,其实,我们在使用程序设计语言时,早已
熟悉了直接面对微
内核。

这便是我所理解的微内核。






正则式表达https://www.doczj.com/doc/5b6573786.html,/sunsee/blog/item/384d75e717f5292ab93820ad.html

发现qnx很好玩诶
发现qnx很好玩诶


因公研究了一下QNX,发现这东西很好

玩诶。在一台联想的PC机上装了QNX Neutrino (QNX
6.2),居然主板、显卡(TNT32)和网卡(Realtek)都能自动识别并安装driver,几乎不
需要作什么配置。界面是Windows(它叫Photon)的,没有Linux那么花哨,但看着很舒服。它
也有terminal可以
输入命令行,命令都是POSIX兼容的(就是和Linux基本一致)。缺省安装会装上gcc(商业
软件还有WatCOM C for QNX)。

值得注意的几点:
1. QNX是实时操作系统,不太清楚它在X86上怎么做到实时的,也许和RTX for
NT一样的道理。
2. QNX是微内核系统(源于Mach),然而和Microsoft
NT系列不同的是,它的内核精简到了极点,只包含消息机制/线程调度/基本的硬件抽象;驱
动程序是在应用程序级别运行的。我为这个设计鼓掌叫好,好处多多妙不可言。对应的,系
统提供了一些常
用服务,例如mmap_device_memory(), pci_attach(), pci_find_device(),
InterruptAttach()
来访问硬件,很方便,概念清晰程度比WDM强得太多,而且因为这些函数名都和Linux的象,
所以把驱动程序的源代码从Linux移植过来很方便。而且这个系统的SDK帮助是做在系统帮助
里面的,看起来
是一个面向开发者的操作系统,呵呵。
3. 注意:QNX
6.0以上版本(Neutrino系列)才是微内核结构的,QNX4.2可不是。这个发现很让我想笑,
因为Mancintosh OS X也是和OS
9内核不一样,也是从原来的(我不知道也不想去知道了)内核切到了微内核。在这两个阵
地上,好像Tanenbaum占了Linus的上风(参见他们的论战http://www.dina.dk/~abraham/Li
nus_vs_Tanenbaum
.html
在里面Tanenbaum认为象Linux这样的monolithic系统是历史的倒退,microkernel的才符合
时代潮流)。
5. Drawback: 有太多网站是IE
dependent的,用它的自带浏览器看一些论坛会有问题。但多国语言支持是已经内嵌的。
4.
是不是只有工业界才有人用这个系统啊?我在slashdot上都看不到QNX的话题分类(http://s
https://www.doczj.com/doc/5b6573786.html,/topics.shtml),好像QNX也没有做一个卡通标志物或者badge,
这个是鼓舞人气的重要手段之一哦。



计算机启动过程详解
我把这篇文章背了一遍。:-(

计算机启动过程详解
责编: 滴滴
作者: 网友
日期: 2003-09-26

--------------------------------------------------------------------------------

编者按:
打开电源启动机器几乎是电脑爱好者每天必做的事情,面对屏幕上出现的一幅幅启动画面,
我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢?相
信有的朋友还不
是很清楚,本文就来介绍一下从打开电源到出现Windows的蓝天白云时,计算机到底都干了
些什么事情。

-----------------------------------------------------------------------------

---
>

来自:蓝色理想

打开电源启动机器几乎是电脑爱好者每天必做的事情,面对屏幕上出现的一幅幅启动画面,
我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢?相
信有的朋友还不
是很清楚,本文就来介绍一下从打开电源到出现Windows的蓝天白云时,计算机到底都干了
些什么事情。

首先让我们来了解一些基本概念。第一个是大家非常熟悉的BIOS(基本输入输出系统),BI
OS是直接与硬件打交道的底层代码,它为操作系统提供了控制硬件设备的基本功能。BIOS包
括有系统BIOS(
即常说的主板BIOS)、显卡BIOS和其它设备(例如IDE控制器、SCSI卡或网卡等)的BIOS,
其中系统BIOS是本文要讨论的主角,因为计算机的启动过程正是在它的控制下进行的。BIOS
一般被存放在ROM(
只读存储芯片)之中,即使在关机或掉电以后,这些代码也不会消失。

第二个基本概念是内存的地址,我们的机器中一般安装有32MB、64MB或128MB内存,这些内
存的每一个字节都被赋予了一个地址,以便CPU访问内存。32MB的地址范围用十六进制数表
示就是0~1FFFFFFH
,其中0~FFFFFH的低端1MB内存非常特殊,因为最初的8086处理器能够访问的内存最大只有
1MB,这1MB的低端640KB被称为基本内存,而A0000H~BFFFFH要保留给显示卡的显存使用,C
0000H~FFFFFH则
被保留给BIOS使用,其中系统BIOS一般占用了最后的64KB或更多一点的空间,显卡BIOS一般
在C0000H~C7FFFH处,IDE控制器的BIOS在C8000H~CBFFFH处。

好了,下面我们就来仔细看看计算机的启动过程吧。

第一步:
当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上
的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态
,但CPU在此刻不
会马上执行指令。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只
是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启
机器,那么松开
该按钮时芯片组就会撤去RESET信号),CPU马上就从地址FFFF0H处开始执行指令,从前面的
介绍可知,这个地址实际上在系统BIOS的地址范围内,无论是Award BIOS还是AMI
BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。

第二步: 系统BIOS的启动代码首先要做的事情就是进行POST(Power-On Self
Test,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作
,例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初始化,如果
系统BIOS在

进行P
OST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K
常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错
误的类型。在正常
情况下,POST过程进行得非常快,我们几乎无法感觉到它的存在,POST结束之后就会调用其
它代码来进行更完整的硬件检测。

第三步:
接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的起始地址通常设
在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来
初始化显卡,此时
多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过
这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用
这些BIOS内部的
初始化代码来初始化相关的设备。

第四步:
查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BI
OS的类型、序列号和版本号等内容。



第五步:
接着系统BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,并同时在屏幕
上显示内存测试的进度,我们可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的
测试方式。

第六步:
内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-
ROM、串口、并口、软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动
检测和设置内存的
定时参数、硬盘参数和访问模式等。

第七步:
标准设备检测完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的
即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信
息,同时为该设
备分配中断、DMA通道和I/O端口等资源。

第八步:
到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显
示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和
一些相关工作参
数。

第九步: 接下来系统BIOS将更新ESCD(Extended System Configuration
Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段
,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数
据只在系统硬件配
置发生改变后才会更新,所以不是每次启动机器时我们都能够看到“Update ESCD…
Success”这样的信息,不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows
9x不相同的数据格式,于

是Windows
9x在它自己的启动过程中会把ESCD数据修改成自己的格式,但在下一次启动机器时,即使硬
件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来,如此循环,将会导致在每次
启动机器时,系
统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因


第十步:
ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺
序从软盘、硬盘或光驱启动。以从C盘启动为例,系统BIOS将读取并执行硬盘上的主引导记
录,主引导记录接
着从分区表中找到第一个活动分区,然后读取并执行这个活动分区的分区引导记录,而分区
引导记录将负责读取并执行IO.SYS,这是DOS和Windows 9x最基本的系统文件。Windows
9x的IO.SYS首先要初始化一些重要的系统数据,然后就显示出我们熟悉的蓝天白云,在这幅
画面之下,Windows将继续进行DOS部分和GUI(图形用户界面)部分的引导和初始化工作。

如果系统之中安装有引导多种操作系统的工具软件,通常主引导记录将被替换成该软件的引
导代码,这些代码将允许用户选择一种操作系统,然后读取并执行该操作系统的基本引导代
码(DOS和Window
s的基本引导代码就是分区引导记录)。

上面介绍的便是计算机在打开电源开关(或按Reset键)进行冷启动时所要完成的各种初始
化工作,如果我们在DOS下按Ctrl+Alt+Del组合键(或从Windows中选择重新启动计算机)
来进行热启动,那
么POST过程将被跳过去,直接从第三步开始,另外第五步的检测CPU和内存测试也不会再进
行。我们可以看到,无论是冷启动还是热启动,系统BIOS都一次又一次地重复进行着这些我
们平时并不太注意
的事情,然而正是这些单调的硬件检测步骤为我们能够正常使用电脑提供了基础。













Mach
维基百科,自由的百科全书
跳转到: 导航, 搜索
Mach
是一個由卡內基梅隆大學發展的微核心的作業系統,為了用於作業系統之研究,特別是在分
散與平行運算上。是最早實現微核心作業系統的例子之一,是許多其它相似的計畫的標準。

Mach開發計畫在卡內基梅隆大學從1985年運行到1994年,到Mach
3.0版結束。其他還有許多人繼續Mach的研究包括猶他大學的Mach
4。Mach的開發是為了取代BSD的UNIX核心,所以是許多新的作業系統的設計基礎。Mach的研
究到至今似乎是結束,雖然有許多商業化作業系統,如NEXTSTEP 與 OPENSTEP,特別是 Mac
OS X(使用XNU
核心)都是使用Mach或其衍生系統。Mach的虛擬機(VM)系統也被BSD的開法者用於CSRG,
並出現在BSD衍生的系統中,如FreeBSD。Mac
OS

X與FreeBSD並未保留Mach首倡的微核心結構,除了Mac
OSX繼續提供微核心於內部處理通訊以及應用程式直接控制。

Mach繼承卡內基梅隆大學的Accent kernel,Mach計畫主導人Richard
Rashid曾於微軟的研究部門擔任高級人員。另一Mach開發者Avie
Tevanian曾是NeXT首席程式設計師,之後擔任蘋果電腦軟體技術部門主管直到2006年[1]。

现在,一个名为GNU Mach(En:GNU Mach)的计划与GNU HURD联系紧密。Debian
GNU/Hurd就是基于GNU Mach的。
























博客首页 注册 建议与交流 排行榜 加入友情链接 推荐 投诉 搜索: 帮助
私のウェブサイト

深度决定高度,即便一小步也有新高度。

https://www.doczj.com/doc/5b6573786.html, 管理博客 发表文章 留言 收藏夹 · Linux下载大全 ·
音乐娱乐影视 · java精华站点 · ONLINE手册 · EBooks下载 · blog地址 ·
视频下载链接 · VC++ study websites ·
汇编语言学习站点 · 软件下载 · 北京生活 · 日语学习网站 · 软件外包 · 图片
博客圈 音乐 相册 · GG收藏 导入文章 文章 · WEB开发 }· Struts · JSF ·
Jsp精华 · Java精华 · Asp精华 ·
Lotus Domino · Php精华 · JavaScript · 桌面开发 }· Qt开发 · Perl · Python
· Gtk · Delphi · VC++ · JAVA · Linux_C · Visual Basic · CSharp · VB ·
wxWidgets · 驱动开发 ·
嵌入式开发 }· 汇编语言 · C&C++精华 · J2ME · Unix }· FreeBSD }·
FreeBSD架设管理与应用 · Solaris · Nexenta · Sco Unix · AIX · Linux }·
RedHat Linux · Debian · ArchLinux
· Gentoo · Cent OS · Ubuntu · SuseLinux · LFS · RedFlag · MagicLinux ·
Fedora · Windows · 数据库 }· Oracle · MSSql · MySql · PostgreSql ·
SQL技巧 · 中间件 }· weblogic ·
tomcat · 路由 · 算法大全 }· Delphi · C · Visual C++ · Com技术 ·
软件工程 }· UML · 设计模式 · 心情日记 · 汉化破解 · Mobile开发 ·
其他操作系统 首页

关于作者



无域暖流
MSN群:group26425@https://www.doczj.com/doc/5b6573786.html,




我的分类


我的文章分类

WEB开发

Struts

JSF

Jsp精华

Java精华

Asp精华

Lotus Domino

Php精华

JavaScript

桌面开发

Qt开发

Perl

Python

Gtk

Delphi

VC++

JAVA

Linux_C

Visual Basic

CSharp

VB

wxWidgets

驱动开发

嵌入式开发

汇编语言

C&C++精华

J2ME

Unix

FreeBSD

FreeBSD架设管理与应用

Solaris

Nexenta

Sco Unix

AIX

Linux

RedHat Linux

Debian

ArchLinux

Gentoo

Cent OS

Ubuntu

SuseLinux

LFS

RedFlag

MagicLinux

Fedora

Windows

数据库

Oracle

MSSql

MySql

PostgreSql

SQL技巧

中间件

weblogic

tomcat

路由

算法大全

Delphi

C

Visual C++

Com技术

软件工程

UML


相关主题
文本预览
相关文档 最新文档