﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-为者常成，行者常至---hjumpyan's Tech Blog</title><link>http://www.cnitblog.com/hjumpyan/</link><description>                                             
                     
                                       人生是一个很精彩的过程。</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 05:59:57 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 05:59:57 GMT</pubDate><ttl>60</ttl><item><title>哈佛图书馆自习室墙上的训言</title><link>http://www.cnitblog.com/hjumpyan/archive/2008/01/04/38477.html</link><dc:creator>hjumpyan</dc:creator><author>hjumpyan</author><pubDate>Fri, 04 Jan 2008 10:49:00 GMT</pubDate><guid>http://www.cnitblog.com/hjumpyan/archive/2008/01/04/38477.html</guid><wfw:comment>http://www.cnitblog.com/hjumpyan/comments/38477.html</wfw:comment><comments>http://www.cnitblog.com/hjumpyan/archive/2008/01/04/38477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hjumpyan/comments/commentRss/38477.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hjumpyan/services/trackbacks/38477.html</trackback:ping><description><![CDATA[<br>
<div class=t_msgfont id=message84224374><span id=postmessage_84224374><font color=#1e90ff>哈佛图书馆自习室墙上的训言<br>1. This moment will nap, you will have a dream; But this moment study,you will interpret a dream. <br><br>2. I leave uncultivated today, was precisely yesterday perishestomorrow which person of the body implored. <br><br>3. Thought is already is late, exactly is the earliest time. <br><br>4. Not matter of the today will drag tomorrow. <br><br>5. Time the study pain is temporary, has not learned the pain islife-long. <br><br>6. Studies this matter, lacks the time, but is lacks diligently. <br><br>7. Perhaps happiness does not arrange the position, but succeeds mustarrange the position. <br><br>8. The study certainly is not the life complete. But, sincecontinually life part of - studies also is unable to conquer, <br>&nbsp;&nbsp;&nbsp;&nbsp; what but also can make? <br><br>9. Please enjoy the pain which is unable to avoid. <br><br>10. Only has compared to the others early, diligently diligently, canfeel the successful taste. <br><br>11. Nobody can casually succeed, it comes from the thoroughself-control and the will. <br><br>12. The time is passing. <br><br>13. Now drips the saliva, will become tomorrow the tear. <br><br>14. The dog equally study, the gentleman equally plays. <br><br>15. Today does not walk, will have to run tomorrow. <br><br>16. The investment future person will be, will be loyal to the realityperson. <br><br>17. The education level represents the income. <br><br>18. One day, has not been able again to come. <br><br>19. Even if the present, the match does not stop changes the page. <br><br>20. Has not been difficult, then does not have attains <br><br><br>1.此刻打盹，你将做梦；而此刻学习，你将圆梦。<br>2.我荒废的今日，正是昨日殒身之人祈求的明日。<br>3.觉得为时已晚的时候，恰恰是最早的时候。<br>4.勿将今日之事拖到明日。<br>5.学习时的苦痛是暂时的，未学到的痛苦是终生的。<br>6.学习这件事，不是缺乏时间，而是缺乏努力。<br>7.幸福或许不排名次，但成功必排名次。<br>8.学习并不是人生的全部。但，既然连人生的一部分——学习也无法征服，还能做什么呢？<br>9.请享受无法回避的痛苦。<br>10.只有比别人更早、更勤奋地努力，才能尝到成功的滋味。<br>11.谁也不能随随便便成功，它来自彻底的自我管理和毅力。<br>12.时间在流逝。<br>13.现在淌的哈喇子，将成为明天的眼泪。<br>14.狗一样地学，绅士一样地玩。<br>15.今天不走，明天要跑。<br>16.投资未来的人是，忠于现实的人。<br>17.教育程度代表收入。<br>18.一天过完，不会再来。<br>19.即使现在，对手也不停地翻动书页。<br>20.没有艰辛，便无所获。</font></span></div>
<img src ="http://www.cnitblog.com/hjumpyan/aggbug/38477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hjumpyan/" target="_blank">hjumpyan</a> 2008-01-04 18:49 <a href="http://www.cnitblog.com/hjumpyan/archive/2008/01/04/38477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实模式和保护模式</title><link>http://www.cnitblog.com/hjumpyan/archive/2007/08/06/31339.html</link><dc:creator>hjumpyan</dc:creator><author>hjumpyan</author><pubDate>Mon, 06 Aug 2007 08:47:00 GMT</pubDate><guid>http://www.cnitblog.com/hjumpyan/archive/2007/08/06/31339.html</guid><wfw:comment>http://www.cnitblog.com/hjumpyan/comments/31339.html</wfw:comment><comments>http://www.cnitblog.com/hjumpyan/archive/2007/08/06/31339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hjumpyan/comments/commentRss/31339.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hjumpyan/services/trackbacks/31339.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Times New Roman">一、Windows的消息机制&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows是一消息驱动式系统。Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的手段。应用程序要实现的功能由消息来触发，并靠对消息的响应和处理来完成。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows系统中有两种消息队列，一种是系统消息队列，另一种是应用程序消息队列。计算机的所有输入设备由Windows监控，当一个事件发生时，Windows先将输入的消息放入系统消息队列中，然后再将输入的消息拷贝到相应的应用程序队列中。应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生，到达处理它的窗口函数必须经历上述过程。值得注意的是消息的非抢先性，即不论事件的急与缓，总是按到达的先后排队(一些系统消息除外)，这就使得一些外部实时事件可能得不到及时的处理。&nbsp; <br><br>二、实模式和保护模式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.实模式：寻址采用和8086相同的16位段和偏移量，最大寻址空间1MB，最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.保护模式：寻址采用32位段和偏移量，最大寻址空间4GB，最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式，这是在保护模式下的实模式程序运行环境。<br><br>三、windows的保护模式及中断机制&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1．Windows的保护模式&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保护模式指的是线性地址由一个选择符间接生成的，该选择符指向描述表中的某一项；而实模式中则通过一个段／偏移量对来直接寻址。80386(486)CPU提供的保护模式能力包括一个64K的虚拟地址空间和一个4G的段尺寸。Windows3.1实现时有所差别，它支持标准模式和增强模式。标准模式针对286机器。增强模式是对386以上CPU而言，Windows正是使用保护模式来打破1M的屏障并且执行简单的内存保护。它使用选择器、描述器和描述器表控制访问指定内存的位置和段。描述器表包括全局描述器表局部描述器表、中断描述器表。保护模式与实模式有许多不同。其中显著的差异是访问内存的机制不同。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2．中断机制&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)实模式中断&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在实模式下，中断向量表IVT起到相当重要的作用。无论来自外部硬件的中断或是内部的软中断INTn，在CPU中都产生同样的响应。a.CPU将当前的指令指针寄存器(IP)、代码段寄存器(CS)、标志寄存器压入堆栈。b.然后CPU使用n值作为指向中断向量表IVT的索引，在IVT中找出服务例程的远地址。c.CPU将此远地垃装入CS：IP寄存器中，并开始执行服务例程。d.中断例程总以IRET指令结束。此指令使存在堆栈中的三个值弹出并填入CS、IP和标志寄存器，CPU继续执行原来的指令。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)保护模式中断&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保护模式中断过程与实模式中断过程类似，但它不再使用中断向量表IVT，而使用中断描述符表(IDT)。<br></p>
<div id=post_message_385037 style="OVERFLOW-X: hidden; FONT-FAMILY: Times New Roman">What is protected mode?<br>The 8088 CPU used in the original IBM PC was not very scalable. In particular, there was no easy way to access more than 1 megabyte of physical memory. To get around this while allowing backward compatability, Intel designed the 80286 CPU with two modes of operation: real mode, in which the '286 acts like a fast 8088, and protected mode (now called 16-bit protected mode). Protected mode allows programs to access more than 1 megabyte of physical memory, and protects against misuse of memory (i.e. programs can't execute a data segment, or write into a <span style="FONT-FAMILY: Times New Roman">code segment). An improved version, 32-bit protected mode, first appeared on the '386 CPU. <br>--------------------------------------------------------------------------------</span><br>How do real mode and protected mode differ? <br>Table 1: differences between real- and protected modes. Real Mode 16-bit Protected Mode 32-bit Protected Mode <br>Segment base address 20-bit (1M byte range) = 16 * segment register 24-bit (16M byte range), from descriptor 32-bit (4G byte range), from descriptor <br>Segment size (limit) 16-bit, 64K bytes (fixed) 16-bit, 1-64K bytes 20-bit, 1-1M bytes or 4K-4G bytes <br>Segment protection no yes yes <br>Segment register segment base adr / 16 selector selector <br><br><br><br>--------------------------------------------------------------------------------<br>I thought protected mode didn't use segmented memory...<br>The segments are still there, but in 32-bit protected mode, you can set the segment limit to 4G bytes. This is the maximum amount of physical memory addressable by a CPU with a 32-bit address bus. Limit-wise, the segment then "disappears" (though other protection mechanisms remain in effect). This reason alone makes 32-bit protected mode popular. <br>--------------------------------------------------------------------------------<br>What's a descriptor?<br>In real mode, there is little to know about the segments. Each is 64K bytes in size, and you can do with the segment what you wish: store data in it, put your stack there, or execute code stored in the segment. The base address of the segment is simply 16 times the value in one of the segment registers. <br>In protected mode, besides the segment base address, we also need the segment size (limit) and some flags indicating what the segment is used for. This information goes into an 8-byte data structure called a descriptor: <br><br>Table 2: code/data segment descriptor. Lowest byte Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Highest byte <br>Limit 7:0 Limit 15:8 Base 7:0 Base 15:8 Base 23:16 Access Flags, Limit 19:16 Base 31:24 <br><br>This is a 32-bit ('386) descriptor. 16-bit ('286) descriptors have to top two bytes (Limit 19:16, Flags, and Base 31:24) set to zero. The Access byte indicates segment usage (data segment, stack segment, code segment, etc.): <br><br>Table 3: access byte of code/data segment descriptor. Highest bit Bits 6, 5 Bit 4 Bits 3 Bit 2 Bit 1 Lowest bit <br>Present Privilege 1 Executable Expansion direction/ conforming Writable/ readable Accessed <br><br><br>Present bit. Must be set to one to permit segment access. <br>Privilege. Zero is the highest level of privilege (Ring 0), three is the lowest (Ring 3). <br>Executable bit. If one, this is a code segment, otherwise it's a stack/data segment. <br>Expansion direction (stack/data segment). If one, segment grows downward, and offsets within the segment must be greater than the limit. <br>Conforming (code segment). Privilege-related. <br>Writable (stack/data segment). If one, segment can be written to. <br>Readable (code segment). If one, segment can be read from. (Code segments are not writable.) <br>Accessed. This bit is set whenever the segment is read from or written to.<br>The 4-bit Flags value is non-zero only for 32-bit segments: <br>Table 4: flags nybble. Highest bit Bit 6 Bit 5 Bit 4 <br>Granularity Default Size 0 0 <br><br>The Granularity bit indicates if the segment limit is in units of 4K byte pages (G=1) or if the limit is in units of bytes (G=0). <br><br>For stack segments, the Default Size bit is also known as the B (Big) bit, and controls whether 16- or 32-bit values are pushed and popped. For code segments, the D bit indicates whether instructions will operate on 16-bit (D=0) or 32-bit (D=1) quantities by default. To expand upon this: when the D bit is set, the segment is USE32, named after the assembler directive of the same name. The following sequence of hex bytes:<br><br>B8 90 90 90 90<br>will be treated by the CPU as a 32-bit instruction, and will disassemble as<br>mov eax, 90909090h<br>In a 16-bit (USE16) code segment, the same sequence of bytes would be equivalent to<br>mov ax,9090h<br>nop<br>nop<br>Two special opcode bytes called the Operand Size Prefix and the Address Length Prefix reverse the sense of the D bit for the instruction destination and source, respectively. These prefixes affect only the instruction that immediately follows them. <br>Bit 4 of the Access byte is set to one for code or data/stack segments. If this bit is zero, you have a system segment. These come in several varieties:<br><br>Task State Segment (TSS). These are used to simplify multitasking. The '386 or higher CPU has four sub-types of TSS. <br>Local Descriptor Table (LDT). Tasks can store their own private descriptors here, instead of the GDT. <br>Gates. These control CPU transitions from one level of privilege to another. Gate descriptors have a different format than other descriptors:<br>Table 5: gate descriptor. Lowest byte Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Highest byte <br>Offset 7:0 Offset 15:8 Selector 7:0 Selector 15:8 Word Count 4:0 Access Offset 23:16 Offset 31:24 <br><br>Note the Selector field. Gates work through indirection, and require a separate code or TSS descriptor to function. <br>Table 6: access byte of system segment descriptor. Highest bit Bits 6, 5 Bit 4 Bits 3, 2, 1, 0 <br>Present Privilege 0 Type <br><br>Table 7: System segment types. Type Segment function Type Segment function <br>0 (invalid) 8 (invalid) <br>1 Available '286 TSS 9 Available '386 TSS <br>2 LDT 10 (undefined, reserved) <br>3 Busy '286 TSS 11 Busy '386 TSS <br>4 '286 Call Gate 12 '386 Call Gate <br>5 Task Gate 13 (undefined, reserved) <br>6 '286 Interrupt Gate 14 '386 Interrupt Gate <br>7 '286 Trap Gate 15 '386 Trap Gate <br><br>Whew! For now, just remember that TSSes, LDTs, and gates are the three main types of system segment. <br><br><br>--------------------------------------------------------------------------------<br>Where are the descriptors?<br>They are stored in a table in memory: the Global Descriptor Table (GDT), Interrupt Descriptor Table (IDT), or one of the Local Descriptor Tables. The CPU contains three registers: GDTR, which must point to the GDT, IDTR, which must point to the IDT (if interrupts are used), and LDTR, which must point to the LDT (if the LDT is used). Each of these tables can hold up to 8192 descriptors. <br>--------------------------------------------------------------------------------<br>What's a selector?<br>In protected mode, the segment registers contain selectors, which index into one of the descriptor tables. Only the top 13 bits of the selector are used for this index. The next lower bit choses between the GDT and LDT. The lowest two bits of the selector set a privilege value. <br>--------------------------------------------------------------------------------<br>How do I enter protected mode?<br>Entering protected mode is actually rather simple, and is is described in many other tutorials. You must:<br>create a valid Global Descriptor Table (GDT), <br>(optional) create a valid Interrupt Descriptor Table (IDT), <br>disable interrupts, <br>point GDTR to your GDT, <br>(optional) point IDTR to your IDT, <br>set the PE bit in the MSW register, <br>do a far jump (load both CS and IP/EIP) to enter protected mode (load CS with the code segment selector), <br>load the DS and SS registers with the data/stack segment selector, <br>set up a pmode stack, <br>(optional) enable interrupts.<br><br>--------------------------------------------------------------------------------<br>How do I get back to Real Mode?<br>On the '386:<br>disable interrupts, <br>do a far jump to a 16-bit code segment (i.e. switch briefly to 16-bit pmode), <br>load SS with a selector to a 16-bit data/stack segment, <br>clear the PE bit, <br>do a far jump to a real-mode address, <br>load the DS, ES, FS, GS, and SS registers with real-mode values, <br>(optional)set IDTR to real-mode values (base 0, limit 0xFFFF), <br>re-enable interrupts.<br>Before returning to real mode, CS and SS must contain selectors pointing to descriptors that are "appropriate to real mode". These have a limit of 64K bytes, are byte-granular (Flags nybble=0), expand-up, writable (data/stack segment only), and present (Access byte=1xx1001x). <br>On the '286, you can't simply clear the PE bit to leave protected mode. The only way out is to reset the CPU. This can be done by telling the keyboard controller to pulse the reset line of the CPU, or it can be done by triple-faulting the CPU (see Robert Collins' web site: <a href="http://www.x86.org/" target=_blank><font color=#000000>www.x86.org</font></a>). <br><br><br>--------------------------------------------------------------------------------<br>What pitfalls have you encountered?<br>You must pay extreme attention to detail here. One wrong bit will make things fail. Protected mode errors often triple-fault the CPU, making it reset itself. Be prepared to see this happen again and again. <br>Most library routines probably won't work. printf(), for example, won't work because it evenutally calls either a DOS or BIOS service to put text on the screen. Unless you have a DOS extender, these services are unavailable in protected mode. I had good luck using sprintf() to put formatted text in a buffer, which I then wrote to the screen with my own protected-mode routine. <br>Before clearing the PE bit, the segment registers must point to descriptors that are appropriate to real mode. This means a limit of exactly 0xFFFF (see other restrictions above). One of my demo programs had ES pointing to a text-video segment. With a limit of 0xFFFF, things worked swimmingly. With a limit of 3999 (80 * 25 * 2 - 1), the system froze up after returning to real mode and trying to use the ES register. <br>Actually, for DS, ES, FS and GS, the segment limit must be 0xFFFF or greater. If you give the segment a limit of 0xFFFFF and make it page-granular, you can access up to 4G of memory from real mode. This has been dubbed unreal mode. However, limits other than 0xFFFF (or page-granularity) for CS or SS cause big problems in real mode. <br>You can not use the '286 LMSW instruction to clear the PE bit. Use MOV CR0, nnn. <br>Load all segment registers with valid selectors after entering protected mode. I forgot to do this with ES. A protected-mode routine pushed ES, loaded it with a valid selector, and used it. When it tried to pop the old, invalid (real-mode) selector back into ES, it crashed. <br>The IDTR must also be reset to a value that is appropriate to real-mode before re-enabling interrupts (see above). <br>Not all instructions are legal in real mode. If you attempt to use task state segments for multitasking, note that executing the LTR instruction in real-mode will cause an illegal instruction interrupt. <br>Descriptor tables in ROM? Section 10.4.3 of 386INTEL.TXT states <br>The GDT (as well as LDTs) should reside in RAM, because the processor modifies the accessed bit of descriptors. <br>However, one of my sources (thanks Vinay) states that later CPUs will not attempt to set the Accessed bit in a descriptor if that bit is already set. Check the docs for the CPU you are using. <br>The naive code described here will crash if the PC is in Virtual 8086 (V86) mode. This is a fourth mode of operation found on the 386 CPU, with addressing similar to real mode but some of the protection mechanisms of protected mode. You may know that a Windows (or OS/2, or Linux) DOS box runs in V86 mode, but you may not realize that memory managers such as EMM386 also put the CPU in V86 mode.<br>If you want to start simple, try these tips:<br>Don't worry about returning to real mode. Use the reset button <img class=inlineimg title=微笑 alt="" src="http://www.linuxsir.org/bbs/images/smilies/smile.gif" border=0> <br>Leave interrupts disabled. <br>Don't use an LDT. <br>Put only four descriptors in the GDT: null, code, stack/data, and text video. <br>Set the segment bases to real-mode values i.e. 16 * real-mode segment register value. This lets you address variables in the same way in both real and protected modes. <br>Set all segment limits to their maximum (0xFFFF for 16-bit protected mode). <br>Leave all privilege values set to 0 (Ring 0, highest privilege). <br>Install some crude exception handlers that simply scribble a message into video memory then halt:<br>void unhand(void)<br>{ static const char Msg[]="U n h a n d l e d I n t e r r u p t ";<br><br>disable();<br>movedata(SYS_DATA_SEL, (unsigned)Msg,<br>LINEAR_SEL, 0xB8000,<br>sizeof(Msg));<br>while(1); }<br>The alternating spaces in the message are treated as attribute bytes by the PC video hardware, making the text an eye-catching black on green. Put an interrupt gate in the appropriate (all?) descriptor of the IDT, with a selector to your code segment in the trap gate's selector field, and the address of this routine in its offset field.</div>
<img src ="http://www.cnitblog.com/hjumpyan/aggbug/31339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hjumpyan/" target="_blank">hjumpyan</a> 2007-08-06 16:47 <a href="http://www.cnitblog.com/hjumpyan/archive/2007/08/06/31339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows embedded</title><link>http://www.cnitblog.com/hjumpyan/archive/2007/08/02/31126.html</link><dc:creator>hjumpyan</dc:creator><author>hjumpyan</author><pubDate>Thu, 02 Aug 2007 02:41:00 GMT</pubDate><guid>http://www.cnitblog.com/hjumpyan/archive/2007/08/02/31126.html</guid><wfw:comment>http://www.cnitblog.com/hjumpyan/comments/31126.html</wfw:comment><comments>http://www.cnitblog.com/hjumpyan/archive/2007/08/02/31126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hjumpyan/comments/commentRss/31126.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hjumpyan/services/trackbacks/31126.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows Embedded是微软嵌入式技术和产品的总称，它是微软专门为嵌入式智能设备开发的窗口操作系统。目前微软的Windows Embedded家族主要包括两个产品：Windows CE和Windows XP Embedded。目前Windows CE的最新版本为Windows CE 6.0，Windows XP Embedded的最新版本为Windows XP Embedded SP2。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Microsoft Windows CE将先进、实时的操作系统和功能强大的开发工具有机地融合为一体，帮助开发人员快速创建下一代智能、互连、低资源占用的设备。Windows CE为构建、调试和部署基于Windows CE的设备提供了完整的操作系统功能集和丰富的开发工具。Microsoft Windows XP Embedded是主导业界的桌面操作系统Windows XP Professional的组件化版本，能够快速开发出最可靠、功能最完备的互连设备。基于与Windows XP Professional完全相同的二进制代码，Windows XP Embedded使开发人员能够为定制的、缩减型的嵌入式设备独立地选择所需的丰富功能。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows CE和Windows XP Embedded都是为嵌入式应用而设计的，虽然它们都使用Win32编程模型，但Windows CE是一个全新设计的操作系统，并不是桌面Windows的精简版本，它仅是Win32 API的一个子集，所以桌面Windows的应用程序不能在Windows CE上运行，同样，Windows CE下的应用程序一般也不能在桌面Windows上运行。但由于Windows XP Embedded是Windows XP Professional的组件化版本，所以桌面Windows的应用程序或驱动程序可以直接在Windows XP Embedded上运行。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从1996年Windows CE诞生起，到今天的十来年间，先后经历了Windows CE 1.0,Windows CE 2.0/2.11/2.12,Windows CE 3.0,Windows CE.NET 4.0/4.1/4.2,Windows CE 5.0,Windows CE 6.0版本，取得了巨大的成功。同时，在Windows CE的不断发展过程中，也派生出了像PC(H/PC)、Palm-Size PC、Pocket PC、Smartphone等一批以Windows CE 为核心的设备平台。目前，以Windows CE为核心的Windows Mobile已经发展成为一个独立的分支，在Pocket PC和Smartphone市场取得了巨大成功。同样，以Windows CE为核心的Windows Automotive也正在走向成熟。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows Mobile是微软为Pocket PC和Smartphone设备开发的软件平台。Windows Mobile是Windows CE的一个重要分支，它的底层采用和Windows CE完全相同的二进制代码，其开发过程与开发工具也基本相同。但是，Windows CE和Windows Mobile也有明显差别：<br>1.Windows Mobile针对的是Pocket PC和Smartphone的专业市场，它是在Windows CE通用平台的基础上，微软针对Pocket PC和Smartphone设备的特点做了很多定制，然后再加上Pocket PC和Smartphone设备特定的应用程序组件构成的软件开发平台。<br>2.Windows Mobile使用单独的开发包，Windows CE开发工具中并不包含Windows Mobile开发包，Windows Mobile开发包需要从微软单独购买。Windows CE操作系统开发与Windows Mobile操作系统开发有一定的差别，使用Platform Builder for Windows CE不能开发Windows Mobile操作系统。但在应用程序开发方面，只要安装了相应的SDK，就可以使用Windows CE的应用程序开发工具如Embedded Visual C++和Visual Studio.NET等为Windows Mobile开发应用程序。<br>3.由于Windows Mobile针对专业市场，因而目前Pocket PC和Smartphone设备的硬件基本上已经标准化，除了设备厂家需要定制开发操作系统外，绝大多数的开发集中在应用程序开发上面。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows Automotive是微软第一个基于Microsoft.NET连接的、具有语音功能的、用于创建下一代汽车平台的软件，它基于Windows CE操作系统，是微软第一个包含.NET Compact Framework的远程信息处理平台，为用户提供了更大范围访问Web服务和其他由Windows驱动的设备能力。Windows CE.NET提供的许多操作系统特征都可以用来创建或加强汽车平台和汽车应用程序，同时，Windows Automotive为更好、更快地创建基于Windows CE的汽车计算专用平台提供了所需的模块、组件和应用程序编程接口。Windows Automotive平台开发工具是微软为Windows CE开发的一个增值包，其名称为AAK(Automotive Adaptation Kit),需从微软单独申请定制或购买。AAK需要与Platform Builder一起来创建Windows Automotive平台。<br></p>
<img src ="http://www.cnitblog.com/hjumpyan/aggbug/31126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hjumpyan/" target="_blank">hjumpyan</a> 2007-08-02 10:41 <a href="http://www.cnitblog.com/hjumpyan/archive/2007/08/02/31126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>