Bochs: Difference between revisions

1,657 bytes added ,  29 days ago
m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(15 intermediate revisions by 10 users not shown)
Line 12:
=== 3rd exception with no resolution===
 
The CPU didn't manage to invoke an exception handler and would normally [[Triple Fault|triple fault]]. This is probably due to a bad [[Interrupt Descriptor Table|IDT]] register content, or a bad IDT descriptor. Sometimes (but less likely), it can also be due to a severe bug in your exception handler code. Check your exception works with "illegal" ASMasm instructions like <tt>idiv 0</tt>, or
 
<syntaxhighlight lang="asm">
push 0xf001
pop ds ;; 0xf001 is no valid segment,
mov ax, ~[ds:0x12345678] ;; let's see if we get the GPF
</syntaxhighlight>
 
In several cases, there are other error messages prior to this one which can provide more details in the error. Some common messages that might be displayed:
Line 30 ⟶ 32:
 
===I/O Operand Size===
Bochs performs some rather paranoid checks on I/O operand size. Reading a byte from port 0x1234 is usually not the same thing as reading a dword32-bit value. Go back to your chip's data sheet and double-check that your sizes are correct.
 
=== fetch_raw_descriptor: LDTR.valid=0 ===
Line 88 ⟶ 90:
display_library: x, options="gui_debug"
 
In windowsa Windows environment, add belowthis line to your bochsrc.bxrc
 
display_library: win32, optionoptions="gui_debug"
 
It seems that on Windows, the "option" flag (what the above line used to read) will be accepted, but the GUI window will not appear.
 
===I/O debugger macros===
Some useful macros when Bochs is compiled with the I/O debug ports enabled (<tt>port_e9_hack: enabled=1</tt> if Bochs 2.4 or newer, <tt>configure --port-e9-hack</tt> if not):
 
<syntaxhighlight lang="c">
//outputs a character to the debug console
#define BochsConsolePrintChar(c) outportb(0xe9, c)
//stops simulation and breaks into the debug console
#define BochsBreak() outportw(0x8A00,0x8A00); outportw(0x8A00,0x08AE0);
</syntaxhighlight>
 
===Magic Breakpoint===
When you're using bochsBochs with the [http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html internal debugger], then you can trigger the debugger via a systemfacility called [http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html#AEN2324 magic breakpoints]. To trigger a breakpoint, you can insert <tt>xchg bx, bx</tt> (in GAS syntax, <tt>xchgw %bx, %bx</tt>) anywhere in the code and bochsBochs will trap into the debugger as soon as it executes it. On real systemshardware this has no effect as it onlymerely replaces the BX register with itself.
 
You should put the following line in your bochsBochs configuration file to have it listen to magic breakpoints:
magic_break: enabled=1
 
On older versions, enabling the debugger alone doesn't compile in magic breakpoint support, you will also need to passspecify <tt>--enable-magic-breakpoint</tt> towhen configuring the configurebuild foron those versions.
 
===Debugging SMP===
Line 121 ⟶ 127:
Bochs places an automatic breakpoint just before the BIOS loads, this can be automatically skipped by putting <tt>continue</tt> as the first command in the said file.
 
===Debugging Triple Faults===
 
When using the internal debugger, you may change this line in your Bochs configuration file:
 
reset_on_triple_fault 0
 
This line disables the emulator reset on a Triple fault, enabling you to debug the code after a Triple fault occured (Very useful while implementing paging).
==Compiling Bochs from Source==
Bochs has many compile-time configuration options, some of which conflict, and therefore a binary distribution of Bochs may not be suitable for your purposes. I found it was best to compile my own copy of Bochs to be sure I had the features that I needed. Also, you should consider using the CVS snapshot version of Bochs if the released version is old and not working for you. I found this was necessary up until version 2.4 was released, for example. On Ubuntu, you may have to run
 
<syntaxhighlight lang="bash">
sudo apt-get install libgtk2.0-dev
</syntaxhighlight>
 
and enter your password. On other linux distros, try the equivalent.
Line 130 ⟶ 145:
The array of Bochs configuration options can be confusing, and you cannot assume the defaults are going to be sensible. These are the options I use, this can get you started:
 
<syntaxhighlight lang="bash">
./configure --enable-smp \
--enable-cpu-level=6 \
Line 148 ⟶ 164:
--disable-plugins \
--disable-docbook \
--with-x --with-x11 --with-term --with-sdl2
</syntaxhighlight>
 
A few notes:
* If you are on Windows, that last line should probably read "--with-win32".
* On Linux, using SDL as the display library over X11 is preferable as the performance appears to increase greatly on some setups
* Bochs has GDB stub support, and its own internal debugger. These cannot be compiled into the same Bochs binary. The internal debugger is very useful, its flag is --enable-debugger
* The GDB stub in Bochs does not support SMP, last time I checked.
Line 158 ⟶ 176:
* Post-2.4.2 several of the CPU specific options were folded into the CPU-level specification and are therefore deprecated. They have been removed from the example above.
* The default compile does not support x86-64, --enable-x86-64 will turn it on
* On many Linux distributions it is possible to install Bochs via a package manager. For example, on distributions that use apt-get we can do
<syntaxhighlight lang="bash">
sudo apt-get install bochs
sudo apt-get install bochs-x
</syntaxhighlight>
to install Bochs and the X11 plugin (which may crash on ubuntu/linux mint: install the sdl plugin and use sdl instead of x as the display library in this case). Note that there is a big chance that the graphical debugger is not enabled in the binaries from the package manager.
 
==See Also==
Line 168 ⟶ 192:
===External Links===
*[http://bochs.sourceforge.net Bochs Homepage]
*[http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html Bochs internal debugger commands documentation]
*[http://www.codeproject.com/system/MakingOS_2.asp CodeProject article on using Bochs]