成功心法(7):如果提高自身的技术修养(1)
2012-06-09 01:49
162 查看
程序运行到main()函数之前,CPU做了那些事情?main()是程序运行的第一个函数吗?
你是否真的明白——编译、链接、重定位以及虚拟地址?
或许,你不需要知道和理解这些知识就能够编程,而且工资还很高,但这些都不是你不知道的理由。
在早期的计算机中,由于所有程序在运行时所访问的地址都是物理地址,所以各个程序所使用的地址空间不是互相隔离的,如果因为“Bug”不小心改写了其它程序的数据,那么对于实时系统来说,这是不能容忍的。因为用户非常希望做到,即使其中一个模块出现了问题,至少不要影响其它功能的正常运行。
由于缺乏有效的内存管理机制,监控程序必须将所有的程序装入内存(RAM)中才能开始运行,从而造成内存的使用效率极低。如果突然要运行一个程序A,由于内存空间不够,这时只好将其它程序的数据暂时保存到其它存储介质(磁盘)中,等到要用时再读回来。由于程序所需要的空间是连续的,有可能将程序B保存到存储介质中所释放出来的内存空间不够,那么只好将程序C再换到存储介质中,然后才将程序A读入内存开始运行。由于内存释放出来的地址的不确定性,有可能是0x3000,也有可能是0x5000,而程序转移的目标地址却是固定的,比如,0x2000,这就要涉及到程序的“重定位”问题。其实“重定位”就是给程序中的每个地址重新确定它在物理内存中的位置。
在程序编写的过程中,经常会涉及到主程序调用子程序的情况。编译程序将源程序翻译成二进制机器码时,事实上各个模块都是分开翻译(编译)的,因为在翻译主程序时并不知道子程序的地址,所以只好暂时将调用子程序的指令的目标地址搁置,等到合适的时候才将每个调用子程序的指令修正,然后再填入正确的转移地址参数(链接)。当程序装入内存时,这些位置又要重新计算,那么重新修改目标地址的过程就是重定位。
怎样把编译程序解放出来,使得其在编译时并不关心物理内存的地址,而按自己的意愿给程序编址?唯一的解决办法就是增加中间层,即使用一种间接的编址方式,也就是对程序中的指令连续的编址,这些地址不是真正的物理地址,而是一种“虚拟地址”(或称逻辑地址),然后通过某些映射方法,将这个虚拟地址转化为物理地址。通过前面的学习,大家已经知道,物理地址是实实在在存在的,80C51系列单片机有16条地址线,所以可以支持64KB的存储空间。而虚拟地址空间则是一种逻辑空间,就像我们给一个班的学生编学号一样,这些学号的集合就是一种虚拟(逻辑)空间,每个班的同学都有从学号1开始的独立地址空间,由此可以推知,每个运行的程序都有自己独立的虚拟空间,而且每个运行的程序只能访问自己的地址空间,这样就能做到程序在运行时的有效隔离,从而大大地提高了系统的安全性。
虚拟存储的实现需要依靠硬件的支持,比如,32位ARM9以上的CPU,用其内部集成的MMU(Memory Managemnet Unit)来进行页映射,在页映射下,CPU接收到的地址是虚拟地址,经过MMU转换以后就变成了物理地址。由于80C51系列单片机没有MMU,所以无法实现虚拟内存管理机制。
你是否真的明白——编译、链接、重定位以及虚拟地址?
或许,你不需要知道和理解这些知识就能够编程,而且工资还很高,但这些都不是你不知道的理由。
在早期的计算机中,由于所有程序在运行时所访问的地址都是物理地址,所以各个程序所使用的地址空间不是互相隔离的,如果因为“Bug”不小心改写了其它程序的数据,那么对于实时系统来说,这是不能容忍的。因为用户非常希望做到,即使其中一个模块出现了问题,至少不要影响其它功能的正常运行。
由于缺乏有效的内存管理机制,监控程序必须将所有的程序装入内存(RAM)中才能开始运行,从而造成内存的使用效率极低。如果突然要运行一个程序A,由于内存空间不够,这时只好将其它程序的数据暂时保存到其它存储介质(磁盘)中,等到要用时再读回来。由于程序所需要的空间是连续的,有可能将程序B保存到存储介质中所释放出来的内存空间不够,那么只好将程序C再换到存储介质中,然后才将程序A读入内存开始运行。由于内存释放出来的地址的不确定性,有可能是0x3000,也有可能是0x5000,而程序转移的目标地址却是固定的,比如,0x2000,这就要涉及到程序的“重定位”问题。其实“重定位”就是给程序中的每个地址重新确定它在物理内存中的位置。
在程序编写的过程中,经常会涉及到主程序调用子程序的情况。编译程序将源程序翻译成二进制机器码时,事实上各个模块都是分开翻译(编译)的,因为在翻译主程序时并不知道子程序的地址,所以只好暂时将调用子程序的指令的目标地址搁置,等到合适的时候才将每个调用子程序的指令修正,然后再填入正确的转移地址参数(链接)。当程序装入内存时,这些位置又要重新计算,那么重新修改目标地址的过程就是重定位。
怎样把编译程序解放出来,使得其在编译时并不关心物理内存的地址,而按自己的意愿给程序编址?唯一的解决办法就是增加中间层,即使用一种间接的编址方式,也就是对程序中的指令连续的编址,这些地址不是真正的物理地址,而是一种“虚拟地址”(或称逻辑地址),然后通过某些映射方法,将这个虚拟地址转化为物理地址。通过前面的学习,大家已经知道,物理地址是实实在在存在的,80C51系列单片机有16条地址线,所以可以支持64KB的存储空间。而虚拟地址空间则是一种逻辑空间,就像我们给一个班的学生编学号一样,这些学号的集合就是一种虚拟(逻辑)空间,每个班的同学都有从学号1开始的独立地址空间,由此可以推知,每个运行的程序都有自己独立的虚拟空间,而且每个运行的程序只能访问自己的地址空间,这样就能做到程序在运行时的有效隔离,从而大大地提高了系统的安全性。
虚拟存储的实现需要依靠硬件的支持,比如,32位ARM9以上的CPU,用其内部集成的MMU(Memory Managemnet Unit)来进行页映射,在页映射下,CPU接收到的地址是虚拟地址,经过MMU转换以后就变成了物理地址。由于80C51系列单片机没有MMU,所以无法实现虚拟内存管理机制。
相关文章推荐
- 成功心法(8):如果提高自身的技术修养(2)
- Seo从业者有什么办法可以提高自身的seo技术?
- 提高自身修养--菜根谭
- 怎么提高自身技术
- 如果才能提高自己的技术
- 如果一切需要重学,2014年应该学哪些技术?
- 如果你想成功,35岁前必须做好的十件事情
- 如果说中国的程序员技术偏低,原因可能在这里(转)
- 如何提高离岸软件开发项目的成功概率?
- 祭旗篇---关于提高技术团队技术氛围的一些尝试
- 如果脚踏实地,我们都是技术精英!
- 程序员编程技术迅速提高的终极攻略
- java求n以内的完全数。所谓的完全数即如果一个数字的所有真因子之和等于自身,则称它为“完全数”或“完美数”
- [推荐](穆穆推荐)如果你现在不成功,请看看你是不是选错了老板
- 技术管理者培训小结一:内在修养
- 首期“传智汇”技术分享沙龙成功举办
- 本年度智能手机技术中的成功与平庸
- 微软开发新搜索技术 提高搜索广告收入
- 如何提高自身数学分析水平?