C-关于进程加载以及虚拟存储器的问题

C-关于进程加载以及虚拟存储器的问题

偏爱自由 发布于 2017-09-05 字数 545 浏览 1138 回复 2

问这么一个问题,比如我写了个程序,编译后成a.out,然后要运行他,unix>./a.out。这个过程就是加载他的过程,但是加载运行是不是加载到了内存还是什么?我看了是说加载可执行目标文件中的代码和数据从磁盘上拷贝到存储器,然后从程序的第一条指令运行程序。那我问一下,这里是说把代码和数据加载的内存,那虚拟存储器的作用呢?接下来加载器会创建一个存储器映像,从0x804800开始运行。我有点模糊但是不知道提什么问题。
这么说吧,程序的加载和虚拟存储器之间如何联系起来?虚拟地址是什么时候创建的?创建了之后这个存储器映像存在什么地方?cpu在里面扮演了哪些角色。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱自由 2017-10-09 2 楼

每个程序运行的时候,系统都会为其创建相应的进程,进程拥有的地址空间就是虚拟地址,这里就是你问的“虚拟地址创建”吧,其实不能说叫创建了虚拟地址,只能说创建了存储器映像,完成了虚拟地址到物理地址的映射,0x804800就是一个虚拟地址,是文本节开始的地方,这是在32位中,64位中则是从0x400000处开始的。CPU完成的是创建进程的任务,当然也就会创建出虚拟地址到物理地址的映射表,是在MMU(存储器管理单元)中,然后运行时,CPU就会指挥MMU把虚拟地址转换成物理地址,从而执行程序。
个人见解,不对还请指正

浮生未歇 2017-09-22 1 楼

程序运行需要的指令肯定是要加载到内存中的,这个毋庸置疑。
我想你这里指的虚拟存储器应该是指的页映射的机制吧,现代操作系统一般不会把程序的所有部分都加载到内存中,而是将程序分页,需要用到的时候在从存储器中加载(这个涉及到缺页错误和页面置换问题)。
创建一个进程时,操作系统会创建它的虚拟地址空间(也就是分配页目录),以后会用页表将虚拟地址空间和物理地址映射起来。还会读取可执行文件头,映射虚拟地址空间和可执行文件(在磁盘中)的对应关系,因为缺页时需要从磁盘中读取。
至于cpu,当前指令指到哪它就执行什么指令,操作系统会把cpu的指令寄存器设置好,这个是根据可执行文件头里面的信息决定的。
上述这些还涉及到操作系统的很多细节问题,可以找找可执行文件装载和操作系统方面的资料。