关于作者

姓名:

性别:男

出生日期:--

地区:四川-成都

联系电话:

QQ:27170102婚否:保密
用户名:lhjgood
笔名:lhjgood
地区: 四川-成都
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:87
评论个数:28
留言条数:3




Powered by BlogDriver 2.1

lhjgood的博客

 

欢迎访问lhjgood的博客,谢谢! 如果有问题请与我联系:QQ 27170102 MSN lhjgood@hotmail.com Email lhjgood@163.com

文章

编写自己的操作系统  (作者置顶)

该文章转自其他朋友,对他们表示感谢!

自由软件社区是一个充满自由和梦想的地方,在10余年的时间里它创造了一个又一个奇迹。然而,这些奇迹的创造者不只是Stallman,也不只是Linus Torvalds,而是活跃在世界各地的不计其数的开发人员。


作者:伊梅

自由软件社区是一个充满自由和梦想的地方,在10余年的时间里它创造了一个又一个奇迹。然而,这些奇迹的创造者不只是Stallman,也不只是Linus Torvalds,而是活跃在世界各地的不计其数的开发人员。

在使用各种功能强大的自由软件时,我总会对其开发

者充满崇敬之情,期盼有朝一日自己也能成为他们中的一员。很多对自由社区充满向往之情的人,虽然也想努力融身于其中,但又不知该怎么做。那么,就请与我们一起从编写一个简单的操作系统开始吧!


我们要做的事情


有人可能担心自己既没有学过计算机原理,也没有学过操作系统原理,更不懂汇编语言,对C语言也一知半解,能写操作系统吗?答案是没问题。我将带大家一步一步完成自己的操作系统。当然如果学一学上述内容再好不过。

首先要明确处理器(也就是CPU)控制着计算机。对PC而言,启动的时候,CPU都处在实模式状态,相当于只是一个Intel 8086处理器。也就是说,即使你现在拥有一个奔腾处理器,它的功能也只能是8086级别。从这一点上来讲,可以使用一些软件把处理器转换到著名的保护模式。只有这样,我们才可以充分利用处理器的强大功能。

编写操作系统开始是对BIOS控制,取出存储在ROM里的程序。BIOS是用来执行POST(Power On Self Test,自检)的。自检是检查计算机的完整性(比如外设是否工作正常、键盘是否连接等)。这一切完成以后,你就会听到PC喇叭发出一声清脆的响声。如果一切正常,BIOS就会选择一个启动设备,并且读取该设备的第一扇区(即启动扇区),然后控制过程就会转移到指定位置。启动设备可能是一个软盘、光盘、硬盘,或者其它所选择的设备。在此我们把软盘作为启动设备。如果我们已经在软盘的启动扇区里写了一些代码,这时它就被执行。因此,我们的目的很明确,就是往软盘的启动扇区写一些程序。

首先使用8086汇编来写一个小程序,然后将其拷贝至软盘的启动扇区。为了实现拷贝,要写一个C程序。最后,使用软盘启动计算机。


需要的工具


● as86:这是一个汇编程序,它负责把写的代码转换成目标文件。

● ld86:这是一个连接器,as86产生的目标代码由它来转换成真正的机器语言。机器语言是8086能够解读的形式。

● GCC:著名的C编程器。因为我们需要写一个C程序将自己的OS转移到软盘中。

● 一张空软盘:它用于存储编写的操作系统,也是启动设备。

● 一台装有Linux的计算机:这台机器可以很旧,386、486都可以。

