小弟有个猜想:
操作系统从磁盘上加载应用程序文件(以DOS来说是*.exe)到内存(当然从哪个扇区开始,哪里结束.这是DOS文件系统的工作)
操作系统为应用程序分配内存,
把程序载入内存后,操作系统执行一条段间调用
CALL (地址)
就可以运行应用程序.
本质上说,对于操作系统而言,应用程序就是不驻留内存(任务完成就释放内存)的子程序罢了.
以上就是小弟的模型.
如果这个模型是正确的,小弟本人有些疑点:
1,应用程序加入内存的地址并不是一定的(操作系统已占用了内存),那么CALL语句的段地址由操作系统分配内存时可以得到;但与同一程序中的子程序不同,入口地址偏移是未知的,如何得到?
2,应用程序用到的堆栈,是包含在本身内的,以DOS文件系统来说,就是包含在*.exe中的,只要应用程序本身修改DS,SS,ES就可以使用包含在自身的各段,是不是这样呢?
小弟用16进制编辑器查看*.exe文件,发现文件头都有
4d5a33000200000020000000ffff000008002950200001001e00000001
4d5a13000200000020000000ffff000008009ba4000001001e00000001
4d5a03000200000020000000ffff00000000b4a4000000001e00000001
改变堆栈段的长短,重叠数据段和代码段,都会令这个文件头有所改变.
这段数据是不是DOS加载程序时需要用到的信息呢?
前面疑点(1)中的入口偏移可以由汇编程序在汇编时算出,那么是不是放在这里呢?
不是小弟狂妄,小弟想做个操作系统,所以对这些问题契而不舍.
但小弟还极菜,各位大侠多指教,嘿嘿:>
操作系统从磁盘上加载应用程序文件(以DOS来说是*.exe)到内存(当然从哪个扇区开始,哪里结束.这是DOS文件系统的工作)
操作系统为应用程序分配内存,
把程序载入内存后,操作系统执行一条段间调用
CALL (地址)
就可以运行应用程序.
本质上说,对于操作系统而言,应用程序就是不驻留内存(任务完成就释放内存)的子程序罢了.
以上就是小弟的模型.
如果这个模型是正确的,小弟本人有些疑点:
1,应用程序加入内存的地址并不是一定的(操作系统已占用了内存),那么CALL语句的段地址由操作系统分配内存时可以得到;但与同一程序中的子程序不同,入口地址偏移是未知的,如何得到?
2,应用程序用到的堆栈,是包含在本身内的,以DOS文件系统来说,就是包含在*.exe中的,只要应用程序本身修改DS,SS,ES就可以使用包含在自身的各段,是不是这样呢?
小弟用16进制编辑器查看*.exe文件,发现文件头都有
4d5a33000200000020000000ffff000008002950200001001e00000001
4d5a13000200000020000000ffff000008009ba4000001001e00000001
4d5a03000200000020000000ffff00000000b4a4000000001e00000001
改变堆栈段的长短,重叠数据段和代码段,都会令这个文件头有所改变.
这段数据是不是DOS加载程序时需要用到的信息呢?
前面疑点(1)中的入口偏移可以由汇编程序在汇编时算出,那么是不是放在这里呢?
不是小弟狂妄,小弟想做个操作系统,所以对这些问题契而不舍.
但小弟还极菜,各位大侠多指教,嘿嘿:>