当前位置: 技术问答>linux和unix
一个程序如何被操作系统调用分配然后执行的呢?
来源: 互联网 发布时间:2016-12-06
本文导语: 一个程序如何被操作系统调用分配然后执行的呢? 例如一个程序,放在外存中(如硬盘),然后我点击它,就可以运行了。 那么,这个程序在硬盘上时,它有没有逻辑地址,是不是这个程序中的每条指令都有一个...
一个程序如何被操作系统调用分配然后执行的呢?
例如一个程序,放在外存中(如硬盘),然后我点击它,就可以运行了。
那么,这个程序在硬盘上时,它有没有逻辑地址,是不是这个程序中的每条指令都有一个逻辑地址,
这个逻辑地址是不是 和它所在的硬盘的物理地址相关呢?,即,放在硬盘的不同位置 这个程序的逻辑地址不一样?
书本中说 逻辑地址就是机器指令中使用的地址,80x86指令的地址字长度为48位,其中46位用于寻址,因此80x86
的逻辑地址地址空间最大可达64TB。为了支持多进程操作系统中并发进程的运行和实现存储保护,80x86存储管理机制
把64TB 的逻辑地址空间分成性质不同的两部分,全局地址空间和局部地址空间,每个地址空间最大32TB。
那么我的源程序通过编译器编译完后,生成的可执行程序中,每条指令都有逻辑地址吗?,是属于64TB 中的吗
那每次编译不同的源程序,成才的可执行程序的逻辑地址起始地址一不一样??,即是不是都从0开始?
例如一个程序,放在外存中(如硬盘),然后我点击它,就可以运行了。
那么,这个程序在硬盘上时,它有没有逻辑地址,是不是这个程序中的每条指令都有一个逻辑地址,
这个逻辑地址是不是 和它所在的硬盘的物理地址相关呢?,即,放在硬盘的不同位置 这个程序的逻辑地址不一样?
书本中说 逻辑地址就是机器指令中使用的地址,80x86指令的地址字长度为48位,其中46位用于寻址,因此80x86
的逻辑地址地址空间最大可达64TB。为了支持多进程操作系统中并发进程的运行和实现存储保护,80x86存储管理机制
把64TB 的逻辑地址空间分成性质不同的两部分,全局地址空间和局部地址空间,每个地址空间最大32TB。
那么我的源程序通过编译器编译完后,生成的可执行程序中,每条指令都有逻辑地址吗?,是属于64TB 中的吗
那每次编译不同的源程序,成才的可执行程序的逻辑地址起始地址一不一样??,即是不是都从0开始?
|
逻辑地址不同于真实的物理地址,因为逻辑地址是编译生成可执行文件的时候赋予的地址。
当处于硬盘上的代码被放入内存并且构建起来了进程映像的时候,存在虚拟内存的管理和映射,通过MMU将代码中的逻辑地址映射到真正的物理地址上去。
编译器的链接器赋予程序地址的时候,一般是不会以0开始的,一般都以0x888cccc之类的形式开始,从0开始是低地址,是属于内核或者操作系统的,一般。
对啊,指令都需要地址的,这是毋庸置疑的,只是指令是以只读的方式存在于内存的页面之中的,而数据段则是可读可写,而且,这些的物理地址都是经过了映射的。
当处于硬盘上的代码被放入内存并且构建起来了进程映像的时候,存在虚拟内存的管理和映射,通过MMU将代码中的逻辑地址映射到真正的物理地址上去。
编译器的链接器赋予程序地址的时候,一般是不会以0开始的,一般都以0x888cccc之类的形式开始,从0开始是低地址,是属于内核或者操作系统的,一般。
对啊,指令都需要地址的,这是毋庸置疑的,只是指令是以只读的方式存在于内存的页面之中的,而数据段则是可读可写,而且,这些的物理地址都是经过了映射的。
|
操作系统、计算机原理及《程序员的自我修养——链接、装载与库》等等书籍可以解答楼主的问题。
程序存在硬盘时是静态的,与其它普通文件没什么本质区别。
当它被加载到内存,就是动态的,即可执行的。
至于装载器加载可执行文件,在操作系统中运行等等详细的细节已经忘了,帮不上忙。
程序存在硬盘时是静态的,与其它普通文件没什么本质区别。
当它被加载到内存,就是动态的,即可执行的。
至于装载器加载可执行文件,在操作系统中运行等等详细的细节已经忘了,帮不上忙。
|
运行程序时,系统会生成一个新的进程,然后把程序的代码段、数据段读入,分别放入新进程的地址空间中,并分配不同的权限,比如代码段为可读可运行权限,数据段读写权限,然后进程从代码段的入口开始运行
|
需要加载到内存才运行的啦!