在大部分标准Linux发行版中都会带有as86和ld86。在我使用的Red Hat 7.3中就包含有这两个工具,并且在默认的情况下,它已经安装在机器里。如果使用的Linux没有这两个工具,可以从网上下载(http: //www.cix.co.uk/~mayday/),这两个工具都包含在一个名为bin86的软件包中。此外,有关的文档也可以在网上获得 (www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html)。


开始工作


使用一个你喜欢的编辑器输入以下内容:

entry start
start:
mov ax,#0xb800
mov es,ax
seg es
mov [0],#0x41
seg es
mov [1],#0x1f
loop1: jmp loop1


这是as86可以读懂的一段汇编程序。第一个句子指明了程序的入口点,声明整个过程从start处开始。第二行指明了start的位置,说明整个程序要从start处开始执行。0xb800是显存的开始地址。#表明其后是一个立即数。执行语句:

mov ax,#oxb800


ax 寄存器的值就变为0xb800,这就是显存的地址。下面再将这个值移至es寄存器,es是附加段寄存器。请记住8086有一个分段的体系结构。它的各段寄存器为代码段、数据段、堆栈段和附加段,对应的寄存器名称分别为cs、ds、ss和es。事实上,我们把显存地址送入了附加段,因此,任何送入附加段的东西都会被送到显存中。

要在屏幕上显示字符,就需要向显存中写两个字节。前一个是所要显示字符的ASCⅡ值,第二个字节表示该字符的属性。属性包括字符的前景色、背景色及是否闪烁等等。seg es指明下一个将要执行的指令是指向es段的。所以,我们把值0x41(在ASCⅡ中表示的字符是A)送到显存的第一个字节中。接下来要把字符的属性送到下一个字节当中。在此输入的是0x1f,该属性指的是在蓝色背景下显示白色的字符。因此,如果执行这个程序,就可以在屏幕上得到显示在蓝底上的一个白色的 A。接着是一个循环。因为在执行完显示字符的任务后,要么让程序结束,要么使用一个循环使其永远运行下去。把该文件命名为boot.s,然后存盘。

此处显存的概念说得不是很清楚,有必要进一步解释一下。假设屏幕由80列×25行组成,那么第一行就需要160字节,其中一个字节用于表示字符,另外一个字节用于表示字符的属性。如果要在第三行显示某一字符的话,就要跳过显存的第0和1字节(它们是用于显示第1列的),第2和3字节(它们是用于显示第2列的),然后把需要显示字符的ASCⅡ码值入第4字节,把字符的属性写入第5字节。


把程序写至启动扇区


下面写一个C程序,把我的操作系统写入软盘第一扇区。程序内容如下:

#include /* unistd.h 需要这个文件 */
#include /* 包含有read和write函数 */
#include
int main()
{
char boot_buf[512];
int floppy_desc, file_desc;
file_desc = open("./boot", O_RDONLY);
read(file_desc, boot_buf, 510);
close(file_desc);
boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;
floppy_desc = open("/dev/fd0", O_RDWR);
write(floppy_desc, boot_buf, 512);
close(floppy_desc);
}


首先,以只读模式打开boot文件,然后在打开文件时把文件描述符复制到file_desc变量中。从文件中读取510个字符,或者读取直到文件结束。在本例中由于文件很小,所以是读取至文件结束。然后关闭文件。

最后4行代码打开软盘驱动设备(一般来说是/dev/fd0)。使用lseek找到文件开始处,然后从缓冲中向软盘写512个字节。

在read、write、open和lseek的帮助页中,可以看到与函数所有有关的参数及其使用方法。程序中有两行比较难懂:

boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;


该信息是用于BIOS的,如果它识别出该设备是一个可启动的设备,那么在第510和511的位置,该值就应该是0x55和0xaa。程序会把文件boot读至名为boot_buf的缓冲中。它要求改变第510和第511字节,然后把boot_buf写至软盘之上。如果执行代码,软盘上的前512字节就包含了启动代码。最后,把文件存为write.c。


编译运行


使用下面的命令把文件变为可执行文件:

as86 boot.s -o boot.o
ld86 -d boot.o -o boot
cc write.c -o write


首先将boot.s文件编译成目标文件boot.o,然后将该文件连接成最终的boot文件。最后C程序编译成可执行的write文件。

插入一个空白软盘,运行以下程序:

./write


重新启动电脑,进行BIOS的界面设置,并且把软盘设为第一个启动的设备。然后插入软盘,电脑从软盘上启动。

启动完成后,在屏幕上可以看到一个字母A(蓝底白字),启动速度很快,几乎是在瞬间完成。这就意味着系统已经从我们制作的软盘上启动了,并且执行了刚才写入启动扇区的程序。现在,它正处在一个无限循环的状态。所以,如果想进入Linux,必需拿掉软盘,并且重启机器。

至此,这个操作系统就算完成了,虽然它没有实现什么功能,但是它已经可以启动机器了。

下一期我将在这个启动扇区程序里加入一些代码,使它可以做一些比较复杂的事情(比如使用BIOS中断、保护模式切换等等)。

自己动手写操作系统(二)
作者:伊梅

上一期,我讲述了如何在软盘的启动扇区写一些代码,然后再从软盘启动的过程。制作好一个启动扇区,在切换到保护模式之前,我们还应该知道如何使用BIOS中断。BIOS中断是一些由BIOS提供的、为了使操作系统的创建更容易的低级程序。在本文中,我们将学习处理BIOS的中断。

为什么要用BIOS

BIOS 会把启动扇区拷贝至RAM中,并且执行这些代码。除此之外,BIOS还要做很多其它的事情。当一个操作系统刚开始启动时,系统中并没有显卡驱动、软盘驱动等任何驱动程序。因此,启动扇区中不可能包含任何一个驱动程序,我们要采取其它的途径。这个时候,BIOS就可以帮助我们了。BIOS中包含有各种可以使用的程序,包括检测安装的设备、控制打印机、计算内存大小等用于各种目的的程序。这些程序就是所说的BIOS中断。

如何调用BIOS中断

在一般的程序设计语言中,函数的调用是一件非常容易的事情。比如在C语言中,如果有一个名为display的程序,它带有两个参数,其中参数 noofchar表示显示的字符数,参数attr表示显示字符的属性。那么要调用它,只需给出程序的名称即可。对于中断的调用,我们使用的是汇编语言中的 int指令。

比如,在C语言中要显示一些东西时,使用的指令如下所示:

display(nofchar,attr);
而使用BIOS时,要实现相同功能使用的指令如下:

int 0x10

如何传递参数

在调用BIOS中断之前,我们需要先往寄存器中送一些特定的值。假设要使用BIOS的中断13h,该中断的功能是把数据从软盘传送至内存之中。在调用该中断之前,要先指定拷贝数据的段地址,指定驱动器号、磁道号、扇区号,以及要传送的扇区数等等。然后,就要往相应的寄存器送入相应的值。在进行下面的步骤前,读者有必要对这一点有比较明确地认识。

此外,一个比较重要的事实是同一个中断往往可以实现各种不同的功能。中断所实现的确切功能取决于所选择的功能号,功能号一般都存在ah寄存器之中。比如中断13h可以用于读磁盘、写磁盘等功能,如果把3送入ah寄存器中,那么中断选择的功能就是写磁盘;如果把2送入ah寄存器中,选择的功能则是读磁盘等。

我们要做的事情

这次我们的源代码由两个汇编语言程序和一个C程序组成。第一个汇编文件是引导扇区的代码。在引导扇区中,我们写的代码是要把软盘中第二扇区拷贝至内存段的0x500处(地址是0x5000,即偏移地址为0)。这时我们需要使用BIOS的中断13h。这时启动扇区的代码就会把控制权转移至0x500处。在第二个汇编文件中,代码会使用BIOS中断 10h在屏幕上显示一个信息。C程序实现的功能则是把可执行的文件1拷贝至启动扇区,把可执行的文件2拷贝至软盘的第二扇区。

启动扇区代码

使用中断13h,启动扇区把软盘第二扇区里的内容加载至内存的0x5000处(段地址为0x500)。下面的代码是用于实现这一目的的代码,将其保存至文件sbect.s中。

LOC1=0x500
entry start
start:
mov ax,#LOC1
mov es,ax
mov bx,#0
mov dl,#0
mov dh,#0
mov ch,#0
mov cl,#2
mov al,#1
mov ah,#2
int 0x13
jmpi 0,#LOC1


上面代码第一行类似于一个宏。接下去的两行则是把值0x500加载至es寄存器中,这是软盘上第二扇区代码将拷贝到的地方(第一扇区是启动扇区)。这时,把段内的偏移设为0。

接下来把驱动器号送入dl寄存器中,其中磁头号送入dl寄存器中,磁道号送入ch寄存器中,扇区号送入cl寄存器中,扇区数送入al寄存器之中。我们想要实现的功能是把扇区2、磁道号为0、驱动器号为0的内容送至段地址0x500处。所有这些参数都和1.44MB的软盘相对应。

把2送入ah寄存器中,是选择了由中断13h提供的相应功能,即实现从软驱转移数据的功能。

最后调用中断13h,并且转至偏移为0的段地址0x500处。

第二个扇区的代码

第二个扇区中的代码如下所示(把这些代码保存至文件sbect2.s之中):

entry start
start:
mov ah,#0x03
xor bh,bh
int 0x10

mov cx,#26
mov bx,#0x0007
mov bp,#mymsg
mov ax,#0x1301
int 0x10

loop1: jmp loop1
mymsg:
.byte 13,10
.ascii "Operating System is Loading......"


上面代码将被加载至段地址为0x500处,并且被执行。在这段代码中,使用了中断10h来获取目前的光标位置,然后显示信息。

从第3行到第5行用于得到目前光标的位置,在此中断10h选用的是功能3。然后,清除了bh寄存器的内容,并把字符串送至ch寄存器中。在bx中,我们送入了页码及显示的属性。此处,我们想要在黑背景上显示白色的字符。然后,把要显示字符的地址送到bp之中,信息由两个字节组成,其值分别为13的10,它们分别对应回车和LF(换行)的ASCⅡ值。接下来是一个由29个字符组成的串;在下面实现的功能是输出字符串然后移动光标;最后是调用中断,然后进入循环。

C程序代码
C程序的源代码如下所示,将其存储为write.c文件。

#include /* unistd.h needs this */
#include /* contains read/write */
#include
int main()
{
char boot_buf[512];
int floppy_desc, file_desc;
file_desc = open("./bsect", O_RDONLY);
read(file_desc, boot_buf, 510);
close(file_desc);
boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;
floppy_desc = open("/dev/fd0", O_RDWR);
lseek(floppy_desc, 0, SEEK_SET);
write(floppy_desc, boot_buf, 512);
file_desc = open("./sect2", O_RDONLY);
read(file_desc, boot_buf, 512);
close(file_desc);
lseek(floppy_desc, 512, SEEK_SET);
write(floppy_desc, boot_buf, 512);
close(floppy_desc);
}


在上一期中,我曾经介绍过如何操作能启动的软盘。现在这一个过程稍微有点不同,首先把由bsect.s编译出来的可执行文件bsect拷贝至软盘的启动扇区。然后再把由sect2.s产生的可执行文件sect2拷贝至软盘的第二个扇区。

把上述文件置于同一目录之下,然后分别对其进行编译,方法如下所示:

as86 bsect.s -o bsect.o
ld86 -d bsect.o -o bsect

对sect2.s文件重复以上的操作,得出可执行文件sect2。编译write.c,插入软盘后执行write文件,命令如下所示:

cc write.c -o write
./write

下一步我们要做的事情

从软盘启动以后,可以看到显示出来的字符串。这是使用了BIOS中断来完成的。下一期要做的事情是在这个操作系统中实现实模式向保护模式的转换。

自己动手写操作系统(三)
作者:伊梅


在上两期中(自己动手写操作系统1,2),我向大家讲述了如何使用Linux 提供的开发工具在软盘的启动扇区写一些代码,以及如何调用BIOS的问题。现在,这个操作系统已经越来越接近当年Linus Torvalds的那个具有"历史意义"的Linux内核了。因此,要马上把这个系统切换到保护模式之下。

什么是保护模式

自从1969年推出第一个微处理器以来,Intel处理器就在不断地更新换代,从8086、8088、80286,到80386、80486、奔腾、奔腾 Ⅱ、奔腾4等,其体系结构也在不断变化。80386以后,提供了一些新的功能,弥补了808的一些缺陷。这其中包括内存保护、多任务及使用640KB以上的内存等,并仍然保持和8086家族的兼容性。也就是说80386仍然具备了8086和80286的所有功能,但是在功能上有了很大的增强。早期的处理器是工作在实模式之下的,80286以后引入了保护模式,而在80386以后保护模式又进行了很大的改进。在80386中,保护模式为程序员提供了更好的保护,提供了更多的内存。事实上,保护模式的目的不是为了保护程序,而是要保护程序以外的所有程序(包括操作系统)。

简言之,保护模式是处理器的一种最自然的模式。在这种模式下,处理器的所有指令及体系结构的所有特色都是可用的,并且能够达到最高的性能。

保护模式和实模式

从表面上看,保护模式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱动来处理硬件,但二者有很多不同之处。我们知道,在实模式中内存被划分成段,每个段的大小为64KB,而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的,这些段寄存器(CS、DS、 SS和ES)的内容形成了物理地址的一部分。具体来说,最终的物理地址是由16位的段地址和16位的段内偏移地址组成的。用公式表示为:

物理地址=左移4位的段地址+偏移地址。

在保护模式下,段是通过一系列被称之为"描述符表"的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种:全局描述符表(GDT)和局部描述符表(LDT)。GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。在实模式中,段长是固定的(为64KB),而在保护模式中,段长是可变的,其最大可达4GB。LDT也是段描述符的一个数组。与GDT不同,LDT是一个段,其中存放的是局部的、不需要全局共享的段描述符。每一个操作系统都必须定义一个GDT,而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是8个字节,格式如图3所示。当段寄存器被加载的时候,段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中,以便下一次同一个段可以使用该信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址组成。实模式和保护模式的不同可以从图1和图2中很清楚地看出来。


图1 实模式的寻址


图2 保护模式下的寻址


图3 段描述俯的格式

此外,还有一个中断描述符表(IDT)。这些中断描述符会告诉处理器到那里可以找到中断处理程序。和实模式一样,每一个中断都有一个入口,但是这些入口的格式却完全不同。因为在切换到保护模式的过程中没有使用到IDT,所以在此就不多做介绍了。

进入保护模式

80386 有4个32位控制寄存器,名字分别为CR0、CR1、CR2和CR3。CR1是保留在未来处理器中使用的,在80386中没有定义。CR0包含系统的控制标志,用于控制处理器的操作模式和状态。CR2和CR3是用于控制分页机制的。在此,我们关注的是CR0寄存器的PE位控制,它负责实模式和保护模式之间的切换。当PE=1时,说明处理器运行于保护模式之下,其采用的段机制和前面所述的相应内容对应。如果PE=0,那么处理器就工作在实模式之下。

切换到保护模式,实际就是把PE位置为1。为了把系统切换到保护模式,还要做一些其它的事情。程序必须要对系统的段寄存器和控制寄存器进行初始化。把PE位置1后,还要执行跳转指令。过程简述如下:

1.创建GDT表;

2.通过置PE位为1进入保护模式;

3.执行跳转以清除在实模式下读取的任何指令。

下面使用代码来实现这个切换过程。

需要的东西

◆ 一张空白软盘

◆ NASM编译器

下面是整个程序的源代码:

org 0x07c00; 起始地址是0000:7c00
jmp short begin_boot ; 跳过其它的数据,跳转到引导程序的开始处
bootmesg db "Our OS boot sector loading ......"
pm_mesg db "Switching to protected mode ...."
dw 512 ; 每一扇区的字节数
db 1 ; 每一簇的扇区数
dw 1 ; 保留的扇区号
db 2
dw 0x00e0
dw 0x0b40
db 0x0f0
dw 9
dw 18
dw 2 ; 读写扇区号
dw 0 ; 隐藏扇区号
print_mesg :
mov ah,0x13 ; 使用中断10h的功能13,在屏幕上写一个字符串
mov al,0x00 ; 决定调用函数后光标所处的位置
mov bx,0x0007 ; 设置显示属性
mov cx,0x20 ; 在此字符串长度为32
mov dx,0x0000 ; 光标的起始行和列
int 0x10 ; 调用BIOS的中断10h
ret ; 返回调用程序
get_key :
mov ah,0x00
int 0x16 ; Get_key使用中断16h的功能0,读取下一个字符
ret
clrscr :
mov ax,0x0600 ; 使用中断10h的功能6,实现卷屏,如果al=0则清屏
mov cx,0x0000 ; 清屏
mov dx,0x174f ; 卷屏至23,79
mov bh,0 ; 使用颜色0来填充
int 0x10 ; 调用10h中断
ret
begin_boot :
call clrscr ; 先清屏
mov bp,bootmesg ; 提供串地址
call print_mesg ; 输出信息
call get_key ; 等待用户按下任一键
bits 16
call clrscr ; 清屏
mov ax,0xb800 ; 使gs指向显示内存
mov gs,ax ; 在实模式下显示一个棕色的A
mov word [gs:0],0x641 ; 显示
call get_key ; 调用Get_key等待用户按下任一键
mov bp,pm_mesg ; 设置串指针
call print_mesg ; 调用print_mesg子程序
call get_key ; 等待按键
call clrscr ; 清屏
cli ; 关中断
lgdt[gdtr] ; 加载GDT
mov eax,cr0
or al,0x01 ; 设置保护模式位
mov cr0,eax ; 将更改后的字送至控制寄存器中
jmp codesel:go_pm
bits 32
go_pm :
mov ax,datasel
mov ds,ax ; 初始化ds和es,使其指向数据段
mov es,ax
mov ax,videosel ; 初始化gs,使其指向显示内存
mov gs,ax
mov word [gs:0],0x741 ; 在保护模式下显示一个白色的字符A
spin : jmp spin ; 循环
bits 16
gdtr :
dw gdt_end-gdt-1 ; gdt的长度
dd gdt ; gdt的物理地址
gdt
nullsel equ $-gdt ; $指向当前位置,所以nullsel = 0h
gdt0 ; 空描述符
dd 0
dd 0 ; 所有的段描述符都是64位的
codesel equ $-gdt ; 这是8h也就是gdt的第二个描述符
code_gdt
dw 0x0ffff ; 段描述符的界限是4Gb
dw 0x0000
db 0x00
db 0x09a
db 0x0cf
db 0x00
datasel equ $-gdt
data_gdt
dw 0x0ffff
dw 0x0000
db 0x00
db 0x092
db 0x0cf
db 0x00
videosel equ $-gdt
dw 3999
dw 0x8000 ; 基址是0xb8000
db 0x0b
db 0x92
db 0x00
db 0x00
gdt_end
times 510-($-$$) db 0
dw 0x0aa55


把上面的代码存在一个名为abc.asm的文件之中,使用命令nasm abc.asm,将得出一个名为abc的文件。然后插入软盘,输入命令:dd if=abc of=/dev/fd0。该命令将把文件abc写入到软盘的第一扇区之中。然后重新启动系统,就会看到如下的信息:

*Our os booting................
* A (棕色)
* Switching to protected mode....
* A (白色)


对代码的解释

上面给出了所有的代码,下面我对上述代码做一些解释。

◆ 使用的函数

下面是代码中一些函数的说明:

print_mesg 该子程序使用了BIOS中断10h的功能13h,即向屏幕写一字符串。属性控制是通过向一些寄存器中送入不同的值来实现的。中断10h是用于各种字符串操作,我们把子功能号13h送到ah中,用于指明要打印一个字符串。al寄存器中的0说明了光标返回的起始位置,0表示调用函数后光标返回到下一行的行首。如果al为1则表示光标位于最后一个字符处。

显存被分成了几页,在同一时刻只能显示其中的一页。bh指明的是页号;bl则指明要显示字符的颜色;cx指明要显示字符串的长度;dx指明光标的位置(即起始的行和列)。所有相关寄存器初始化完成以后,就可以调用BIOS中断10h了。

get_key 使用中断16h的子功能00h,从屏幕得到下一个字符。

clrscr 该函数使用了中断10h的另外一个子功能06h,用于输出开始前清屏。初始化时给al中送入0。寄存器cx和dx指明要清屏的屏幕范围,在本例中是整个屏幕。寄存器bh指明屏幕填充的颜色,在本例中是黑色。

◆ 其它内容

程序一开始是一条短跳转指令,跳到begin_boot处。在实模式下,在此打印一个棕色的"A",并且设置一个GDT。切换到保护模式,并且打印一个白色的"A"。这两种模式使用的都是自己的寻址方法。

在实模式下,使用段寄存器gs指示显存位置,我们使用的是CGA显卡(默认基址是0xb8000)。在代码中是不是漏了一个0呢?没有,因为实模式下会提供一个附加的0。这种方式也被80386继承下来了。A的ASCⅡ是0x41,0x06指明了需要一个棕色的字符。该显示会一直持续直至按下任意键。下面要在屏幕上显示一句话,告诉使用者下面马上要进入保护模式了。

启动到保护模式,在进行切换时不希望此时有中断的影响,故要关闭所有的中断(使用cli来实现)。然后对GDT初始化。在整个切换过程中,对4个描述符进行了初始化。这些描述符对代码段(code_gdt)、数据和堆栈段 (data_gdt),以及为了访问显存而对显示段进行初始化。此外,还会对一个空描述符进行初始化。

GDT的基址要加载至GDTR 系统寄存器之中。gdtr段的第一个字加载的是GDT的大小,在下一个双字中则加载的是基址。然后,lgdt指令把把gdt段加载至GTR寄存器中。现在已经做好了切换到保护模式前的所有准备。最后一件事情就是把CR0寄存器的PE位置1。不过,即使这样还没有处于保护模式状态之下。

设置了PE位以后,还需要通过执行JMP指令来清除处理器指令预取队列。在80386中,使用指令前总是先将其从内存中取出,并且进行解码和寻址。然而,当进入保护模式以后,预取指令信息(它还处于实地址模式)就无效了。使用JMP指令的目的就是强迫处理器放弃无效的信息。

现在,已经在保护模式下了。那么,如何检测是在保护模式状态之下呢?让我们来看一看屏幕上这个白色的字母A。在这里,使用了数据段选择符(datase1)对数据段和附加段进行了初始化,使用显示段选择符(videose1)对gs进行了初始化。告示的字符"A"其ASCⅡ值和属性位于[gs:0000]处,也就是 b8000:0000处。循环语句使得该字符一直在屏幕上显示,直至重新启动系统。

- 作者: lhjgood 2005年12月7日, 星期三 16:45  回复(2) |  引用(0) 加入博采

经典网站  (作者置顶)

国内站点:

1、http://www.linuxeden.com/          linux 伊甸园

2、http://www.linuxaid.net.cn/          linux 技术支持中心

3、http://www.chinaitlab.com/          中国IT 实验室

4、http://www.fanqiang.com            永远的 unix

5、http://www.tomlinux.com/            tomlinux 全中文嵌入式操作系统

6、http://www.anywlan.com/            嵌入式开发论坛

7、http://www.chinaunix.net/

国外站点:

1、http://www.kernel.org                                 linux 内核

2、RTLinux  相关网站

     http://www.fsmlabs.com/ 

     http://www.rtlinuxfree.com/ 

     http://bernia.upv.es/rtportal/apps/base/     文档和代码

3、LFS  相关网站

     http://www.linuxfromscratch.org/

    http://lfs.linuxsir.org/cgi-bin/wiki/moin.cgi/

4、Gentoo 相关网站

     http://www.gentoo.org

     http://www.douzhe.com/docs/linux/gentoo/index.htm

     http://rtlinux.lzu.edu.cn/index.html

- 作者: lhjgood 2005年11月8日, 星期二 09:45  回复(0) |  引用(0) 加入博采

几个招聘信息
为了方便大家求职查询,我们汇总了
9月3日到现在所有的名企招聘信息,供大家参考!
强生(中国)有限公司2008校园招聘(9.17网申启动)
http://www.hiall.com.cn/bbs/viewthread.php?tid=123215


L.E.K. Consulting 2008校园招聘开始(更新)
http://www.hiall.com.cn/bbs/viewthread.php?tid=123178

LG化学中国2008年校园招聘计划
http://bbs.hiall.com.cn/viewthread.php?tid=123059&extra=page%3D2

利乐2008管理培训生计划开始啦
http://bbs.hiall.com.cn/viewthread.php?tid=123061&extra=page%3D2

中信银行2008年毕业生网申开始了!!
http://bbs.hiall.com.cn/viewthread.php?tid=123130&extra=page%3D1

艾默生网络能源2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122976&extra=page%3D1

中国银联2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122991&extra=page%3D1

斯伦贝谢(Schlumberger)2008校园招聘启动
http://bbs.hiall.com.cn/viewthread.php?tid=122742&extra=page%3D1

高盛(Goldman Sachs)08校园招聘及暑期实习生计划
http://bbs.hiall.com.cn/viewthread.php?tid=122609&extra=page%3D1

微软中国 销售市场服集团 2008年校园招聘!(NEW!!!)
http://bbs.hiall.com.cn/viewthread.php?tid=122627&extra=page%3D1

Delphi 德尔福2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122749&extra=page%3D1

Barclays Capital(巴克莱投资银行)08校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122750&extra=page%3D1

佰益(中国)投资有限公司校园招聘信息
http://bbs.hiall.com.cn/viewthread.php?tid=122751&extra=page%3D1

McKinsey & Company 麦肯锡咨询公司2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122754&extra=page%3D1

2008摩立特集团校园招聘启事
http://bbs.hiall.com.cn/viewthread.php?tid=122760&extra=page%3D1

Citi(花旗)2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122761&extra=page%3D1

美的集团2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122782&extra=page%3D1

奥托立夫中国校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=122792&extra=page%3D1

【北京】2008百度校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=121844&extra=page%3D1

2008摩立特集团上海分公司校园招聘启事
http://www.hiall.com.cn/bbs/viewthread.php?tid=121845&extra=page%3D1

【北京】2007-2008 Bain & Company Intern program
http://www.hiall.com.cn/bbs/viewthread.php?tid=121801&extra=page%3D1

【西安招聘组】2007年宝洁公司校园招聘活动正式启动
http://www.hiall.com.cn/bbs/viewthread.php?tid=121786&extra=page%3D1
HiAll提示:网上申请日期于9月10开放,截止到10月7日晚上12点

【北京】O2Micro 2008 校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=121802&extra=page%3D1

[招聘] 微软亚洲研究院FY08校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=121788&extra=page%3D1

麦肯希公司将到西安交通大学招聘 [宣讲会通知]
http://www.hiall.com.cn/bbs/viewthread.php?tid=121799&extra=page%3D1
HiAll提示:西安交大麦肯锡公司宣讲会时间:9月14日下午 3:00-5:30

[天津]爱立信招聘2007年应届毕业生
http://www.hiall.com.cn/bbs/viewthread.php?tid=121822&extra=page%3D1

腾讯2008校园招聘现已火热启动!
http://www.hiall.com.cn/bbs/viewthread.php?tid=122204&extra=page%3D1

奇梦达2008 校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=122201&extra=page%3D1

摩根士丹利IT Morgan Stanley Information Technology - Tsinghua Universit
http://www.hiall.com.cn/bbs/viewthread.php?tid=122089&extra=page%3D3

太古集团校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=122135&extra=page%3D1&frombbs=
1

2008摩立特集团校园招聘启事
http://bbs.hiall.com.cn/viewthread.php?tid=122760&highlight=%C4%A6%C1%A2%CC%D
8

【Adobe】2008校园招聘正式启动
http://www.hiall.com.cn/bbs/viewthread.php?tid=122230&extra=page%3D1

美的集团2008校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=122236&extra=page%3D1

晨星半导体(上海)2008校园招聘
http://www.hiall.com.cn/bbs/viewthread.php?tid=122206&extra=page%3D1

2007微软校园招聘正式启动!!
http://bbs.hiall.com.cn/viewthread.php?tid=122346&extra=page%3D1

松下集团2008校园招聘启动
http://bbs.hiall.com.cn/viewthread.php?tid=122304&extra=page%3D1

2008壳牌(中国)有限公司招聘
http://hiall.com.cn/bbs/viewthread.php?tid=122356&extra=page%3D1

贝塔斯曼(Bertelsmann)2008校园招聘
http://edu.hiall.com.cn/viewthread.php?tid=123082&extra=page%3D1

劲牌公司2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=123083&extra=page%3D1

埃克森美孚2008校园招聘开始啦!
http://bbs.hiall.com.cn/viewthread.php?tid=123090&extra=page%3D1

IBM(中国)2008年校园招聘正式启动
http://bbs.hiall.com.cn/viewthread.php?tid=123114&extra=page%3D1

BP石油2008校园招聘正式启动!
http://bbs.hiall.com.cn/viewthread.php?tid=123118&extra=page%3D1

瑞士龙沙集团2008校园招聘
http://bbs.hiall.com.cn/viewthread.php?tid=123125&extra=page%3D1

腾讯2008校园招聘现已火热启动!
http://www.hiall.com.cn/bbs/viewthread.php?tid=122204&extra=page%3D1

飞利浦2008校园招聘已启动,众多机会期待你的加入!
http://bbs.hiall.com.cn/viewthread.php?tid=122934&extra=page%3D1

汇丰银行2008年BDP招聘计划
http://hiall.com.cn/bbs/viewthread.php?tid=122860&extra=page%3D1

斯伦贝谢校园聘
http://hiall.com.cn/bbs/viewthread.php?tid=122863&extra=page%3D1

广东北电2008年校园招聘正式启动啦!
http://hiall.com.cn/bbs/viewthread.php?tid=122864&page=1&extra=page%3D1

荷兰银行2008校园招聘及暑期实习生计划启动
http://bbs.hiall.com.cn/viewthread.php?tid=122920&extra=page%3D1

LG化学中国2008年校园招聘计划
http://bbs.hiall.com.cn/viewthread.php?tid=123059&extra=page%3D2

利乐2008管理培训生计划开始啦
http://bbs.hiall.com.cn/viewthread.php?tid=123061&extra=page%3D2

中信银行2008年毕业生网申开始了!!
http://bbs.hiall.com.cn/viewthread.php?tid=123130&extra=page%3D1

- 作者: lhjgood 2007年09月17日, 星期一 10:59  回复(0) |  引用(0) 加入博采

一位软件工程师的6年总结
一位软件工程师的6年总结

作者:成晓旭

(声明:欢迎转载,请保证文章的完整性)

“又是一年毕 业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位;想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经 验提炼,希望对所有的软件工程师们有所帮助,早日实现自己的人生目标。本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议,前面几点旨 在确定大的方向,算是废话吧。

谨以此文献给那个自己为你奉献3年青春与激情的开发团队。还有团队成员:PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD。

1、 分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道 理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生!”所以放在每一条,让刚刚毕业的朋友们早点看到哈!

2、 一定要确定自己的发展方向,并为此目的制定可行的计划。不要说什么,“我刚毕业,还不知道将来可能做什么?”,“跟着感觉走,先做做看”。因为,这样的观 点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术,将来成为专家级人物?向管理方向走,成为职业经理人?先熟悉行业和领域,将来自立门 户?还是先在行业里面混混,过几年转行做点别的?这很重要,它将决定你近几年、十年内“做什么事情才是在做正确的事情!”。

3、 软件开发团队中,技术不是万能的,但没有技术是万万不能的!在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中。在软 件项目团队中,技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基 础。算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到。倒是曾经看到过一个“高学历的 牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句“再也受不了啦!”四分五裂、各奔东西。那个项目的“成功度”大家可想 而知了。

4、 详细制定自己软件开发专业知识学习计划,并注意及时修正和调整(软件开发技术变化实在太快)。请牢记:“如果一个软件开发人员在1、2年内都没有更新过自 己的知识,那么,其实他已经不再属于这个行业了。”不要告诉自己没有时间。来自时间管理领域的著名的“三八原则”告诫我们:另外的那8小时如何使用将决定 你的人生成败!本人自毕业以来,平均每天实际学习时间超过2小时。

5、 书籍是人类进步的阶梯,对软件开发人员尤其如此。书籍是学习知识的最有效途径,不要过多地指望在工作中能遇到“世外高人”,并不厌其烦地教你。对于花钱买 书,我个人经验是:千万别买国内那帮人出的书!我买的那些家伙出的书,!00%全部后悔了,无一本例外。更气愤的是,这些书在二手市场的地摊上都很难卖 掉。“拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧。”只有将书本变成的自己智慧,才算是 真正拥有了它。

6、 不要仅局限于对某项技术的表面使用上,哪怕你只是偶尔用一、二次。“对任何事物不究就里”是任何行业的工程师所不应该具备的素质。开发Windows应用 程序,看看Windows程序的设计、加载、执行原理,分析一下PE文件格式,试试用SDK开发从头开发一个Windows应用程序;用VC++、 Delphi、Java、.Net开发应用程序,花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码;除了会用J2EE、 JBoss、Spring、Hibernate等等优秀的开源产品或者框架,抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。 试着这样做做,你以后的工作将会少遇到一些让你不明就里、一头雾水的问题,因为,很多东西你“知其然且知其所以然”!
 
7、 在一种语言上编程,但别为其束缚了思想。“代码大全”中说:“深入一门语言编程,不要浮于表面”。深入一门语言开发还远远不足,任何编程语言的存在都有其 自身的理由,所以也没有哪门语言是“包治百病”的“灵丹妙药”。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是:用 面对对象工具开发某些关键模块时,为什么不可以借鉴C、C51、汇编的模块化封装方式?用传统的桌面开发工具(目前主要有VC++、Delphi)进行系 统体统结构设计时,为什么不可以参考来自Java社区的IoC、AOP设计思想,甚至借鉴像Spring、Hibernate、JBoss等等优秀的开源 框架?在进行类似于实时通信、数据采集等功能的设计、实现时,为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式?为什么一切都必须以个 人、团队在当然开发语言上的传统或者经验来解决问题???“他山之石、可以攻玉”。

8、 养成总结与反思的习惯,并有意识地提炼日常工作成果,形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知,对软件开发人员 而言,有、无经验的一个显著区别是:无经验者完成任何任务时都从头开始,而有经验者往往通过重组自己的可复用模块、类库来解决问题(其实这个结论不应该被 局限在软件开发领域、可以延伸到很多方面)。这并不是说,所有可复用的东西都必须自己实现,别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识 库中。但是,最好还是自己实现,这样没有知识产权、版权等问题,关键是自己实现后能真正掌握这个知识点,拥有这个技能。

9、 理论与实践并重,内外双修。工程师的内涵是:以工程师的眼光观察、分析事物和世界。一个合格的软件工程师,是真正理解了软件产品的本质及软件产品研发的思 想精髓的人(个人观点、欢迎探讨)。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作,但从软件工程师这个角度 来看,这只是外在的东西,并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论,并在实践中理解、应用软件产品的分析、设计、实现思 想来解决具体的软件产品研发问题,才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题,并在具体实践中验证和修正这些思想 与方式,最终形成自己的理论体系和实用方法论。

10、心态有多开放,视野就有多开阔。不要抱着自己的技术和成果,等到它们都已经过时 变成垃圾了,才拿出来丢人现眼。请及时发布自己的研究果:开发的产品、有创意的设计或代码,公布出来让大家交流或者使用,你的成果才有进化和升华的机 会。想想自己2000年间开发的那些Windows系统工具,5、6年之后的今天,还是那个样子,今天流行的好多Windows系统工具都比自己的晚,但 进化得很好,且有那么多用户在使用。并且,不要保守自己的技术和思想,尽可能地与人交流与分享,或者传授给开发团队的成员。“与人交换苹果之后,每个人还 是只有一个苹果;但交换思想之后,每个人都拥有两种思想”,道理大家都懂,但有多少人真正能做到呢?

11、尽量参加开源项目的开发、 或者与朋友共同研制一些自己的产品,千万不要因为没有钱赚而不做。网络早已不再只是“虚拟世界”,网上有很多的开源项目、合作开发项目、外包项目,这都是 涉猎工作以外的知识的绝好机会,并且能够结识更广的人缘。不要因为工作是做ERP,就不去学习和了解嵌入式、实时、通信、网络等方面的技术,反过来也是一 样。如果当他别人拿着合同找你合作,你却这也不会,那也不熟时,你将后悔莫及。

12、书到用时方恨少,不要将自己的知识面仅仅局限于 技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明: “对于一个有一定基础的人来说,他只要真正肯下功夫,在6个月内就可以掌握任何一门学问。”教育心理学界为感谢西蒙教授的研究成果,故命名为西蒙学习法。 可见,掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等 知识,有空花时间看看,韬光养晦、未雨绸缪。

13、本文的总结与反思:

A:不要去做技术上的高手,除非你的目标如此。虽然本文是关于提高软件开发知识的建议,做技术的高手是我一向都不赞同的。你可以提高自己的专业知识,但能胜任工作即止。

B:提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理,可以很容易地延伸、应用到生活的其它方面。

C:在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质,尤其是那些目标不在技术方面的朋友。 

- 作者: lhjgood 2007年09月17日, 星期一 09:28  回复(5) |  引用(0) 加入博采

TP 自动化技术、计算机技术类核心期刊表

TP 自动化技术、计算机技术类核心期刊表

 

序号

刊名

出版地

主办单位

印刷版

光盘版

1

计算机学报

北京

中国计算机学会等

*

*

2

自动化学报

北京

中国科学院等

*

*

3

软件学报

北京

中国科学院软件研究所

*

*

4

计算机研究与发展

北京

中国科学院计算技术研究所等

*

*

5

小型微型计算机系统

沈阳

中国科学院沈阳计算机技术研究所

*

*

6

机器人

沈阳

中国科学院沈阳自动化研究所

*

*

7

计算机科学

重庆

国家科技部西南信息中心

*

 

8

控制与决策

沈阳

东北大学

*

*

9

控制理论与应用

广州

中国科学院系统科学研究所等

*

*

10

计算机工程与应用

北京

华北计算技术研究所

*

*

11

微型计算机

重庆

科学技术部西南信息中心

 

 

12

模式识别与人工智能

北京

中国自动化学会等

 

 

13

计算机应用研究

成都

四川省计算机应用研究中心

*

*

14

计算机应用

北京

中国科学院计算机应用研究所等

*

*

15

电子学报

北京

中国电子学会

*

*

16

信息与控制

沈阳

中国科学院沈阳自动化研究所

*

*

17

传感器技术

哈尔滨

信息产业部电子第49研究所

 

*

18

计算机辅助设计与图形学学报

北京

中国计算机学会等

 

*

19

计算机系统应用

北京

中国科学院软件中心

*

*

20

中文信息学报

北京

中国中文信息学会

*

*

21

计算机工程

上海

上海市计算机协会

*

*

22

计算机应用与软件

上海

上海计算技术研究所等

*

 

23

微电子学与计算机

西安

中国航天工业总公等

*

*

24

计算机集成制造系统

北京

国家863计划CIMS主题办公室等

*

25

中国图象图形学报

北京

中国图象图形学会

 

*

26

数值计算与计算机应用

北京

中国科学院计算数学与工程计算研究所

- 作者: lhjgood 2007年09月9日, 星期日 10:23  回复(1) |  引用(0) 加入博采

Not Chongsheng, but Niepan
来自百渡知道:

凤凰涅磐
凤凰经历烈火的煎熬和痛苦的考验,获得重生,并在重生中达到升华,称为“凤凰涅磐”,以此典故寓意不畏痛苦、义无反顾、不断追求、提升自我的执着精神

凤凰在大限到来之时集梧桐枝于自焚,在烈火中新生,其羽更丰,其音更清,其神更髓。

佛经中的天龙八部提到的迦喽罗(一种超级大鸟)就是中国凤凰的原形,500年涅磐一次,叫声是仙界的音乐,每天要吃100头龙,1000条大毒蛇。

涅磐是佛教教义,其为音译,意译为灭、灭度、寂灭、安乐、无为、不生、解脱、圆寂。涅盘原意是火的熄灭或风的吹散状态。佛教产生以前就有这个概念;佛教用作为修习所要达到的最高理想境界。

传说中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于人世间的所有不快和仇恨恩怨,投身于熊熊烈火中自*焚,以生命和美丽的终结换取人世的祥和和幸福。同样在肉体经受了巨大的痛苦和轮回后它们才能得以更美好的躯体得以重生。

这段故事以及它的比喻意义,在佛经中,被称为“涅磐”。

《涅磐无名论》中的记载如下:“ 无名曰:夫至人空洞无象,而万物无非我造。会万物以成己者,其唯圣人乎!何则? 非理不圣,非圣不理,理而为圣者,圣人不异理也。故天帝曰:般若当于何求?善吉曰:般若不可于色中求,亦不离于色中求。又曰:见缘起为见法,见法为见佛, 斯则物我不异之效也。所以至人戢玄机于未兆,藏冥运于即化,总六合以镜心,一去来以成体。古今通,始终通,穷本极末,莫之与二。浩然大均,乃曰涅磐。经 曰:不离诸法而得涅磐。又曰:诸法无边,故菩提无边,以知涅磐之道,存乎妙契。妙契之致,本乎冥一,然则物不异我,我不异物,物我玄会,归乎无极,进之弗 先,退之弗后,岂容终始于其间哉!天女曰:耆年解脱,亦如何久。”

翻译成我们现在的语言:无名者说,达到一定境界的人必有空寂灵昧的体验,体验到空境,就不会在意世界万象的事物,万物由我心流出,执万物与我合一,只有圣 人能做到!为什么这样说呢?因为不掌握这个真理就不能成为圣人,反之,不是圣人也不能知道这个真理,正因为掌握了这个真理才成为圣人,所以圣人与真理契合 无间,凡是圣人都不能离开这个真理!这正如般若观照所说的色心不二,相即相离,空即是色,色即是空的不二之理。从缘起法的角度来看,万法为空,空为万法, 见佛即见法,见法即见空,诸法性空,即成见佛,物我两忘,不一不异。所以通达空境的圣人总是勘玄机于先兆,隐未来于变化,将东南西北上下六合统摄一心,过 去未来同成一体。古来今往都是一样,穷本极末,没有二致。将浩浩然物我一心,就是涅磐。这就是佛经里说的“不离诸法而得涅磐”。又因为诸法无边,故求得解 脱也无尽,由是推知,涅磐之道在于保持契会妙理之“妙契”,有了“妙契”,乃知万法冥然一体的真理。万物与我没有本质的差别,我与万物实质一样,物与我玄 妙会通,无极是它们最后归宿。涅磐就是进而不前,退而不后,无始无终,终始不在其间!天女说:耆年(舍利弗——引者注)的解脱也无终始。

- 作者: lhjgood 2007年09月7日, 星期五 09:12  回复(0) |  引用(0) 加入博采

棒喝时代:有些人为何只愿做富家子弟的教授

棒喝时代:有些人为何只愿做富家子弟的教授

 
  面对中国政法大学按人口比例招生:

  中国政法大学校长徐显明曾表示,该校今年将对招生制度实行重大改革,本科分省招生计划首次按省人口比例确定。徐显明明言,“中国政法大学不是北京的政法大学,是全中国的政法大学。”此言一出,褒贬不一。

  对此,教育部的表态比较谨慎,认为高校在招生方面拥有自主权,只要在自主权的范围之内,高校有权选择自己的招生办法,法大的做法可视为“一种尝试”。

  卢干奇表示,中国政法大学按照各省人口比例分配招生名额的办法没有从根本上解决平等权的问题。如果单独按照人口比例,对于基础教育搞得好的省份,会减少优质生源上大学的比例。

  北京大学法学院教授孙东东认为,按人口比例确定招生规模会造成当年(低水平的)“工农兵大学生”的复归。他说,这是完全不懂高等教育的一种“炒作”。

  ——请那些在歧视中为命运挣扎的“工农兵”阶级的学子们记住他

  我喜欢某些教育家“得天下英才而教之,一乐也”的宣言。因此我尊敬在学校里那些忙碌播种知识和良知的老师。可是某天,当教育界的不公平制度将有稍许改变的时候,我们敬爱的孙东东教授说出了这句肺腑之言。机会平等是倒退,是他们给工农兵阶层的恩惠。他们不愿意给,我们这写贱民们除了哭泣还能做些什么?

  工农兵阶层的孩子与孙教授的得意弟子们相比已经输在了中学教育的起跑线上。人口众多而贫困的农村,孩子们的教育条件城里人是想象不到的。我记得初中吃着咸菜读书的日子;我记得我们的化学老师是聘的在我们乡说评书的人,因为别人不懂化学,孙教授之流懂,人家又不屑在我们那种下贱的地方教;我记得老师总会说考出去才是我们改变命运的唯一路径;我记得高中毕业时我们没摸过电脑,其实那时候电脑早已经成了城市孩子们的玩具……

  我们工农兵阶层的孩子是贱民,但我们心中也在向往着那几所名校,我们努力了,如果机会均等,落榜无怨!毕竟祖国给我们了这个翻身的机会!但是没有,无耻的高考制度把我们的梦拈碎了,似孙教授这种富人的教师爷把我们改变命运的路给掐断了……

  记住可敬的孙东东、子西西之类的教授吧。

  可怜的工农兵子弟,可怜的西部孩子,特别是河南,山东,四川孩子。记住这个名字,你知道自己的前途有多坎坷,你知道改变命运的道路上有多少障碍,多少凄苦,有多少孙东东……

  把这篇文章放在我博客历史栏中是因为我认为历史应该记住一写英雄或垃圾。这里面有几个人物的。比如善于"炒作"且"不懂高等教育"的中国政法大学校长徐显明教授,欲左右逢源公然骑墙的卢干奇教授,特别是纨绔子弟的道貌岸然的教师爷孙东东"绞手"。

  受教育平等权问题绝对是国之大事,或许中国真正的人才培养模式就这样建立起来,功盖千秋。或许贱民子弟还要被在孙东东之"绞手"勒紧脖子送上绞架。

  刚看sina新闻,悲愤交加。不顾文体,不顾字句。一口气把怨气宣泄。不值得孙绞手一看,但值得贱民子弟共勉!

  本文选自《染衣(自强)的BLOG》的博客,点击查看博客原文。
 

- 作者: lhjgood 2006年04月15日, 星期六 20:33  回复(2) |  引用(0) 加入博采

struts简单例子的分析

struts简单例子的分析
作者: ∣来源:JavaResearch∣原文地址∣2005-3-10
struts简单例子的分析

转:www.code365.com
<!-- 以下仅为个人经验,供大家参考。不足或谬误之处请大家指教 -->
<!-- 徐建明 -->

首先你要对你的环境进行配置

配置TomCat环境
1、到我的机器(IP为192.1.168.7,用户为Guest,口令没有)上的"共享"目录中,拷贝j2sdk-1_4_2_02-windows-i586-p.exe、jakarta-tomcat-5.0.14.zip、jakarta-struts-1.1.zip三个压包文件。
2、先双击j2sdk-1_4_2_02-windows-i586-p.exe安装jdk,最好安装到一个根目录下。在此假设安装在D:\j2sdk1.42_02下。
3、安装TOMCAT。TOMCAT不用安装,只用直接解压jakarta-tomcat-5.0.14.zip到硬盘上。假设解压到D:\TOMCAT下。
4、配置环境变量。右键点击"我的电脑"图标,选择"高级"子项,点击"环境变量"按扭。在"系统变量"中新建如下几个环境变量:
名称 键值 说明
JAVA_HOME D:\j2sdk1.4.2_02 就是你的JDK的安装目录
CLASSPATH .;%JAVA_HOME%\LIB
5、解压jakarta-struts-1.1.zip到任一目录,将其中\jakarta-struts-1.1\webapp目录下的struts-example.war文件拷贝到TOMCAT下的\tomcat\webapps中
6、进入\tomcat\bin目录,点击startup.bat以启动TomCat。(TomCat启动后点击shutdown.bat可关闭)
7、让TomCat在后台运行,打开ie,在地址栏中输入http://localhost:8080/可进入TomCat的主页,输入http://localhost:8080/struts-example可进入struts的一个例子。

祝大家安装顺利 :)

