如何使用 APM 从保护模式关闭
How to shutdown from protected mode using APM?
我的内核使用 GRUB 启动,因此它以保护模式启动,并且 A20 行已经解锁。然后,它会重新路由设备 irqs 并加载自己的 irq。现在我想关闭设备。它可以通过 APM 完成,但 APM 只能从实模式启用,所以我编写了切换到实模式然后连接到 APM 的代码,将其版本设置为 1.1/1.2,为所有设备启用它并关闭所有设备:
asm volatile("clin"
"mov eax, cr0n"
"and al, not 1n"
"mov cr0, eaxn"
"sti");
asm volatile("mov ah, 0x53n"
"mov al, 0x01n"
"xor bx, bxn"
"int 0x15");
asm volatile("mov ah, 0x53n"
"mov al, 0x0en"
"mov bx, 0x0000n"
"mov ch, 0x01n"
"int 0x15");
asm volatile("mov ah, 0x53n"
"mov al, 0x08n"
"mov bx, 0x0001n"
"mov cx, 0x0001n"
"int 0x15");
asm volatile("mov ah, 0x53n"
"mov al, 0x07n"
"mov bx, 0x0001n"
"mov cx, 0x3n"
"int 0x15");
同样在运行此代码后,计算机重新启动并使用QEMU时,我收到启动错误(无效的"幻数"(,并且在使用真机时它只是重新启动。
GNU风格的内联汇编要求保留所有不在输出或clobber列表中的寄存器,同样,更改为实模式将破坏编译器生成的代码。使用单个 asm 语句或使用单独的程序集文件来解决此问题。
您尝试进入 32 位实模式,您需要先切换到 16 位模式,然后再切换到实模式。
您需要使用远跳将CS
设置为适合实模式的值,否则中断的第一个返回将转到错误的地址。
您可以在 GRUB 源代码中找到从 32 位保护模式切换到实模式的示例。
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么在保护模式下继承升级不起作用
- 访问被拒绝后,c++中的故障保护代码
- 如何在全屏模式下(在OpenGL中)使背景透明
- C++:无法访问声明的受保护成员
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- 为什么您需要C++头文件的包含保护
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- 如何使用 APM 从保护模式关闭
- 与 IE 保护模式兼容的自定义工具栏
- C++ - 32位保护模式
- 为什么GoF建议在C++模板方法模式实现中使用受保护的(而不是私有的)虚拟方法
- 链接内核后跳转到保护模式不工作
- RTOS: windows ce:实模式和保护模式内存访问开销
- 保护数据设计模式
- 告诉子类对超类的受保护变量执行某些操作是否是一种好的做法(也许是一些已知的设计模式?)?