【发布时间】:2021-07-04 16:38:23
【问题描述】:
我正在为我的家庭作业编写一个微型操作系统,我想保留 shell 上显示的内容(因为当我使用 shell 打开另一个应用程序时,屏幕将被它的新内容覆盖,我想恢复shell 就像返回后调用应用程序之前一样)。
我想用C语言来完成它,但我不知道如何正确使用指针来处理它。我的想法是把显存中的所有数据都读取出来,保存在一个数据结构中,然后通过重写到显存中来恢复,但是我尝试了很多方法,都不管用。
我试着写这样的函数:
void storeContents()
{
uint16_t * ptr =0xB800;
int cnt = 0;
while(cnt < 80 * 25)
{
store[cnt++] = * (ptr++);
}
}
我不知道这个函数是否正确,但是当我使用Bochs调试时,我发现进入这个函数时,它卡在这个循环中,我确定指针一定有问题(但是不知道是什么意思,找不到叫哪个中断)
(0) [0x0000000fe9e6] f000:e9e6 (unk. ctxt): push ax ; 50
<bochs:26> s
Next at t=439640331
(0) [0x0000000fe9e7] f000:e9e7 (unk. ctxt): call .-22398 (0x000f926c) ; e882a8
<bochs:27> s
Next at t=439640332
(0) [0x0000000f926c] f000:926c (unk. ctxt): mov al, 0x20 ; b020
<bochs:28> s
Next at t=439640333
(0) [0x0000000f926e] f000:926e (unk. ctxt): out 0x20, al ; e620
<bochs:29> s
Next at t=439640334
(0) [0x0000000f9270] f000:9270 (unk. ctxt): ret ; c3
<bochs:30> s
Next at t=439640335
(0) [0x0000000fe9ea] f000:e9ea (unk. ctxt): pop ax ; 58
<bochs:31> s
Next at t=439640336
(0) [0x0000000fe9eb] f000:e9eb (unk. ctxt): iret ; cf
你能帮我吗?谢谢! (顺便说一句,我使用的是显卡的文本模式,我的操作系统上还没有文件系统。操作系统目前处于实模式)
【问题讨论】:
-
只要有一个指针 point 指向显存。 The OSDev wiki 有一些很好的例子。
-
是什么阻止您跟踪发送到显示器的数据?
-
您的问题中现在有两个不同的问题。请一题一题。请采纳 SOtour,阅读How to Ask,以及this question checklist。
-
您是否正在以实模式运行从 32 位 C 编译器 (gcc) 生成的代码?您是否将
-m16与 GCC 或类似的东西一起使用? -
只是一个观察。将 0x20 发送到端口 0x20 本身表明此代码正在发送 EOI(中断结束),并且代码出现的方式很可能是从 0x00 到 0x07(包括)的中断。此范围内最常见的 2 个中断是计时器 (0x00) 和键盘 (0x01)。 0xf000 段是 BIOS,因此您希望在 BIOS 中调试外部中断处理程序。
标签: gcc nasm x86-16 osdev real-mode