然后,我们来看一下STRUTS例子中的最重要的两个文件,这两个都是配置文件,

struts-config.xml(具体配置的情况我作了注释)

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd";>

<!--
This is the Struts configuration file for the example application,
using the proposed new syntax.
-->


<struts-config>

<!-- ========== Form Bean Definitions =================================== -->
<!-- FormBean是struts的一个概念,本质是JavaBean,用来自动存储页面表单中各个域的值,并在适当的时候回填表单域,不需要象传统那样request.getParameter("fieldName");,常被action-mappings中的action 使用 -->
<form-beans>
<!-- 稍后我们会新增一个GetparameterForm类,用来存储用户信息 -->
<form-bean name="GetParameterForm" type="beans.GetParameterForm"/>
</form-beans>

<!-- ========== Global Forward Definitions ============================== -->
<!--这里存放整个系统都可以使用的全局转向中转(Forward)地址 -->
<!-- 一般情况下,一个Action处理完毕后,会转发到一个JSP页面进行显示。这也是JSP中的MVC的实现的要点。-->
<global-forwards>
<!--failed.do和success.do将被当成servlet请求,到action-mappings中寻找对应的action处理。-->
<forward name="success" path="/success.do"/>
<forward name="fail" path="/fail.do"/>
</global-forwards>

