linux下程序的执行

比如说linux下的vi编辑器这个程序,它被执行的时候肯定要载入内存,比如第一条指令就是movds,ax吧,那么它被载入的时候,系统肯定要为它分配内存了,比如说就是0x3... 比如说linux下的vi编辑器这个程序,它被执行的时候肯定要载入内存,比如第一条指令就是mov ds,ax吧,那么它被载入的时候,系统肯定要为它分配内存了,比如说就是0x3000 0000吧,那么CPU要执行mov ds,ax的时候,为什么首先看到的是虚拟地址【一个虚拟的不存在的地址CPU如何看得到???】,要进过一系列的变换之后才到ox3000 0000上取出指令来执行呢 展开
 我来答
LYQGXH
推荐于2016-08-04 · TA获得超过409个赞
知道小有建树答主
回答量:314
采纳率:100%
帮助的人:231万
展开全部
你要是写过单片机或者嵌入式之类的程序开发,你就不会对这个无法理解了,
我是这么理解的,首先对于CPU来说它‘看’到的永远是真实的地址,你想CPU就是一个硬件,它懂什么虚拟。所以说虚拟地址是对于应用程序来说的,比如说VI,它被执行的时候的确是要分配内存,但是,是谁分配?是linux!也就是说比如vi是你写的程序,你写mov ds,ax的时候分给你的0x30是linux的个程序给你的,它对应的实际的地址并不一定就是内存的0x30,也有可能是0x40,或者其他的,但是你并不用去想它对应哪个,你只要用就行了。进行的一系列变换也是linux操作系统在做这件事情。linux变换后得到一个真实的地址给CPU然后cpu去执行,也就是说在应用程序和CPU之间有一个操作系统在做怪。
为什么要搞得这么麻烦,那是为了多个程序能够不干扰。在以前单任务的时代,是没有虚拟内存这一说法的。后来多任务的CPU出来了,就必须要有虚拟内存了,
这么说吧,比如你的电脑有0x00到 0x10这10个内存地址,你一开机就有一个A程序运行了,比如说360之类的杀毒程序,它是会用到内存的,但是你又不知道它用了哪些内存,它可能现在用0x00等一下又去用0x10。如果只有它一个程序在运行那是完全没有问题的,但如果你又写了一个B程序,你也要用内存,但是你又不能同时和A程序用同一个内存(用同一个会出错),你就要知道A程序什么时间会用什么内存,如果你不知道,你写的程序就会和其他程序冲突,如果有几十个程序一起运行的话冲实就会更严重。所以就要有一个‘人’来管理内存。这个人就是linux操作系统,这样一来每一个程序在用内存时候都要向linux申请,由它来分配内存给你。比如A分配为0x00到0x05,B分配为0x06到0x10,这样就各用各的了,但是这样还不够完美,因为每次分配的内存地址是不确定的,有时候可能B分到了0x00 到0x05 ,这样一来B程序还是很难写,你要考虑的东西还是很多,所以就要 ‘虚拟’一下,就是说不管你分配到的是0x00 也好还是分到0x06也好,你写程序时‘看’到的都是0x00到0x05,这样一来你就不用去管内存份配的问提,可以专心写你的程序了,也不用去担心和其他程序有冲突,因为linux操作系统帮你解决了。
猪头帮帮主麦兜
2012-12-31 · TA获得超过790个赞
知道小有建树答主
回答量:514
采纳率:0%
帮助的人:683万
展开全部
首先,Linux下的可执行程序一般是ELF格式文件,ELF文件有一个包含一些特殊结构的文件头、程序头表、节、节头表等,文件头的内容自行看Elf header的相关资料,这里要说的是一个名为入口地址的参数和一些节(section)的信息,每个节可以分别理解为不同的代码段、数据段甚至是堆栈段。
当ELF程序被加载进内存之后,保护模式下的操作系统首先为整个应用程序分配一个虚拟的、完整的内存地址,然后读取各个section的信息,按照这些信息把section加载到它们各自需要定位的内存地址中,简单来说,就是定好偏移量后装进地址,这样一来程序里边就可以按照写程序时指定的变量偏移定位变量。
要注意的是,现在的操作系统上,ds之类的是可以无视的,因为无论是32位操作系统还是64位操作系统,偏移量就足够寻址了,段寄存器只是用来区分TSS、栈和一些特殊段的,这一块的详细解释你可以看看关于LDT和GDT的文档。
按照上文,实际上每个程序看到自己都占据了完整的所有可用内存,而实际上程序看到自己所在的内存是经过分页机制翻译过的虚拟内存。
那么虚拟内存是怎么实现的?这是CPU原生支持的分页机制,对于X86架构的CPU来说,分页意味着页表+页目录的模式。首先是页目录,页目录是一个描述各个页表所在位置的连续数组,页目录的起始地址(实际的内存物理地址)被记录在一个专用寄存器cr3中,页目录的每一项描述一个页表所在的位置(也是物理地址),通过页目录和页表两级转换,线性的、连续的内存被分割为一个个页面,这些页面可以任意顺序组合成连续的虚拟地址,然后这一块的详细说明,同样还是自己深入挖坑吧,名词分别是PDE和PTE。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
loleyz
2012-12-31 · TA获得超过737个赞
知道小有建树答主
回答量:1078
采纳率:0%
帮助的人:783万
展开全部
你最好先看看通用操作系统原理教程。这样好理解。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式