指定的可执行文件不是此操作系统平台的有效应用程序_计算机自制操作系统(三二):操作系统应用...

到目前为止,本次操作系统制作原理性的知识几乎就写完了。后面我们还要继续开发,基本都是面向应用程序来不断的优化和完善操作系统内核。其实就是在不断的扩充API,在这个过程中,也会有很多的问题,特开篇一章专门记录。一、应用程序临时申请内存熟悉C语言的人都知道,它一个标准库的内存分配函数:malloc()。为应用程序临时申请内存的目的很明显:减小应用程序文件的大小。这个和我们之前在操作系统制作过程中介绍的...
摘要由CSDN通过智能技术生成

8eccdbab377df5540e67275cf4f61ec1.png

到目前为止,本次操作系统制作原理性的知识几乎就写完了。后面我们还要继续开发,基本都是面向应用程序来不断的优化和完善操作系统内核。其实就是在不断的扩充API,在这个过程中,也会有很多的问题,特开篇一章专门记录。

一、应用程序临时申请内存

熟悉C语言的人都知道,它一个标准库的内存分配函数:malloc()。为应用程序临时申请内存的目的很明显:减小应用程序文件的大小。这个和我们之前在操作系统制作过程中介绍的内存管理是一致的,如果我们的操作系统不做内存临时申请,那么最终生成的操作系统镜像文件也会很大。

假如我们现在的应用程序是要生成一个窗口,那么窗口图形数据就有一个非常大的视频数据缓冲区:buf,如果窗口大小是1024 X 768的话,这个buf的大小就将是:768KB。这么大的缓冲区空间在放在应用程序栈区显然不合适,如果通过非栈区变量比如静态或全局数组的话,它会被放到应用程序的.data区,那么最终应用程序的文件光这部分大小就是768KB。所以,为了减小应用程序文件的大小,可以让它几乎保留纯粹的代码,尽量不带数据类的信息,我们就需要做成这样:事前不分配buf静态变量区,让该应用程序在运行的时候才临时申请一个内存区,我们的操作系统需要给它提供一个类似malloc()临时分配内存的API:api_malloc(size)。接下来就记录,我们这次的操作系统怎么制作出这样一个API。

c75c0de027769d55072f4020b8d91d56.png
应用程序malloc()内存申请API实现方法

可以看到,应用程序内存申请API的实现方法是:操作系统首先通过它的内存管理器给每个应用程序分配专用的临时数据内存区,应用程序以后通过内存申请malloc()函数为相应变量申请临时内存区,而这些变量的临时内存区都只能在该应用程序对应的数据内存区内。所以,我们在给每个应用程序分配数据内存区的时候,要提供足够的空间。那到底应该提供多大的空间呢?在生成应用程序的时候,malloc()需要的空间大小可以通过如下配置来实现:

BIM2HRB winhelo3.bim winhelo3.hrb 40k

这样的效果是告诉操作系统:本应用程序需要40KB的malloc()内存空间。另外在加上链接器链接的时候,还指定了栈空间的大小;还有放在.data区的变量需要空间。所以,在我启动的时候,你就必须要给我分配这么大的数据内存空间:malloc()所需空间+栈空间+.data区空间。按我们这次的可执行文件格式,最终这个总空间的大小是写在文件最开头4个字节处的。

这里有一个细节问题,就是要用到内存分配和回收等功能,就需要用到内存管理器(详见《计算机自制操作系统(二0):Windows窗口界面---内存分配管理》),操作系统和应用程序的内存管理器二者没有任何联系,可以各自定义(比如应用程序使用的可以尽量定义小点),它们是独立的用于管理自己负责的内存区。但是为了省事,一般就用相同的内存管理器(只是数据结构一致),所以应用程序在启动之后,就需要在自己的数据区先定义一个内存管理器变量,而这个内存管理器变量本身是需要占用空间的,这次应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值