<!-- ========== Action Mapping Definitions ============================== -->
<!--web.xml中后缀为.do的请求被转到这里处理。这里相当于struts的Model部分,Model部分是struts中比较灵活的地方。-->
<action-mappings>
<!--处理showinput.do的请求,使用的FormBean是GetparameterForm,既beans.GetParameterForm类,当处理过程发生错误时将返回index.jsp-->
<action path="/showinput" type="beans.ShowAction" name="GetParameterForm" scope="request" input="/index.jsp" />
<action path="/success" forward="/success.jsp"/>
<action path="/fail" forward="/error.jsp" />
</action-mappings>

</struts-config>

web.xml(具体配置的情况我作了注释)

<!-- Action Servlet Mapping -->
<!--该系统的servlet可以映射成.do为后缀的文件,后缀名可以改成任何名称.-->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<!-- The Welcome File List -->
<!--该系统的默认首页是index.jsp,可以有多个,系统按次序找,类似IIS-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<!-- Application Tag Library Descriptor -->
<!-- 定义标签库 -->
<!--
<taglib>
<taglib-uri>/WEB-INF/app.tld</taglib-uri>
<taglib-location>/WEB-INF/app.tld</taglib-location>
</taglib>
-->

</web-app>

这两个文件是我们用JDK+TOMCAT+STRUTS的基本配置,注意:在更改了这个配置后需要对TOMCAT进行重新启动!

