Ⅰ C++的 Windows程序内部运行原理
学习C++与.net不同的是,一定要搞清楚Windows程序内部运行原理,因为他所涉及大多数是操作系统的调用,而.net毕竟是在.netFrameWork上唱戏。
那Windows应用程序,操作系统,计算机硬件之间的相互关系究竟什么了,下面的图就给予很好的解释。
向下箭头①是 应用程序运行判断处理的结果,输出到输出的设备。
向上箭头②是输入设备,输入到操作系统中。
向下箭头③代表API,我们要解释以下API是什么。API是应用程序接口,表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。这个关系好比有个机器人能够完成行走的功能,但是,如果人们不告诉它往哪个方向上走,机器人是不会主动行走的。这里的机器人就是操作系统,人们就是应用程序。 对程序员来说,就可以理解为可以调用函数库,C++程序员是对操作系统的同用。Java中调用的API是jdk中提供的函数库,而。net程序员则是.netframework提供的函数库。
向上的箭头④表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按敲了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的哪一键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个司机开车看见前面遇到一辆车,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将踩刹车,停下来,或是英勇撞上去(则是一个sb做法)。对事件作出反应。
操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的'。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。
MSG结构定义如下:
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;的过程就是消息响应。
其实,写在这里,作为一个做过3年.net开发人员。我这里有感而发,C++是如此,.net事件响应的机制。何尝不是一个消息机制。 消息机制,是程序界一大质的飞跃,而也是这种消息机制,把.net程序员的控件封装太死, 也造就一大批只能拖控件的程序员。 我学了C++还是真的有一种豁然开朗的感觉。.net程序员,还是多看点C++吧!
Ⅱ 各位哥哥 请问电脑开机时内部程序是怎样一步步执行的 比如先是什么程序引导
第一步:当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让 CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号),CPU马上就从地址 FFFF0H处开始执行指令,从前面的介绍可知,这个地址实际上在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。
第二步:系统BIOS的启动代码首先要做的事情就是进行POST(Power-On Self Test,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。在正常情况下,POST过程进行得非常快,我们几乎无法感觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。
第三步:接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡 BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。
第四步: 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。
第五步: 接着系统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和Windows的基本引导代码就是分区引导记录)。
Ⅲ 单片机程序编好后烧到板子里单片机内部是如何识别并执行这些指令呢
每个单片机都有一个共同的特点,就是启动时候一定会挑到指定的位置去执行这个位置的代码,你只要吧代码写到这个地方,那么肯定一启动就执行这个地方的代码;高级点的,内置一个简单的boot程序,可以去读SD卡或者Flash芯片,那么就可以做到不用ROM直接运行;
Ⅳ IE浏览器中如何安全地调用本地可执行程序
通常,浏览器中是禁止运行本地可执行程序的。但不允许浏览器运行,客观上限制了浏览器的用途和作用。要解决此问题,必须安全扩展浏览器的功能。扩充浏览器的功能,一是采用控件或插件技术,二是采用小程序技术。市场上的主流浏览器,如IR和Netscape均支持这两种技术。控件或插件多用VC、BC++、VB和Delph等语言开发。小程序一般是由,iava语言来编程的。众所周知,java语言通过“砂箱”机制禁止访问本地文件系统,更谈不上调用本地程序运行,要通过浏览器调用本地可执行程序,需使用控件或插件技术。一、安全调用本地程序的要求浏览器中调用本地程序起码要解决两个问题,一是安全性,二是位置透明性。 由于浏览器运行在客户端,安全性非常重要,如果安全性不能解决,运行在浏览器中的恶意控件轻则可能传播病毒、破坏本地文件系统,重则造成计算机系统瘫痪和信息泄密。浏览器中均有默认的安全级别,IE浏览器默认的是中级安全级别。在此安全级别下要让浏览器启动运行本地可执行程序.一早要杷榨件标记为可安全执行的。二是要对控件做数字签名。把控件标记为可安全执行的含义是要在控件中实现必需的Iknown接口外,还要实现“对象安全”接口,这样控件才能与浏览器协调一致的工作。对控件做数字签名就是采用非对称加密算法将散列函数处理后的控件散列值做加密,以保证控件的完整性和不可否认性。如果对控件不做安全标记,也不进行数字签名,要想在本地运行可执行程序,就必须降低浏览器的安全性。浏览器的安全性降低后,对于内部网络似乎问题不是很大,但要在internet上,那就给病毒、黑客人侵打开了方便之门。除非有充足的理由,一般情况下,决不可随便降低浏览器的安全性。 所谓位置透明性就是运行可执行程序与位置无关,无论其放在何处都能正常运行。位置透明性对写过控件的人并不陌生,Windows中无处不在,控件无一例外都是位置透明的。其解决办法是使用一个128位的clsid来唯一标识。clsid在HTML页面中和系统的注册表中随处可见。在使用控件时,无论是手工还是系统自动注册都是在注册表中建立clsid和控件路径的映射关系。通过这种映射关系自动解决了位置透明性。 我们也可通过注册表解决运行程序的位置透明性问题。这里的映射关系可建立成应用程序名和可运行程序路径之间的映射关系。用应用程序名来唯一地标识可执行程序,其相当于控件的cMd,用安装程序来安装可执行程序,相当于控件注册。Windows中通过安装程序安装的可执行程序,其键值均在HKEY_LOCAlMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\中,用流行的的InstallShield安装软件不难实现。调用本地可执行程序时在注册表中查找其安装路径,结合应用程序名和注册表键值中记录的执行程序路径,即可找到本地可执行程序,原理与控件的动态加载运行完全一致。二、实现机理 用支持控件的开发工具,如VC、VB等开发一个调用本地可执行程序的控件,可命名为Cyxm—LocalCallCtrl,除了实现必需的Iknown接口外,还要实现IObjectSafety接口,即前面提到的“安全对象”接口。再实现一个调用本地可执行程序的函数,如localCall(),开发完成后对控件做数字签名就可使用了。1.IObjectSafety接口该接口的核心是以下的两个函数:STDMETHODIMP CYxmLocalCallCtrl::XObjectSafety:: GetInterfaceSafetyOptions( REFIID riid, DWORD——RPC—FAR*pdwSupportedOptions, DWORD——RPC—FAR*pdwEnabledOptions ), STDMETHODIMP CYxmLocalCallCtrl::XObjectSafety::Set— InterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions ) 这两个函数只是用对象嵌套的方式实现的一个样例,如果用对象聚合的方式实现它,可能不是这个样子,但接口参数和函数名是不会发生变化的。对这两个函数的编码并不复杂,如果你不需要做什么,其函数体可以不用写任何代码,简单地返回就可以了。之所以写这两个函数是浏览器的要求,其加载控件时,要调用这两个函数,也就是浏览器要求你承认你写的控件是安全地。这是前面所述标记为安全脚本的技术含义。其实IE浏览器支持的接口很多,如IDispatch、IHTML-Document2、IHTMLDocument、IHTMLCollection、I-HTMLFormElement、IHTMLInputTextElement等等。扩充其功能都是通过实现它们完成的。如有些文章中介绍的通过IE浏览器窃取网页中的用户名和密码也是利用这种原理。2.数字签名 对控件做数字签名首先要制作数字证书,数字证书可从数字认证中心申请得到。如果不想付费,而自己的网络又无数字认证中心,可用VC提供的工具来完成。具体做法是,用MakeCert.Exe制作数字证书,用CabArc.Exe制作压缩包,用signcode.exe进行数字签名。完成数字签名后,将控件部署到web中,即可使用。3.使用控件 如果想通过浏览器调用word.exe字处理软件,在页面中插入如下的代码和脚本程序,即可启动。不要忘了容错处理,即系统中未安装可执行程序的情况下,也要保证浏览器流畅运行。
Ⅳ 51单片机执行程序的过程
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。
一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。
下面我们将举个实例来说明指令的执行过程:
开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取
出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。
例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,
0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:
1 程序计数器的内容(这时是0000H)送到地址寄存器;
2 程序计数器的内容自动加1(变为0001H);
3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;
4 CPU使读控制线有效;
5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。
至此,取指阶段完成,进入译码分析和执行指令阶段。
由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。
Ⅵ 刚学c语言不懂。 当一个程序编写好后,运行它,计算机具体是如何处理的
首先你在编辑编译器上写代码的过程叫做编辑,编写的代码叫源代码,随后你点击编译,这时候你的源代码就相应的转换为目标代码,也就是计算机能够识别的0、1代码,随后你点击连接,这个时候代码将你头文件内容以及除主函数外的其他文件的函数连接起来生成可执行代码,最后就是执行了。
Ⅶ 一个exe文件怎么运行起来的
从OS层说起吧。 OS都有加载程序的功能,一个可执行文件(比如exe,com等)内部都是机器指令(cpu相关的)和数据,所以可执行文件和OS以及编译器是密切相关的,不同的OS下不同的编译器产生的可执行文件都不尽相同。不同的平台上其格式大概有elf,pe,coff等。大致都是段的形式来表示。而OS的功能就是读懂这些文件然后完成从磁盘文件到内存的映射工作,也就是适当的时候把文件的内容搬到内存适当的位置; OS加载的过程就是进程创建的过程,进程创建完毕后,会找到入口函数去执行; 进入入口函数后就等于进入了运行库,因为入口函数就是运行库的一部分; 入口函数开始初始化运行程序和程序的运行环境,比如堆的初始化,I/O初始化,线程的准备,全局变量等的初始化; 下一步就进入程序的主体,也就是调用main函数部分。 main函数执行结束后又回到入口函数,此时入口函数要进行一些清理工作。 清理完成后执行一个系统调用来kill掉进程。 OK,一个可执行文件的整个执行周期就结束了。 对于c语言,运行库叫crt(c runtime),linux下的crt为glibc,它的程序入口函数为_start,是由汇编语言实现的,包含在crt1.o这个目标库文件里。在windows下crt为msvc crt,它的入口函数是mainCRTStartup。对于每个程序,链接过程都会给你的可执行程序加进一些运行库目标文件,这样才保证你的程序是一个独立的可执行体。正式这些额外的代码把你的main函数调用起来的。 一般在链接程序的时候须指定入口函数名。
Ⅷ 怎么让电脑从睡眠模式自动唤醒并执行某个程序
计算机进入睡眠状态内部程序不会继续运行。
计算机睡眠(Sleep)是计算机由工作状态转为等待状态的一种新的节能模式。其开启方式是在电脑系统的开始菜单中点击电源按钮右侧的下拉箭头选择“睡眠”按钮。开启睡眠状态时,系统的所有工作都会保存在硬盘下的一个系统文件,同时关闭除了内存外所有设备的供电。
睡眠是待机+休眠的方式,不光机器仅提供维持内存数据不丢失所需要的工作(像待机一样),还把当前状态存入硬盘(像休眠一样)。 如果在睡眠过程中不断电,那么,就不从硬盘读数据了,用内存数据直接恢复机器状态,象从待机中恢复一样。如果断了电,那就从硬盘读入数据,象休眠一样。
Ⅸ 电脑的EXE文件怎么在手机上执行
材料/工具:
手机
bochs (win模拟器)
系统镜像 c.img
方法:
1、首先要先下载bochs这一款系统模拟器apk
拓展资料:
EXE File可执行程序一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为·exe。WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为·COM另一种就是·EXE 。.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是·EXE文件在 MS-DOS 中,用以标识可执行文件的文件扩展名。用户在提示行中输入不带 .exe 扩展名的文件名后按 Enter 键就能运行可执行程序。