30天自制操作系统day23
2015-07-28 13:20
281 查看
编写malloc
昨天的带窗口的应用程序,窗口的buffer是全局数组,导致生成的可执行文件很大。如果可以在运行时动态分配就可以解决这个问题。但是直接使用操作系统的memman_alloc()也不行,因为分配到的内存空间不属于应用程序的段。临时的解决方法是在编译时就把数据段开大一点,然后再用memman管理这段内存。因为分配的数据段大小不会对可执行文件的大小产生影响,所以是可行的。malloc用的内存空间的起始地址在.hrb文件的0x0020处。0x0000是应用程序数据段的大小,包括栈,原有的数据和malloc用的内存空间。在winhelo.hrb中的情况是:
0x0000 B000 ;数据段大小 0x000c 0400 ;栈初始地址 0x0010 0013 0x0020 0420 ;malloc用的内存空间
然后分别编写_api_initmalloc,_api_malloc,_api_free三个汇编函数,用于初始化,分配和释放内存。
在_api_initmalloc中,
_api_initmalloc: ; void api_initmalloc(void); PUSH EBX MOV EDX,8 MOV EBX,[CS:0x0020] MOV EAX,EBX ADD EAX,32*1024 MOV ECX,[CS:0x0000] MOV ESI,ECX SUB ECX,EAX INT 0x40 POP EBX RET
可以看到真正的可分配的内存大小ECX只有0x2BE0这么大。前面的32KB是放内存管理表的。因为MEMMAN结构是和操作系统用的一样,然而操作系统可管理的内存大得多,所以这里损失比较大。
键盘输入API
前面的绘图API比较简单没什么可讲的。这里的键盘输入API提供了阻塞和非阻塞两种方式。在hrb_api()中,用了一个for循环,如果是非阻塞,检测FIFO并立即返回字符或-1。如果是阻塞,则当FIFO空时睡眠。在应用程序中也有两种调用API的方式。如:
for(;;){ if(api_getkey(1)==0x0a){ break; } }
传的参数是1,是阻塞的。
相关文章推荐
- Android播放HLS协议的流媒体
- vi显示行号
- Linux64位操作系统(CentOS6.6)上如何编译hadoop2.4.0
- sqlite3的交叉编译
- Java log4j日志记录工具配置说明
- lvm修改根分区大小
- 控件——radioButton
- 【SCOI2011 Day1】糖果
- Unity 利用itextSharp导出pdf文档
- 数据库常见面试题
- div层遮盖flash(兼容浏览器)
- Android 软引用
- 用extundelete恢复rm -rf删的文件
- Evaluate a Cubic Bézier on GPU
- 微信公众帐号开发教程第16篇-应用实例之历史上的今天
- 阿里巴巴校招内推简历筛选方案(总结篇)
- swift基础语法
- 用extundelete恢复rm -rf删的文件
- 关于handler
- 每天一个小程序-连接字符串!