在\你的目录\中存放你的.JSP文件,他们的编写你可以使用HTML或FRONGPAGE等工具编写,对于大家这个是比较简单的,在此我就不再觜书,代码如下:

INDEX.JSP

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*,java.sql.*,java.text.*,java.io.*"%>

<form name="form1" method="post" action="showinput.do">
输入success将返回到"success"页面,否则返回到"fail"页面<br><br>
input:<input type="text" name="valu">  <input type="submit" value="submit">
</form>
<br>
<a href="success.do">success</a><br>
<a href="fail.do">fail</a>

SUCCESS.JSP

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*,java.sql.*,java.text.*,java.io.*"%>

success!

ERROR.JSP

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*,java.sql.*,java.text.*,java.io.*"%>

error page!

再在\你的文件夹\WEB-INF\classes\beans中我们编写需要处理消息请求的类。具体代码如下:

GetParameterForm.java

package beans;
import org.apache.struts.action.ActionForm;
public class GetParameterForm extends ActionForm
{
private String valu="null";

public GetParameterForm() {
}

public void setValu(String s) {
valu = s;
}
public String getValu() {
return valu;
}
}

ShowAction.java

package beans;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import org.apache.struts.util.*;

public final class ShowAction extends Action
{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
HttpSession session = request.getSession();
GetParameterForm userform = (GetParameterForm) form;
if(userform.getValu().equals("success")) {
return(mapping.findForward("success"));
}
else {
System.out.println(userform.getValu());
return(mapping.findForward("fail"));
}
}
}


最后你可以运行了。

在TOMCAT中地址中填写http://localhost:8080/你的文件夹/

 
 

--------------------------------------------------------------------------------
MY HOTLE CALIFORNIA: 加 洲 旅 馆
 
 
runner

初级用户
发帖: 29
积分: 49
来自:
状态: offline
注册: 2004-10-14
 发表于: 2004-11-7 11:42:00                    2楼
 
 

Re:struts简单例子的分析

二、Struts安装

  1、安装Struts需要的软件

  Java Development Kit-- 我们需要download和install 1.2(或之后)版本的JDK。

   下载地址:

   http://java.sun.com/j2se

  Servlet Container -- 通常的选择是下载Tomcat(至少是3.1版,推荐使用4.0以上的版本)。

   下载地址:

   http://jakarta.apache.rg/tomcat

  Ant Build System -- 如果我们通过Struts源码发布包安装,我们必须下载1.1或之后版本的ant build system。在我们通过Struts来开发我们自己的Web应用程序是,推荐使用ant来build我们的应用。

   下载地址:

   http://jakarta.apache.org/ant

  Servlet API Classes -- 为了编译Structs自己,或应用程序使用Struts,我们需要一个包含Servlet和JSP API对象的servlet.jar包。大多数Servlet container(例如Tomcat)已经自带了这个文件。否则,我们必需下载:http://jakarta.apache.org/builds/jakarta-servletapi

  XML Parser -- Structs需要一个与Java API for XML Parsing(JAXP)规格兼容的XML处理器,我们可以使用Xerces。

   下载地址:

   http://xml.apache.org/xerces-j

  Xalan XSLT Processor -- 如果我们通过Structs源码发布版来构造我们的Structs系统,我们必须下载和安装1_2_D01或之后版本的Xalan XSLT处理器(Xerces中已自带Xalan)。这个处理器用于将基于XML的Structs文档转换为Html文档。

  2、通过源码构造Structs

  1)下载Structs的源码发布包。

  2)设置ANT_HOME环境变量,指向我们的Ant目录。

  3)设置JAVA_HOME环境变量,指向我们的JDK目录。

  4)设置SERVLETAPI_HOME环境变量,指向我们的Servlet API目录(如果我们的CLASSPATH已经包含了servlet.jar,就不需要指定该目录)

  5)将Structs的源码发布包进行解包。

  6)进入Structs目录,运行以下命令:

  ./build.sh dist

  该命令将创建Struts的二进制发布包,目录在../dist/structs(相对于我们的编译目录)。

  3、通过Struts的二进制发布包安装Structs

  1)下载Struts的二进制发布版。

  2)将Struts的二进制发布版进行解包。(如果我们是通过Struts源码构造Struts,build的结果就已经是已解包的Struts)。解包后的Struts包含以下内容:

  lib/struts.jar -- 这个文件包含了Struts的所有Java对象。我们需要把它拷贝到我们的Web应用的WEB-INF/lib目录。

  lib/structs.tld --这是一个"tag library descriptor"文件,它描述了Struts库的自由tag。需要将它拷贝到我们的Web应用的WEB-INF目录。

  webapps/struts-documentation.war -- 这是一个"web application archive"文件,包含了所有的Struts文档。我们可以将它安装到支持Servlet API 2.2或之后版本的servlet container(推荐使用tomcat)中。

  webapps/struts-example.war -- 这是一个web应用实例,它广泛地演示了Struts的许多功能。我们可以将它安装到兼容Servlet2.2或之后版本以及JSP1.1或之后版本规范的servlet容器中(推荐使用tomcat)。
webapps/struts-test.war -- 这个web应用包含了Struts支持的许多tag的测试网页,可以作为使用Struts tag的例子。

  4、Struts的基本组件包

  安装好的struts大约有15包,近200个类所组成,而且数量还在不断的扩展。在此我们不能一一介绍,只能列举几个主要的简要的介绍一下。下表说明了目前struts api中基本的几个组件包,包括
action,actions,config,util,taglib,validator。如下表1所示:

org.apache.struts.action
 基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能
org.apache.struts.actions
 这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删FromBean的类,也在struts1.1中被Action包的DynaActionForm组件所取代
org.apache.struts.config
 提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
org.apache.struts.util
 Strtuts为了更好支持web application的应用,体统了一个些常用服务的支持,比如Connection Pool和Message Source。详细信息请参考http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
org.apache.struts.taglib
 这不是一个包,而是是一个客户标签类的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags这几个用于构建用户界面的标签类。
org.apache.struts.validator
 Struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。详细信息请参阅 http://home.earthlink.net/~dwinterfeldt/

三、Struts 配置与组件介绍

  有关struts组件配置struts-config.xml文件说明在前面的文章中已经介绍过,这里就不再说了,下面主要介绍框架中组件与配置。

  下表列出了Struts的核心类,即对应的经典的MVC组件职责。

  表格2 核心Struts 类和MVC 的对应

类 描述
ActionForward 用户指向或者视图选择
ActionForm 状态改变的数据
ActionMapping 状态改变事件
ActionServlet 控制器,接受用户请求和状态改变,以及发出视图选择
Action 控制器的一部分,于模型交互,执行状态改变或状态查询,以及告诉ActionServlet 下一个选择的视图

  除了这些核心类, Struts 使用一些配置文件和视图助手(view helpers)来沟通控制器和模型。下表列出了Struts 配置文件和描述了他们在架构中的角色。

  表格3 Strtuts 配置文件

文件 目的
ApplicationResources.properties 存储本地化信息和标签,以使应用可以国际化
struts-config.xml 存储控制器对象的缺省配置,包括模型支持的用户指向,状态改变,状态查询

  为将Struts配置数据暴露给视图,框架以JSP标签的形式提供了大量的助手类,如表4 Strtus 视图助手。


