问题标签 [general-protection-fault]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kernel - 如何处理linux内核中的一般保护错误
我有一个如下的内核模块,它试图读取 msr 寄存器,毫无疑问它会崩溃,因为 msr 0x2 不存在,会发生一般保护错误。我的问题是如何绕过这个错误,比如定义我的 GP 处理程序?如果我看不懂msr,就放手吧……
以下是我的模块代码:
以下是消息:
linux - 为什么在访问设置了 16 个最高有效位的内存时,段错误地址为 NULL?
考虑以下汇编程序:
当您使用nasm
and ld
(在 Ubuntu,内核 5.4.0-48-generic,Ryzen 3900X 上)编译它时,您会得到一个段错误:
但是,如果您将 16 个最高有效位中的任何一个设置为 1,如下所示:
您显然仍然会遇到段错误,但现在地址为 NULL:
为什么会这样?是gdb
Linux,还是CPU本身造成的?
我能做些什么来防止这种行为吗?
c - 使能中断后的一般保护故障。操作系统开发
我正在尝试开发自己的操作系统。我已经为 32 位编写了一些代码,直到我突然决定要使用 64 位时才开始分页。我启用了长模式,设置了基本分页,启动内核,内核设置了更好的分页(前 4 个 MiB 分页以及帧缓冲区的启动)。现在我想启用中断,我将我的 32 位 idt 代码重新组织为 64 位并尝试启用它,它确实可以奇迹般地工作。启用它的那一刻,我得到了一般保护故障。这里有一些需要考虑的事情,我似乎已经准备好了所有 irq 和 isr 的处理程序,我知道因为当发生一般保护错误时,它会在屏幕上打印出来。我几乎可以肯定它是由定时器引起的,但我无法确认,因为我的定时器中断处理程序也存在。不,我没有忘记 iretq :D。这是我的idt。
这是我的 isr.c 和 irq.c
情监侦:
中断请求:
以及整个 github 仓库: https ://github.com/Danyy427/OSDEV5.git
你可以在 source/kernel/idt 中找到 idt 相关的东西
您可以在 source/kernel/memory/paging 中找到与分页相关的内容
您可以在设置 64 位 gdt 的 source/bootloader/AfterBoot.asm 中找到与 gdt 相关的内容。
编辑:
新的 IDT.c 修复了一些问题(希望如此)
一旦我正常评论 sti 和 isr 的火,一般保护错误就消失了,我尝试用除以零错误,但是现在 irq 不火,我不知道发生了什么。
编辑:我解决了这个问题,问题是我没有正确设置堆栈
我忘记了最后一条指令中 28 前面的 0x。好尴尬。我也在这里写了 10 而不是 8
qt - 一般保护错误,当我将 QString 转换为 Char 时
我尝试将 QString 转换为 const *char,它会生成一般保护错误。我对此无法理解。
当我用 gdb 检查时,在“vfprintf”中产生了段错误。
- “一般保护”是什么意思
- 我试图在其他系统上运行这段代码,它运行良好。是否有任何可能导致问题的条件?
- 红帽 6 / qt 4.6
- 红帽 7 / qt 4.8
- 我已经尝试过转换为“toStdString、toLocal8Bit 等……”