高手请进!应用程序是如何启动的?

seaglow007 2005-11-14 06:06:28
#include<stdio.h>
int a=10;
void main()
{
static int b=0;

int i;
for(i=0;i<a;i++)
{
b++;
}
printf("%d\n",b);
}

上面是一个很简单的程序,编译后生成了haha.exe文件,在windows平台下,当双击这个文件的图标后程序是如何启动的?烦请高手从程序编译、进程的生成、内存分配、代码加载等方面讲解一下,不胜感激!
...全文
342 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Major_C 2005-11-19
  • 打赏
  • 举报
回复
请问诸位:
如何用c++在windows系统中对一个进程/线程的cpu时间和使用内存数进行读取?
盼高手现身指教!
hgf1011 2005-11-16
  • 打赏
  • 举报
回复
整个过程简单来讲是这样的:
1.shell调用CreateProcess激活*.exe.
2.系统产生一个进程核心对象,引用记数为1.
3.系统为该进程建立一个4G的空间
4.链接器(也可以说加载器)将必要的代码和资源放入3中所说的4G的地址空间(资源记录于PE中)
5.系统为该进程建立一个主线程.
6.备妥STARTUP code.
7.STARTUP code调用程序之中的主函数(main()||winmain())
8.开始运行.
yuanchuang 2005-11-15
  • 打赏
  • 举报
回复
我用的是windows
main()作为一个接口传给系统,系统调用这个main()这个函数,然后就启动了
Eastunfail 2005-11-14
  • 打赏
  • 举报
回复
某某机密档案中说的:

Locate imagefile (path search)
Convert DOS name to NT name
Call NtOpenFile()
Call NtCreateSection(SEC_IMAGE)
Check for special handling: VDM, WoW64, restrictions, CMD files
Call NtQuerySection() to get ImageInformation
Use LdrQueryImageFileExecutionOptions() to see if debugging
Special handling for POSIX executable
Create the new process in the kernel via NtCreateProcessEx()
If requested, call NtSetInformationProcess(ProcessPriorityClass)
If (dwCreationFlags & CREATE_DEFAULT_ERROR_MODE)
call NtSetInformationProcess(ProcessDefaultHardErrorMode)
Call BasePushProcessParameters() to push params into new process
Stuff in the standard handles if needed
Call BaseCreateStack() to create a user-mode stack in process
Call BaseInitializeContext() to create an initial thread context
Call NtCreateThread() to create the first thread
// thread may run, so no more modification to new process virtual space
Use CsrClientCallServer(BasepCreateProcess) to register new process and thread with CSRSS
If app is restricted
Set a restricted token on the process
assign it to a job object so that it can't escape the token.
Unless the initial thread was created suspended, start it with NtResumeThread()
Major_C 2005-11-14
  • 打赏
  • 举报
回复
程序编译-〉内存分配-〉加载代码-〉进程生成
应该是这个顺序吧,我觉得这里面主要是程序编译这部分不太容易搞懂,后面和运行一个普通进程没有两样
双击相当于向操作系统输入了一个运行命令地址,之后shell会把输入的exe文件地址传入内核并调用系统函数启动一个新进程。这个启动新进程的函数根据操作系统的不同在具体实现上会有些许不同,linux下是用execv()函数族,windows下是用CreateProcess()函数,具体实现你可以查阅源代码。它们共同的功能是从内核分配出一块指定大小的内存空间,然后按该操作系统的PCB格式填写该进程的相关信息,如进程号,所在队列链表指针等。这个时候,在填写进程代码段这里时就将刚才编译好的haha.exe载入。最后,将这个PCB加入CPU等待队列等待调度运行就可以了。
xiaocai0001 2005-11-14
  • 打赏
  • 举报
回复
在Unix/Linux下的主要过程如下:

1. 主进程创建子进程
2. 分配子进程的资源(包括内存页面分配, 地址转换等工作)
3. 准备工作完毕, 该进程处于等待状态, 参与系统的进程调度.
4. 被系统调度, 得到执行机会, 则执行程序指令.

具体详细, 还是参阅书箱比较好.
xiaocai0001 2005-11-14
  • 打赏
  • 举报
回复
其他技术
alienation 2005-11-14
  • 打赏
  • 举报
回复
学学计算机操作系统就看得懂,但是说出来还要再磨练磨炼
seaglow007 2005-11-14
  • 打赏
  • 举报
回复
我操作系统只了解一些比较浅的东西,你说的有些理解不了,看来要去补一补
fflush 2005-11-14
  • 打赏
  • 举报
回复
程序加载到内存的过程,就是二进制代码和数据从硬盘读取到内存,同时建立进程所需要的相关数据的过程,这些数据主要是指PCB,即进程控制块,包括进程的软件环境,用户栈等。操作系统会为其分配一个进程空间,这句话基本上是对的,不过在虚拟内存环境下,实际可用的空间会小于所需的空间(大型的程序一般是这样)。至于代码和数据存放的区域,编译器在编译的时候会做一些分配,他会把代码放在一起,然后数据放在一起,之后就理所当然地把放代码的地方叫代码区,放数据的地方叫数据区
seaglow007 2005-11-14
  • 打赏
  • 举报
回复
谢谢fflush(stdin)!
双击后是不是操作系统首先分配一个进程空间?程序是怎么加载到内存中的,代码和数据分别在什么区域?
fflush 2005-11-14
  • 打赏
  • 举报
回复
所有的细节不是太清楚,不过可以大致说一下:
程序经过编译后会生成目标文件,具体过程可以看看编译原理,说起来就很复杂了。然后是链接,静态库函数会在这时候加入到最后生成的.exe文件中,实质上就是把静态库函数的二进制代码复制一份到你的程序中;如果是动态库函数,如dll,不会发生复制的过程,而是留下一个stub,类似于一个入口,当代码执行至此时,会转入到动态库函数的代码中,执行完了再转回来。
生成二进制的可执行文件后,在windows下如果双击他(不考虑windows下命令行对于dos的模拟了),windows将二进制文件加载到内存中,这里面包括代码和数据。在虚拟内存的环境下,可能不会加载所有的代码和数据,只需要加载到启动进程必须的数据就可以了,然后利用请求分页机制得到剩下的代码和数据。
进程准备好执行后,就加入到等待队列中,等待windows的调度,之后就是从执行到等待的,再到执行的不断切换(单处理器上模拟并行环境),最后程序执行完毕,退出
至于在执行过程中,函数调用的时的进栈出栈过程,堆中的内存如何分配,建议去看相关的书籍,说起来也很复杂
说的不对还请指正,呵
JohnTitor 2005-11-14
  • 打赏
  • 举报
回复
看看windows核心编程那本书,你的疑问都可以在书中找到答案
ifeelhappy 2005-11-14
  • 打赏
  • 举报
回复
留名,我基本上能说出来,但是组织不好
rhettxie 2005-11-14
  • 打赏
  • 举报
回复
同意楼上,留名
Featured 2005-11-14
  • 打赏
  • 举报
回复
潜力帖,留名!

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