标记库描述符 目的
struts-html.tld 扩展HTML Form的JSP标记
struts-bean.tld 扩展处理JavaBean的JSP标记
struts-logic.tld 扩展测试属性值的JSP标记

  控制器组件的配置

  框架中的控制器组件是有org.apache.struts.action.ActionServlet类实现的,这个类是javax.servlet.http.HttpServlet类的扩展。

  ActionServlet配置:

  我们需要在web.xml中声明ActionServlet,并且将它配置成启动时进行加载。以下为可以配置的初始化参数:

参数 默认值 描述
application Null 应用程序的资源集合的类
bufferSize 4096 文件上传的缓冲区大小
config /WEB-INF/struts-config.xml 配置文件的位置和名称
content Text/html 默认的内容类型
debug 0 程序调试的级别
detail 0 程序调试细节的级别
factory Null 消息资源工厂,糜诠?驶?薪馐拖?⒆试?/TD>
formBean org.apache.struts.action.ActionFormBean 封装ActionForm bean信息的类的名称
forward Org.apache.struts.action.ActionForward 封装ActionForward对象信息的类的名称
locale True 为true,将在用户会话中存储一个本地对象
mapping Org.apache.struts.action.ActionForward 封装ActionMapping信息的类的名称
maxFileSize 250M 上传文件的最大尺寸
multipartClass Org.apache.struts.action.ActionForward 处理多部分请求的类的名称
noCache False HTTP标头是否要设置为禁止缓寸
Null True 设置为true,对于无效的信息关键字将返回null
tempDir 作为一个servlet参数提供给程序的工作目录 处理下载文件是使用的临时工作目录
validate True 是否使用新格式的配置文件
vallidating True 是否对配置文件进行有效性分析

  大多数情况下,标准的servlet就能够满足用户需要。

  第一次收到特定请求的URI时,ActionServlet将适当的Action类进行实例化,然后ActionServlet在Action类实例中以servlet为变量名存储一个引用。当被实例化后,Action类会被暂存以备再用。

  错误处理

  struts提供了两个类来处理错误:ActionErrors和ActionError,它们都扩展org.apache.struts.action。ActionErrors保存着ActionError对象的集合,其中每一个代表了独立的错误信息。每个ActionError都包含了关键字,能够映射到资源文件中存储的错误信息,而这个资源文件是在ActionServlet初始化参数中指定的。

四、Struts的运行

  可通过以下的步骤在我们自己的应用程序中使用Struts:

  1、将Struts目录的lib/struts.jar拷贝到web应用的WEB-INF/lib目录。

  2、将Struts目录的lib/struts*.tld拷贝到web应用的WEB-INF目录。

  3、修改Web应用目录的WEB-INF/web.xml文件,增加一个<servlet>元素来定义controller servlet,增加一个<servlet-mapping>元素来建立URI请求与servlet的对应关系。可以参照Struts例子中的WEB-INF/web.xml文件来了解详细的语法要求。

  4、修改Web应用目录的WEB-INF/web.xml文件,使之包含以下的tag库定义:

<taglib>
<taglib-uri>/WEB-INF/struts.tld</taglib-uri>
<taglib-location>/WEB-INF/struts.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>

  5、创建一个WEB-INF/action.xml文件来定义我们的web应用的action映射关系。可以参照Struts例子中的action.xml文件来了解详细的语法要求。

  6、在使用Struts tag库的JSP网页中加入以下tag库定义:

<@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>
<@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

  7、最后,在编译我们的web应用的java程序时,不要忘了在CLASSPATH中包含struts.jar文件。

- 作者: lhjgood 2006年02月24日, 星期五 16:40  回复(0) |  引用(0) 加入博采

牵手

来自网上的一段话: 

。。。如果你问我,在男女交往中最幸福的动作是什么,我回答你是牵手。也许你有自己不同的见解,不过我已经说了这是我的答案。正式的牵手是男女由不确定向确定迈出的至关重要的一步,这一步的完成可以说是由真正的量变完成了质变。牵手就像在男女之间建立了一条纽带,将两个人的心正式地连接在一起,从此有了一份牵挂、一份责任、一份甜蜜……让我牵着你的手,和你走过以后的日子是一份沉重的充满甜蜜的承诺。。。

- 作者: lhjgood 2005年12月30日, 星期五 13:43  回复(2) |  引用(0) 加入博采

了解硬件体系 开发嵌入式Linux
与单纯的硬件开发或软件开发有所不同,嵌入式Linux系统在研发过程中通常都要涉及到硬件和软件两个环节。许多计算机软件开发人员在转向嵌入式系统Linux开发的过程中显得力不从心,一个原因就在于缺乏对嵌入式系统的硬件体系结构的了解,而偏偏嵌入式系统开发又对硬件的要求非常高。  

    从本质上说,嵌入式Linux系统也属于计算机系统的范畴,因此不可避免地要由三大基本部分组成:中央处理器(CPU)、存储设备和I/O设备。此外,它还需要负责在三大部分之间进行通信的设备。本文从这几个方面入手介绍嵌入式Linux系统的硬件体系结构。  

   
中央处理器

    嵌入式系统的核心部件是各种类型的嵌入式中央处理器。根据所用指令集的不同,嵌入式中央处理器可以分成两种主要的体系结构,一种是复杂指令集(Complex Instruction Set Computer,CISC)系统,另一种则是精简指令集(Reduced Instruction Set Computer,RISC)系统。  

    在20世纪60年代,CISC结构曾是嵌入式中央处理器的设计主流。但是随着时间的推移,这种设计思想已经越来越难以满足实际应用的需要。于是有人开始提出了一种全新的处理器体系结构——RISC。目前使用的嵌入式中央处理器大多采用RISC结构。  

    现在几乎所有的半导体制造商都有能力生产嵌入式中央处理器,根据所用技术的不同,可以将嵌入式中央处理器分成如下四种类型:
    ◆ 嵌入式微处理器(Embedded Micro Processor Unit,EMPU)
    ◆ 嵌入式微控制器(Embedded Micro-controller Unit,EMU)
    ◆ 嵌入式DSP处理器(Embedded Digital Signal Processor,EDSP)
    ◆ 嵌入式片上系统(Embedded System on Chip,ESoC)  

    微处理器
    现在的通用计算机都是以微处理器为中心。从严格意义上说,“微处器”指的是芯片内部只包括CPU本身,而不包括存储器和I/O接口等其它功能模块,采用的是冯·诺依曼体系结构。在一些高端的嵌入式应用中,通过将微处理器装配在专门设计的电路板上,并配以必要的外围接口电路和扩展电路,可以快速构造出一个实用的嵌入式系统。  

    为了满足嵌入式应用的特殊要求,嵌入式微处理器虽然在功能上与通用微处理器基本相同,但在工作电压、工作温度、抗干扰性和可靠性等方面都做了增强。一般说来,采用微处理器来构建嵌入式系统具有良好的实时性能、支持多任务处理、便于存储区保护、提供处理器扩展、丰富的调试功能和完善的电源管理等优势。  

    微控制器
    微处理器芯片中不包括I/O接口电路,也没有其它外围功能模块,功能相对单一。因此,嵌入式系统的设计人员和硬件厂商开始倾向于开发另一种类型的嵌入式处理器。这种处理器不用像通用处理器那样具有强大而齐全的功能,但要力求做到小巧,而且省电。这就是嵌入式微控制器,通常也称之为单片机。  

    微控制器通常以某个微处理器内核为基础,芯片内部集成ROM、RAM、FLASH、总线逻辑和I/O端口等各种必要的功能模块,以适应特定场合的需要。与微处理器相比,微控制器最大的优点就是集成化,使体积、功耗和成本得到了有效的控制,并且可靠性大大提高。微控制器是目前嵌入式系统的主流产品,在构建嵌入式系统时,能节省系统开支、降低出错概率和减少高频干扰。  

    在开发嵌入式系统时,经常会遇到结构简单且数量众多的外围设备。这些设备有的需要CPU为之提供控制手段,有的则需要被CPU当作输入信号,虽然功能各不相同,但通常都只需要表示开和关两个基本状态就足够了。因为无论是传统的串口还是并口,对这些设备的处理都显得力不从心,所以在微控制器芯片上大多会提供一个通用可编程I/O接口(GPIO),这是微控制器有别于微处理器的一个显著特征。

DSP处理器
    数字信号处理器(Digital Signal Processor,DSP)是专门为数字信号处理而设计的处理器。它现在已经被广泛地应用在各种消费电子类产品当中,比如手机就运用了DSP技术对数字语音信号进行编码和译码。DSP处理器通常是针对特定应用而开发的,其优点是能够在短时间内对特定的数字信号进行大量的处理,具有很强的实时运行功能。PC机上使用的通用处理器(如Intel的80x86)在工作时,大约有百分之九十的时间都是在进行加法运算,乘法运算所占的比重相对较少。因此,通用处理器一般不会在提高乘法运算能力上下很大功夫,而DSP处理器的出现正好弥补了这一缺陷。  

    为了加快数字信号的处理速度,DSP处理器在设计时加入了许多殊结构,以增强它的并行处理能力。通用处理器在设计时遵循的是便宜和简单的原则,一般面向普通用户。因而它采用的是冯·诺依曼体系结构,指令和数据处于同一地址空间。当处理器

要执行某条指令时,必须先将指令从内存中读出来进行译码,然后再将运算数据从内存中取出来,之后才能执行真正的运算,耗费在运算之外的时间非常多。DSP处理器则拥有一种称为哈佛的总线结构。这种结构使用不同的指令和运算数据总线,可以同时从内存中读出指令和数据进行运算,从而减少了运算所耗费的时间。  

    嵌入式DSP处理器对系统结构和指令都进行了特殊设计,使其能够在资源受限的情况下执行某种DSP算法。由于编译效率和指令执行速度都很高,因此,像数字滤波、快速傅立叶变换和离散余弦变换等DSP算法正在被大量引入到嵌入式领域中来。目前,DSP处理器主要应用在嵌入式系统的智能化领域,如生物信息识别终端、实时语音处理和虚拟现实等。这类智能化算法一般运算量较大,特别是乘法运算和向量运算非常多,而这恰好是DSP处理器的优势所在。  

    SoC
    随着EDI的推广和VLSI设计的普及,出现了片上系统(System on Chip,SoC)。SoC顾名思义指的是集成在CPU芯片上的部件比较多,足以独立构成一个系统。实际上它与微控制器的区别并不十分严格,因此有时会将同一块芯片既称为微控制器,又称为SoC。  

    在嵌入式系统中使用SoC处理器具有如下一些显著的优点:
    ◆ 降低内部工作电压,减少芯片功耗;
    ◆ 减少芯片引脚数目,简化制造过程;
    ◆ 简化外围驱动单元,优化处理速度;
    ◆ 优化内部电路结构,降低系统噪声。  

    存储设备   

    存储设备的主要作用是保存操作系统和应用程序的映像,以及系统在运行时所需的数据。在嵌入式系统中使用的存储设备可以分为内部存储器和外部存储器两类。内部存储器和处理器处于同一块芯片上,CPU不必通过I/O电路就可以直接访问它们,处理

速度非常快,但造价也异常昂贵。外部存储器是用来存储程序或数据的独立设备,访问时需要花费比内部存储器更多的时间,并

且需要在处理器周围搭建额外的寻址电路。  

    无论存储器位于处理器的内部还是外部,都可以进一步划分成如下几种类型:
    ◆ 随机存取存储器(Random Access Memory,RAM);
    ◆ 只读存储器(Read Only Memory,ROM);
    ◆ 混合存储器(Hybrid Memory)。  

    RAM
    RAM是一种可以被随机访问的存储设备。RAM有时也被称为读写存储器,这是因为对这种存储设备可以同时执行读操作和写操作。根据工作原理的不同,RAM可以分为两种类型,动态RAM(DRAM,Dynamic RAM)和静态RAM(SRAM,Static RAM)。

