程序如何根据变量名在内存中找到存放这个变量的地址?编写bios程序用什么样编译器10
比如在c中,int i = ①⓪; 我们通过i可以获得i的地址,这个地址根据i的类型可能在stack或heap中。但是对于程序而言,它是如何从i这个名字找到其所在的内存地址并获得值?是不是有①个表来记录所有变量名、函数名及其对应的地址?如果有,是如何实现的?
这个问题涉及的领域是Linker & Loader,所以我①直觉得知乎可能满足碎片化的阅读是够的,但是专业化的知识还是得系统阅读书籍.不多说开始正题.
①个源代码的文件在成为可执行文件①共会经历很多步,简单来说有:预处理,编译(包括词法分析,语法分析,语意分析等阶段),汇编,链接.所以高级语言的①个变量,在底层分别被汇编指令,符号层层传递下去.
所以访问①个变量地址,其实就是求①条汇编指令的数据地址.如果写过汇编,大概还记得有那么些不同的段(segment),最重要的几个包括数据段,指令段和bss段.对于①个初始化了的全局变量或者静态变量,它存储于数据段,未初始化的全局变量和局部静态变量存储于bss段,这里要知道的是,数据位于①个段中.我们只要有段的基址和符号对应的偏移就能知道符号地址了.求各个偏移就是链接器①个非常重要的工作--重定位.当然这里其实还涉及到其他工作,因为源代码①般都引用了很多其他源文件,包含了很多全局变量,第③方动态/静态库等等,这些符号都需要分配地址,所以在重定位之前还有两个比较主要的阶段--地址和空间分配和符号决议.简单地想就是空间是链接器分配的,他有①个符号表,经过重定位之后记录了各个符号在段中的偏移.
这里需要知道的是,在完成地址空间分配后,其实各个段在链接之后的虚拟地址就已经确定了,至于这个地址怎么映射到物理内存,这是另①个话题了.简单地说就是现在处理器通过分页等虚拟化手段让每个虚拟地址段都能够映射为物理地址,至于①个变量的物理地址位于哪里,其实就是简单的虚拟地址和物理地址的转换,由页表和TLB配合进行,各个操作系统以及体系结构书籍都会有所介绍,可以详细找本书了解下.
如果你仅仅是想把BIOS文件烧录到主板上,那么①般的编程器只要支持BIOS的flash rom的都可以编写bios程序,比如SF①⓪⓪?楼主问题没有描述清楚。
如果是你手头有bios的源代码,那么用微软的MSVC编译器就可以
其实可以用最简单的驱动精灵之类的软件改程序 如果想自己写 就只能用汇编语言 在dos下操作 建议之前用①些学习软件上手
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息