问题标签 [bochs]
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.
assembly - 如何在 bochs 中正确设置断点
我想使用 bochs 来调试一个用 nasm 程序集编写的迷你操作系统。我希望找到一条指令来在源代码的某一行设置断点。但是从这里的文档:http://bochs.sourceforge.net/cgi-bin/topper.pl?name=New+Bochs+Documentation&url=http: //bochs.sourceforge.net/doc/docbook你只能设置一个断点在某个物理地址、虚拟地址或线性地址。我如何知道源代码中的某一行对应的地址是什么?
assembly - 预取:EIP [00010000] > CS.limit [0000ffff] 在第二阶段执行期间
我创建了一个简单的引导加载程序,第二阶段(内核)加载到内存中的 0x1000:0x0000,我的引导加载程序开始执行jmp 0x1000:0000
. 我的引导加载程序基于这个StackOverflow 问题中的引导加载程序
我的第二阶段/内核是一个简单的命令系统。
命令系统只有一个命令,即"help"
(暂时)。一切正常,但是当我输入命令时help
,我在 Bochs 模拟器中得到错误:
这是代码:
有人可以告诉我这是什么意思,为什么会发生?
assembly - INT 0x13 / AH = 0x02 适用于软盘映像,但在闪存驱动器上刻录时无效
我正在尝试在 x86 程序集中创建一个简单的命令系统。命令系统是加载在 0x1000:0000 中的第二阶段。要查看我的引导加载程序,请单击此 stackoverflow 问题。
这是第二阶段的指挥系统:
命令“dir”(com_dir)应该读取并打印以字母“F”开头的字符串,如果每个扇区 9 - 18(磁道 0)(CHS),则该字符串位于开头。我已经在十六进制编辑器的帮助下将字符串放置到位。
我将代码转换为图像文件。它在 Bochs 模拟器中运行良好,但是当我在闪存驱动器上刻录图像文件并在我的计算机中启动它时,它会打印垃圾。
有人可以告诉我有什么问题吗?
提前致谢。
assembly - FLOPPY:软盘图像上的 read() 返回 0
我正在尝试在 x86 程序集(16 位实模式)中创建一个简单的第二阶段命令系统。函数com_dir假设读取 720KB 软盘并在扇区以字母“F”开头时打印字符串。
这是第二阶段:
我的文件util.inc
:
由于某种原因,它在读取 720KB(720 次)时会在 bochs 中引发此错误:
有人可以向我解释什么是错的吗?
注意:请忽略com_open,它仍在开发中。
c - 在 x86 异常上禁用 GDB 中断
我正在使用 gdb 和 bochs-gdb 来调试我正在编写的虚拟内存实现。每次抛出异常 14(页面错误)时,gdb 都会在异常处理程序上中断。有什么方法可以禁用此行为,以便 gdb 不会因 x86 异常而中断?
assembly - 博克斯“阅读超越极限”
我正在尝试在 Bochs 中启动自定义内核。但是,当我尝试运行它时,Bochs 会在几秒钟内向我的终端生成数十万条输出行。它们都包含相同的信息:
我正在使用由 创建的映像dd if=/dev/disk3s1 of=Boot.img
,其中 disk3s1 是我的 Mac 的 DMG 安装驱动程序使用的原始设备。(这个镜像在 QEMU 下启动得很好,但是由于我的内核和 QEMU 之间不兼容,我现在必须使用 Bochs。)这是我的 bochsrc 文件的内容:
我已将问题的原因追溯到这些组装说明。正在发生的事情是 CPU 刚刚切换到实模式,因此它可以进行 BIOS 中断。在切换之前,要在 BIOS 中断中使用的寄存器已保存到由符号new_eax
、new_edx
和指示的内存位置new_es
。一旦进入实模式,程序就会从适当的内存位置重新加载寄存器。要读取的内存位置的线性地址是0x000200c8
。然而,因为我们处于实模式,我们必须使用段相对寻址——在这种情况下,ds:0x000100c8
. 但是,ds
寄存器的值是0x2000
。当与偏移量结合时,我们得到线性地址0x000300c8
,这是无效的。“读取超出限制”消息是 Bochs 抱怨地址无效。它被打印这么多次的原因是因为无效指令在无限循环中一次又一次地运行。
再次强调,这个完全相同的代码在 QEMU 中运行良好。我无法理解为什么会这样。
这是我正在运行的引导加载程序的完整反汇编和我的引导加载程序的C 源代码(特别是参见boot2
和libsaio
子目录),如果有帮助的话。
c - PintOS:schedule() 内核恐慌在 ASSERT(is_thread(next))
thread.c 中的 Schedule() 获取当前正在运行的线程和就绪列表中的下一个线程,并断言下一个线程是线程(is_thread(t) 检查 t != NULL 和 t->magic = = 线程魔法)。我目前收到此错误:
我目前正在实施 timer_sleep 以便它不会忙于等待。这是我的 timer_sleep 函数:
还有我的 timer_interrupt:
将任何东西添加到 ready_list 的唯一地方是 thread_unblock,它也执行 ASSERT is_thread,所以我不确定哪些不是线程的东西会被添加到就绪列表中。除了将 timer_elem 添加到 thread.h 和线程 cmp_wake_ticks 函数之外,我没有对基本代码进行任何其他更改。
assembly - 将 char 放入视频内存的汇编代码在 Bochs 中不起作用,但在 VirtualBox 中正常
我写了一些代码来写入引导扇区并显示'L'
.
该段0xb800
是用于显存的,所以我放入'L'
它并将'L'
显示。
如果我使用 VirtualBox,它会很好用,但如果 bochs 会显示。
我nasm -f bin boot.asm -o boot.bin
用来构建引导加载程序。
- 我在windows 7和windows 8上运行,没问题。
-我创建了一个VHD
磁盘映像,然后构建代码并将其写入磁盘映像,之后我在 VirtualBox 中启动并且它工作。
2.我在带有 Bochs 的 Ubuntu 14.04 i386 虚拟机上运行,它不起作用。我的bochs设置:(Bochs x86 Emulator 2.4.6
)
我用 构建代码NASM
并floppy.img
用dd if=boot.bin of=floppy.img
. 启动 Bochs 后,什么都没有显示,只是光标快速闪烁。
这些我的完整代码:
assembly - 启用引导加载程序以加载 USB 的第二个扇区
我正在学习汇编语言。我写了一个简单的引导加载程序。经过测试,它没有工作。这是我的代码:
使用以下命令将此代码放置在 USB 的第一个扇区中:
使用以下命令将一个简单的程序加载到 USB 的第二个扇区:
这是加载到第二个扇区的程序的代码:
为什么我的引导加载程序不工作?我做错了什么吗?有什么建议么?
gcc - 当我调用一个函数来打印一个字符时,一个惊人的现象
我正在开发自己的操作系统。我已经完成了引导扇区并成功加载了我的内核。我的开发环境是 Ubuntu 14.04 和 GCC 4.8。我的内核将在 BOCHS 下运行。我想在屏幕上的特定位置打印特定字符,所以我创建了一个这样的函数:
我在我的函数中调用这个函数main
,这是我内核的入口点:
print_char('T', 0, 0, (unsigned char) 0x0f);
上面的代码应该在屏幕左上角打印字符“T”。它没有出现!在我更改了声明之后print_char
:
void print_char(char target, int col, int row, int attribute)
或者是这样的:
void print_char(char target, int col, int row)
然后像这样称呼它print_char('T', 0, 0)
我改了之后,一切正常!我真的很困惑这个问题。谁能给我解释一下?