RAM既可以位于处理器内部,也可以位于处理器外部。它与处理器的连线一般包括地址总线、数据总线、片选信号和读/写控制信号等。通用计算机一般采用DRAM,而嵌入式系统则多少会采用一些SRAM,或者完全采用SRAM。  

    ROM
    嵌入式系统一般都不采用磁盘,其操作系统和应用程序的映像,以及系统运行时所需的数据,都必须保存在某种断电以后数据不会丢失的存储设备中,即通常所说的不挥发存储器。与通用计算机相比,嵌入式系统往往配备更多的不挥发存储器。现在基于半导体技术的不挥发存储器大多是只读的或接近只读的,一般泛称为ROM,常见的有掩膜式ROM、可编程ROM和可擦除ROM。  

    ROM的特点是即使关闭电源,其中的内容仍然能够保存不变。因此,它通常被嵌入式系统用来保存系统所需的程序代码和所有永久性数据。  

    混合存储器
    在嵌入式系统中使用的混合存储器主要有以下几类:
    ◆ EEPROM 与EPROM类似,不同点在于它是通过电信号进行擦除的。
    ◆ Flash 也称为闪存,其本质上是一种EEPROM,但能够在正常的工作电压和电流下进行擦除和写入操作。因此,它可以在目标系统中在线地改变其内容
    ◆ NVRAM 也称为非易失性RAM,可以看成是带有后备电池的SRAM,即使电源关闭后它的内容也可以保持不变。  

在现有的技术条件下,闪存对嵌入式系统来讲是理想的、不挥发存储器。  

    I/O设备   

    一般来说,嵌入式系统配备的显示设备大多是尺寸较小的LCD,按工作原理不同可以分为TFT和DSTN两种。
    ◆ TFT 由薄膜晶体管(Thin Film Transistor)陈列构成,优点是亮度大、色彩鲜艳、可视角度大;缺点是价格高、耗电大,并且容易发生因个别晶体管损坏而在图像上形成斑点的现象。
    ◆ DSTN 利用液晶在不同电场下能够呈现不同的光学特性,在显示屏上用水平和垂直放置的导线做成网格,并加以电信号进行扫描,就可以依次在每个交点上形成并保持一定的电场,从而使该点上的液晶在反射或透射光线时能够显示出不同的颜色。  

    目前,在嵌入式系统中广泛使用的LCD有主动式和被动式的区别。被动式LCD显示器的电压控制部件设计在显示面板的四周,反应时间长且光线输出量少,因而可视角度比较小,显示动态图像时的效果比较差,并且容易产生残影现象。主动式LCD显示器则

通过在每个液晶单元内放置电压控制单元,在缩短反应时间的同时增加了光线的输出量,从而可以提供较好的动态显示效果。由于主动式LCD显示器的成本较高,因此目前只在一些高端的嵌入式设备中采用,如PDA和信息家电等。一般的嵌入式系统基于成本和实用性方面的考虑,大多采用被动式LCD显示器,如普通的移动电话等。  

    配备了LCD显示器的嵌入式设备往往还同时配有透明的触摸屏,通常触摸屏与液晶显示器是叠放在一起的。这样用户可以用触笔或手指在屏幕上定位,从而取代鼠标的作用,或者直接进行手写输入,以取代键盘的作用。

通信设备   

    Firewire
    IEEE 1394也称为Firewire,其传输带宽可以达到400Mb/s,最适合进行多媒体数据的传输,可以运用在多媒体实时播放、剪辑或者传输的场合。在需要进行快速且大量数据传输的嵌入式设备中,IEEE 1394是一个经常被用到的数据传输接口。

IEEE 1394在进行多媒体数据传输时的体系结构最上层为应用层(Application),以下依次为传输层(Transaction)、链路层(Link)和物理层(Physical)。多媒体数据在由应用层传送到链路层后,将遵循IEEE 1394标准进行封包,然后再经由链路层和物理层把数据传送出去。数据接收的另一端会接收打包数据,再经过拆包将数据还原成原来的多媒体数据。  

    USB
    USB接口原本是用于PC机的一种输入/输出接口,具有热插拔特性。当拥有USB接口的外围设备在与PC机连接时,操作系统会自动侦测到这一设备,并且能够在不重新启动计算机的前提下完成软硬件的配置。  

    因为USB 1.1规范中定义的数据传输速度可以高达12Mbps,所以使用USB接口的PDA在与PC进行数据同步时的速度要比使用RS-232高出许多。而最新的USB 2.0规范中,数据传输的最高速度可以达到480Mbps,用于进行大量且高速的数据传输。  

   蓝牙
    蓝牙(Bluetooth)是一个用于无线通信的标准协议。它可以给嵌入式系统提供无线数据传输功能,其通信频率处于2.4GHz以内,即使在无线噪声很强的环境下仍然能够保持很高的准确性。用于无线通信的蓝牙模块主要由三个部分组成,无线传输收发单元、基带处理单元和数据传输接口。  

    当无线信号由蓝牙的无线传输收发单元接收到之后,会被送到基带处理单元进行信号处理。处理后的数字信号再通过数据传输接口,传送到嵌入式系统的处理器之中作进一步的处理。  

    红外线
    嵌入式系统中的红外收发模块主要由三个部分组成:红外线发光二极管、硅管光检测器和控制电路。红外线发光二级管是用于发射红外线的装置。它能够发射波长在0.85微米到0.90微米之间的红外光波。硅管光检测器是用于接收红外线的装置。由它接收到的信号将被传到控制电路当中,然后再送给嵌入式系统的处理器作进一步的处理。  

    红外线收发模块也有相应的标准。最早出现的是1994年的IrDA1.0,采用波长在0.85微米到0.90微米的红外线进行传输,传输速度为115.2Kbps,距离大约在1米左右,接收角度在30度之内。而在1999年提出的VFIR标准中,传输速度已经可以高达16Mbps,有效距离为8米。  

    802.11  
    802.11是IEEE在1997年提出的一个无线网络通信标准,其目的是使各个厂商的无线网络设备可以互相兼容,从而提供一个稳定的无线传输环境。到了1999年,IEEE又先后提出了IEEE 802.11a和IEEE 802.11b两个无线传输协议,其中802.11a用5.8GHz的频带进行无线传输,而802.11b则使用2.4GHz的频带进行无线传输。基于802.11b协议的无线网络的最高速度是11Mbps,比常用的以太网稍微快一点,现在已经有许多嵌入式系统开始使用基于802.11b协议的设备,开发基于无线网络的各种应用。最新的协议是802.11g。  

    本文讨论了嵌入式Linux系统的硬件体系结构,从中央处理器、存储设备、I/O设备和通信设备几个方面分别介绍了目前在嵌入式开发中经常遇到的硬件设备。了解这些基本的硬件知识对今后深入进行嵌入式Linux系统的开发将会很有帮助。

- 作者: lhjgood 2005年12月30日, 星期五 13:06  回复(0) |  引用(0) 加入博采

感情真空

今天在网上看到这么一段话,和我的想法不谋而合!

。。。虽然我知道了现在的冉静并没有男朋友,并且处于感情的真空状态,如果乘虚而入的话,应该有不小的机会,但是我反而更加不愿意正式追求冉静。在我的观念中,凡是处于感情真空期的女人都是很脆弱的,虽然乘虚而入会使追求她们变得很容易,但是这种感情往往持续不长,这个时期发生的恋情只是一种过渡产品。当她们逐渐地从上一段感情中恢复的时候,她们往往会选择离去。我不愿意做一个用来填补空虚的产品,所以我从来不乘虚而入。。。

- 作者: lhjgood 2005年12月28日, 星期三 17:26  回复(1) |  引用(0) 加入博采

eclipse+hibernate

重新在Eclipse下再来过一遍,步骤有些不同。(eclipse+myEclipse)

1、创建一个普通的Java项目

2、加入用myeclipse导入Hibernate的包

3、加入MySql的JDBC包(应该先在myeclipse中配置数据库的服务)

4、创建一下数据POJO(忘了是不是这么叫,先这么写着吧)

5、在项目根结点用右键,查看项目属性,在Myeclipse-hibernate中添加(标准)Standard Hibernate包

6、在项目根结点用右键,运行myeclipse中的run-XDocLet,生成POJO的hbm文件

7、在项目根结点用右键,运行myeclipse中的add Hibernate Capabilities …(这个功能好象只能使用一次)

  在向导中a、加入数据库的接入方式 b、加入POJO的hbm文件 c、可指定一个目录自动生成一个SessionFactory类

8、创建一个测试类,运行;例如:

public class Test {

    public static void main(String[] args) throws HibernateException {
        Session aSession = HibernateSessionFactory.currentSession();
        Transaction tx=aSession.beginTransaction();
       
        Cat cat=new Cat();
        cat.setName("Tomcat");
        cat.setSex("T");
        cat.setWeight(12.1);
       
        aSession.save(cat);
        tx.commit();
       
        HibernateSessionFactory.closeSession();
    }
}

附:

可以看到,前前后后总共就只创建了两个类,其他全部自动生成。

要特别说明的是,POJO中一定要加入XDoclet的标签,不然Hibernate会怠工,hbm文件是生成不出来的。示例如下:

/*
* Created on 2005-4-26
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.hibernate.test;

/**
* @author julysea
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/

/**
* @hibernate.class
*   table="cat"
*/
public class Cat  {
    String cat_id;
    String name;
    String sex;
    double weight;
   
    public Cat() {
       
    }

    /**
     * @hibernate.id
     * column = "cat_id"
     * unsaved-value = "true"
     * generator-class = "uuid.hex"
     * @return Returns the cat_id.
     */
   

    public String getId() {
        return cat_id;
    }
    /**
     * @param cat_id The cat_id to set.
     */
    public void setId(String cat_id) {
        this.cat_id = cat_id;
    }
    /**
     * @hibernate.property
     * @return Returns the name.
     */
    public String getName() {
        return name;
    }
    /**
     * @param name The name to set.
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @hibernate.property
     * @return Returns the sex.
     */
    public String gtSex() {
        return sex;
    }
    /**
     * @param sex The sex to set.
     */
    public void setSex(String sex) {
        this.sex = sex;
    }
    /**
     * @hibernate.property
     * @return Returns the weight.
     */
    public double getWeight() {
        return weight;
    }
    /**
     * @param weight The weight to set.
     */
    public void setWeight(double weight) {
        this.weight = weight;
    }
}

- 作者: lhjgood 2005年12月28日, 星期三 16:59  回复(2) |  引用(0) 加入博采

男女平等
男人只要一天色心不断,就不可能在女人面前取得平等的机会。

- 作者: lhjgood 2005年12月28日, 星期三 16:49  回复(0) |  引用(0) 加入博采

关于跳舞
    跳舞本身就是一种无聊的运动,就是一种给不认识的男女一个合理拥抱的理由,尤其是那种慢得像走路一样的舞。

- 作者: lhjgood 2005年12月28日, 星期三 16:02  回复(0) |  引用(0) 加入博采

SQL Server SQL语句导入导出
1
 简介:微软SQL Server数据库SQL语句导入导出大全,包括与其他数据库和文件的数据的导入导出。

/*******  导出到excel 
EXEC master..xp_cmdshell ’bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""’ 

/***********  导入Excel 
SELECT * 
FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’, 
  ’Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)...xactions 

SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+’ ’ 转换后的别名 
FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’, 
  ’Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)...xactions 

/** 导入文本文件 
EXEC master..xp_cmdshell ’bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword’ 

/** 导出文本文件 
EXEC master..xp_cmdshell ’bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword’ 
或 
EXEC master..xp_cmdshell ’bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword’ 

导出到TXT文本,用逗号分开 
exec master..xp_cmdshell ’bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password’ 

BULK INSERT 库名..表名 
FROM ’c:\test.txt’ 
WITH ( 
    FIELDTERMINATOR = ’;’, 
    ROWTERMINATOR = ’\n’ 


--/* dBase IV文件 
select * from 
OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’ 
,’dBase IV;HDR=NO;IMEX=2;DATABASE=C:\’,’select * from [客户资料4.dbf]’) 
--*/ 

--/* dBase III文件 
select * from 
OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’ 
,’dBase III;HDR=NO;IMEX=2;DATABSE=C:\’,’select * from [客户资料3.dbf]’) 
--*/ 

--/* FoxPro 数据库 
select * from openrowset(’MSDASQL’, 
’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\’, 
’select * from [aa.DBF]’) 
--*/ 

/**************导入DBF文件****************/ 
select * from openrowset(’MSDASQL’, 
’Driver=Microsoft Visual FoxPro Driver; 
SourceDB=e:\VFP98\data; 
SourceType=DBF’, 
’select * from customer where country != "USA" order by country’) 
go 
/***************** 导出到DBF ***************/ 
如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句 

