自由使用内存的 Bug

这是我有史以来遇到的最恐怖的 Bug: 我把正在执行的代码给擦掉了~~~
系统中断服务表 IDT 需要 2K 空间,不想在程序中定义,就想着直接使用空余的内存空间。鬼使神差的想到 BOOT(7C00h)和内核代码(8000h)之间还有一段空区,就用上了。根本不注意到这段空区(7E00h – 7FFFh) 和 BOOT 一样只有 512 (0.5K) 字节。于是等我傻里傻气的清零 2K 的内存时,内核代码被清零了(7E00h + 2K > 8000h),包括正在执行这段清零操作的代码。QEMU 模拟器报错,弹出对话框来。天啊,不晓得在真是机器上执行会怎样,幸好有模拟器,庆幸!
昨天一晚上都牵挂着浅浅 x_x ,没有心思研究为什么有怎么严重的出错。后来便放弃了清零操作,只是对 INTEL 保留异常向量表进行处理,也就是 0 – 31 号的 256 个字节。呵呵。这样子没有影响到内核的代码,于是乎,发布了 ANOS 0.03 赶着好安心睡觉。
奇怪的是,早晨醒来时,不知为什么想起这个来。突然一下明白 7E00h 到 7FFFh 根本不到 2K 空间。。。
😀 真的是真的是很恐怖的错误!

学习保持党员先进性真好

🙂 嘿嘿,真的很好。偶是这次先进性教育的直接受益者。哈哈。
小舅舅、舅妈来汉,晚上一起吃饭。正值新闻联播时间,两会正热。弟弟就问小舅妈,下面的政协开会没。小舅妈说,去年底就开了。当了十几年的政协代表,开会就那么回事。然后自然扯到当前正如火如荼的保持共产员先进性学习活动(新闻联播也正放着,呵呵)。小舅妈就说弟弟,你不是休假回家,现在不在部队里天天搞学习、写心得体会。我吃饭吃的笑了起来,说,这个学习真好,我们老板天天在公司学习在,一个星期多没到库里来了。妈妈接口道,难怪你这段时间下班回家没有叫这怨那了。我哈哈大笑,说,他们不来仓库指东划西蛮好,大家都安生。
真是托保持党员先进性学习的福。愿学习越长久越好,让教育来的更猛烈一些吧~~~
😀 😀 😀 😀 😀 哈哈哈哈哈~~~

MinGW 编译平二进制文件

MinGW 是 gcc 的 Win32 移植,所以编译平二进制文件的方式相同。
首先 gcc -c foo.c
然后 ld -Ttext=0x8000 -o foo.exe foo.o
最后 objcopy foo.exe foo.bin
值得注意的是 foo.c 不能使用主函数 main 作为程序入口,否则 MinGW 会根据 Win32 特性增加 Startup 代码,这时会需要 _main 和 alloc 内部函数支持。而链接入口函数 mainCRTStartup 只能放在代码最开始处,前面不能有其他全局变量声明,不然 objcopy 的时候,平二进制文件开头处是全局变量而不是入口函数指定代码。同样链接入口函数调用程序入口函数前面也不要声明函数内部的静态变量。
关于 text=0x8000,对于 ANOS 原先准备载入内核到 0x10000 处。结果编译时,进保护模式代码放在 start.asm 汇编中,其间使用了 16 位代码,而且代码中引用地址(GDT 表)。如果代码段定位在 0x10000 处,不在 16 位实模式的第一个 64K 段上。这时,编译好的 start.o 里面的 16 位代码中的引用地址无法定位(段?)。所以最终还是使用了内存地址 0x8000 来定位内核。
另:C 程序中的函数在实际编译的时候名字前会添加一个下划线,即在 asm 中使用 mainCRTStartup 应该实 _mainCRTStartup。