闲话定位(locate)

| | 评论(0)

闲话定位(locate)

一般的操作系统上用的程序,在源代码写好以后,会经历一个编译-链接的两步曲。在Windows或者Linux这样的平坦内存模式下,编译是把代码变成目标机器码,而链接,是把不同的目标码中的符号给链起来。简单说,就是把不同的obj文件捆绑到一个exe文件(也有多个文件的实现方式),然后调用子程序的跳转偏移要重新算过并填充到代码中。我说得很简单,其实这里面有很多讲究。

现在有个问题,如果给一个CPU系统,但是没有操作系统,你的程序如何能够跑起来? 或者要求你自己写一个操作系统,该从何下手?在有操作系统的时候,操作系统负责把exe文件从文件系统中调出来,放到内存的某一段,然后把ip指向这一段的第一条指令,程序就开始运行了(还是有很多讲究,例如保护模式实模式以及返回和错误处理等,这里就忽略了)。

自己写个独立运行的程序竟然如此复杂?其实还好,有了locator(定位器,一种软件), 我们的工作只是变成了编译-链接-定位三步。定位器的存在,是以假设我们用ROM存储程序为前提的。不要什么文件系统,我们就直接把定位后的程序烧在ROM里然后放到内存空间里(用地址译码产生片选,而象嵌入式的386EX还直接就内嵌四个可遍程CS),再把CPU的第一条跳转指令弄好就万事大吉。定位器的作用,在这里是进行绝对定位,把代码类段的地址指向ROM而数据类段的地址指向RAM. 自然这当中有很多重定位工作。

新的问题又来了,如果数据段中是有初始化数据的怎么办?RAM又不能硬件编程的。简单的想法,把数据段先放在代码段里,然后在初始化段里面把这段数据抄到RAM里,然后改变数据段地址。事实上,好的locator会提供压缩功能,因为ROM总是不能作得太大的。在定位的时候数据被压缩,然后在初始化段里面调用一个宏去解压。之所以是宏,因为在解压之前没有堆栈,不能调用子程序。(其实还是有办法,我就必须解压之前调用其他的初始化子程序,所以要自己搞一个临时堆栈。)

最后,一个更花梢的方案是这样的:做一个ROM程序,先运行起来,负责与主机打交道(通过串口,或者共享内存+中断)。主机通过这个程序下载另一个程序,这个程序可能因为要经常更新,可能因为要加密解密,只能放在主机端。这个新程序被下载到RAM里,虽然locator以为把它定位到了ROM(是的,我们欺骗了locator! 有点逗。它也很老实的同意我们把数据段定位到所谓的ROM)。然后老程序放弃自己的运行,把控制权完全交给新程序。

所有的因素(locator的功能, RAM, ROM的尺寸限制以及地址分配,保护模式实模式,片选编程,要多种硬件兼容等)交织起来,还是足够麻烦考验耐心的。下次再说怎么调试。


posted 2004.05.18 Tuesday

分类

发表评论

关于此日记

此日记由mach发表于2004年5月18日 10:40

此Blog上的上一篇日记卫星上天与信息入户

此Blog上的下一篇日记明天--Shrek II

主索引归档页可以看到最新的日记和所有日记。

Powered by Movable Type 4.0