insert into openrowset(’MSDASQL’, 
’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\’, 
’select * from [aa.DBF]’) 
select * from 表 

说明:

SourceDB=c:\  指定foxpro表所在的文件夹 
aa.DBF        指定foxpro表的文件名. 

/*************导出到Access********************/ 
insert into openrowset(’Microsoft.Jet.OLEDB.4.0’, 
   ’x:\A.mdb’;’admin’;’’,A表) select * from 数据库名..B表 

/*************导入Access********************/ 
insert into B表 selet * from openrowset(’Microsoft.Jet.OLEDB.4.0’, 
   ’x:\A.mdb’;’admin’;’’,A表) 

- 作者: lhjgood 2005年12月22日, 星期四 20:48  回复(1) |  引用(0) 加入博采

JSP数据库连接大全
一、jsp连接Oracle8/8i/9i数据库(用thin模式)

testoracle.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//orcl为你的数据库的SID
String user="scott";
String password="tiger";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >

二、jsp连接Sql Server7.0/2000数据库

testsqlserver.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
//pubs为你的数据库的
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >
三、jsp连接DB2数据库

testdb2.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample";
//sample为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >

四、jsp连接Informix数据库

testinformix.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword";
//testDB为你的数据库名
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >
五、jsp连接Sybase数据库

testmysql.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName(&quo;com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/tsdata";
//tsdata为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >

六、jsp连接MySQL数据库

testmysql.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//testDB为你的数据库名
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >

七、jsp连接PostgreSQL数据库

testmysql.jsp如下:
< %@ page contentType="text/html;charset=gb2312"% >
< %@ page import="java.sql.*"% >
< html >
< body >
< %Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/soft"
//soft为你的数据库名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {% >
您的第一个字段内容为:< %=rs.getString(1)% >
您的第二个字段内容为:< %=rs.getString(2)% >
< %}% >
< %out.print("数据库操作成功,恭喜你");% >
< %rs.close();
stmt.close();
conn.close();
% >
< /body >
< /html >

- 作者: lhjgood 2005年12月22日, 星期四 20:47  回复(0) |  引用(0) 加入博采

oracle的存储过程指南

Create procedure procedue_name
    [@parameter data_type][output]
    [with]{recompile|encryption}
    as
    sql_statement
    解释 output:表示此参数是可传回的.

         with {recompile|encryption}

         recompile:表示每次执行此存储过程时都重新编译一次

         encryption:所创建的存储过程的内容会被加密

    表book的内容如下

   编号    书名                           价格

   001      C语言入门                   $30

   002      PowerBuilder报表开发  $52

    实例1:查询表Book的内容

create proc query_book
      as
      select * from book
   go
exec query_book

  实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额


   Create proc insert_book

   @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output

   with encryption  ---------加密

   as

   insert book(编号,书名,价格) Values(@param1,@param2,@param3)
   select @param4=sum(价格) from book
  go

    执行例子:

  declare @total_price money
  exec insert_book '003','Delphi 开发指南',$100,@total_price
  print '总金额为'+convert(varchar,@total_price)
  go


    实例3:设有两个表为Product,Order,其表内容如下:

      Product
  产品编号       产品名称    客户订数    
            001             钢笔         30        
            002             毛笔         50        
            003             铅笔         100       
      Order 
           产品编号         客户名     客户订金
            001              南山区      $30
            002              罗湖区      $50
    &nbs;       003              宝安区      $4

    请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中

    代码如下:

     Create proc temp_sale
     as
       select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
       into #temptable from Product a inner join Order b on a.产品编号=b.产品编号
    if  @@error=0
       print 'Good'
    else
       print 'Fail'
     go

- 作者: lhjgood 2005年12月22日, 星期四 20:46  回复(0) |  引用(0) 加入博采

简单的Oracle存储过程的创建方法
连接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> create or replace procedure get_news(
  2  aid in varchar2,atitle in varchar2)
  3  as
  4  begin
  5  select * from cf_news
  6  end;
  7  /

警告: 创建的过程带有编译错误。

SQL> create or replace procedure get_news(
  2  aid in varchar2 ,atitle in varchar2)
  3  as
  4  beging
  5  /

警告: 创建的过程带有编译错误。

SQL> create or replace procedure get_news(
  2  aid in varchar2)
  3  as
  4  begin
  5  select * from cf_news;
  6  end;
  7  /

警告: 创建的过程带有编译错误。

SQL> create or replace procedure get_news
  2  as
  3  begin
  4  select * from cf_news;
  5  end;
  6  /

警告: 创建的过程带有编译错误。

SQL> show errors;
PROCEDURE GET_NEWS 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/1      PLS-00428: 在此 SELECT 语句中缺少 INTO 子句
SQL> create or replace procedure get_news
  2  as
  3  aa number;
  4  begin
  5  select count(*) into aa from cf_news;
  6  end;
  7  /

过程已创建。

SQL> create or replace procedure get_news
  2  as
  3  aa number;
  4  begin
  5  select count(*) into aa from cf_news;
  6  dbms_outpub.put_line('aa='||aa);
  7  end;
  8  /

警告: 创建的过程带有编译错误。

SQL> show errors;
PROCEDURE GET_NEWS 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/1      PLS-00201: 必须说明标识符 'DBMS_OUTPUB.PUT_LINE'
6/1      PL/SQL: Statement ignored
SQL> create or replace procedure get_news
  2  as
  3  aa number;
  4  begin
  5  select count(*) into aa from cf_news;
  6  dbms_output.put_line('aa='||aa);
  7  end;
  8  /

过程已创建。

SQL> set serverout on;
SQL> execute get_news;
aa=3

PL/SQL 过程已成功完成。

- 作者: lhjgood 2005年12月22日, 星期四 20:44  回复(0) |  引用(0) 加入博采

通用时间座标UTC

通用时间座标

UTC (通用时间座标)是国际时间标准。 UTC与其时是等效的在用格林维志时间GMT(0°经度),以前表达本初子午线。 它也是等值到Z时间(Zulu时间)。 当它是0   UTC时,它是午夜在格林威治(英国),在子午经度线零。

UTC被计算在Bureau International des Poids et Mesures (BIPM)从大约二百个时钟数据,分布在几乎五十个国家实验室。

Time Service Department, U.S. Naval Observatory, (USA),在真正的时间给UTC。

- 作者: lhjgood 2005年12月21日, 星期三 10:56  回复(0) |  引用(0) 加入博采

Rtems简介
Rtems简介

RTEMS,a rivail of VxWorks

作者 Ray

RTEMS版权所有,转载请注明:来源http://www.rtems.net,作者ray@rtems.net

RTEMS可谓嵌入式系统鼻祖,经过专家的评测,其性能毫不逊色于VxWorks, 远远把RtLinux甩在后面。

正文

RTEMS是前美国军方研制的嵌入式系统, 最早用于美国国防系统,早期的名称为实时导弹系统(Real Time Executive for Missile Systems),后来改名为实时军用系统(Real Time Executive for Military Systems), 目前的全称是实时(Real Time Executive for Multiprocessor Systems)用,他的特点是非常的稳定,而且速度快。现在是一个开源项目的RTOS, 在全球还是有不少的用户,其中包括Motorola,朗讯等,他有下面的特点:

  1. 非常好的实时性能(以前是控制导弹的,再差也差不到那里去)
  2. 极其稳定
  3. 使用面向对象技术构件,剪裁性和移植性好。
  4. 包含POSIX 1003.1b API,并且支持POSIX Thread
  5. 提供pSOS+的API
  6. 提供遵循ITRON的API
  7. 体系可伸缩(也就是常说的Scalable)
  8. 多任务,支持事件驱动,优先级调度,抢占调度(preemptive scheduling)
  9. 任务间的同步与通信
  10. 优化的基于统计的单调频率RMS调度(Rate Monotonic Scheduling)
  11. 优先级高度协议PCP(Priority Ceiling Protocols)
  12. 支持优先级继承用于解决优先级反转的问题
  13. 支持多处理器体系结构(不但支持同构的处理器,也支持异构处理器比如ARM+DSP)
  14. 负责任的中断管理
  15. 高度的可配置性
  16. 提供可重入的ANSI C库
  17. 提供TCP/IP协议栈以及WebServer等服务。

注:TRON全称是 (The Real-time Operating system Nucleus),ITRON(Industrial TRON)是一个由多家著名IT企业牵头的协议制定组织,同时IRTON也代表实时嵌入式系统的一个标准。ITRON提出了实时操作系统的一系列规范(包括系统调用接口规范,任务调度接口规范,TCP/IP网路链接API规范,本地与远程调试接口规范等等),遵循这个规范的操作系统上层软件可以相互移植,有点类似于UNIX世界里面的POSIX。日本所有的大型IT公司都开发了自己的基于ITRON的嵌入式系统

此外他还提供了很多有些的附加属性:

  1. 优秀的网路支持,支持BSD套结字, TCP/IP, UDP/IP, TFTP, FTPd, HTTPd, SNMP, NTP, ICMP, ARP, DNS client, PPP, Remote Console, SNMP
  2. 支持图形界面:microwindows GUI
  3. 支持Webserver(GoAhead)
  4. 支持CORBA(omniORB)
  5. 支持大量的OpenSource库,比如:TCL, readline, zlib, ncurses, libavl
  6. 对大多数API提供C++支持(可选)
  7. 支持Ada
  8. 支持文件系统

目前RTEMS是GPL的开源项目(准确的说,是GPL的一个变种),广泛应用于军事,工业,科研等领域。很多专业的软件(比较注明的如EPICS)开始移植到RTEMS平台上。
    RTEMS从设计初始就是为较少内存与较少CPU主频的嵌入式系统提供可靠的实时内核。该系统分为若干模块,用户可以根据实际应用需要进行剪裁。     在国际控制年会Straumann的一篇报道做过如下的测试,测试的硬件平台是PowerPC 604(300MHz),Rtlinux,RTEMS和VxWorks的BSP都是由Motorola提供,测试内容包括初始化、中断处理、普通程序(包括网路程序、SPI、串口等)。测试中产生了2,000,000次中断,中断的平均频率为4kHz。可以看出,这个测试程序对内核的实时性以及任务调度都是一个严格的考验。测试的结果如下表所示:(单位10-6s)

 
中断时延
Context转换
 
系统负载中等
 
最大
平均
最大
平均
RtLinux
13.5
1.7
33.1
8.7
RTEMS
15.1
1.3
16.4
2.2
RTEMS1
14.9
1.3
16.9
2.3
VxWorks
13.1
2.0
19.0
3.1
 
重负载
RtLinux
196.8
2.1
193.9
11.2
RTEMS
20.5
2.9
51.3
3.7
RTEMS1
19.2
2.4
213
10.4
VxWorks
25.2
2.9
38.8
9.5

注:RTEMS1(使用Pthread库)

从表上的结果可以看出,RtLinux无论是实时性,还是线程任务迁移,都还远远不能满足要求。尤其是在重负载情况下,处理中断的时延波动非常厉害。想象一下,RtLinux他的中断处理平均时间是2.1us但是实际应用的时候可能要在200us才能处理。这在时间有严格要求的系统中是不能允许的。

同时也可以看到,RTEMS在测试重表现的性能指标非常理想,基本上达到或者超过老牌商业系统VxWorks。值得一提的是RTEMS在使用了Pthread库后,RTEMS的性能有所下降。但是最差的情况也不会比RtLinux差。但让人欣喜的是,目前Pthread库的性能已经有了不少改善,详情可以参考RTEMS的邮件列表。

既然我把Rtems叫做嵌入式系统里面的老大哥,它支持的CPU类型自然是非常多的,可以说只要是GCC支持的,RTEMS就可以支持。其中值得一提的是一下的CPU

  • intel的i386,i960
  • Hitachi的H8/300和SH系列
  • Motorola的MC68xxx
  • MIPS R46x0
  • OPEN CORE的OR32
  • PowerPC系列
  • SPARC系列
  • ARM系列
  • AMD 29K
  • HP PA-RISC

这些系列是比较成熟的工业级CPU,RTEMS在这些产品上面已经有多年的应用,所以对这些CPU支持的特别好。同时随着ARM和DSP的流行,RTEMS也在几年前支持了多种DSP和多个系列的ARM(ARM只是一个核心,实际的ARM芯片有上千种,一个操作系统不可能支持全部的ARM芯片)。

- 作者: lhjgood 2005年12月20日, 星期二 13:27  回复(0) |  引用(0) 加入博采