You’ll use two sets of tools in this class: an x86 emulator, QEMU, for running your kernel; and a compiler toolchain, including assembler, linker, C compiler, and debugger, for compiling and testing your kernel. I am new in atom, i user git-control on a project with no issue. Recently i had another forlder into my project, with its own git repo, but i can't interact with it via git-control, i can only commit/push to the repo of the first folder.
You’ll use two sets of tools in this class: an x86 emulator,QEMU, for running your kernel; and a compilertoolchain, including assembler, linker, C compiler, anddebugger, for compiling and testing your kernel. This page has theinformation you’ll need to download and install your own copies. Thisclass assumes familiarity with Unix commands throughout.
It should be possible to get this development environment running underwindows with the help of Cygwin. Installcygwin, and be sure to install the flex and bison packages (they areunder the development header).
Otherwise, the easiest way to get a compatible toolchain is to installa modern Linux distribution on your computer. With platform virtualization,Linux can cohabitate with your normal computing environment.Installing a Linux virtual machine is a two step process.First, you download the virtualization platform.
Note
It is optional to use vagrant for our labs. You can use virtualbox only.
If you decide to use virtualbox only.
- you could download Ubuntu desktop here like ubuntu-14.04.3-desktop-i386.iso.
- Start up your virtualization platform and create a new (32-bit) virtual machine. Use the downloaded Ubuntu image as a boot disk
- Follow all steps that described below except vagrant parts.
QEMU (manual) is a modern and fast PC emulator.
Installing QEMU
Compilation from the source
Familiarity with your environment is crucial for productive developmentand debugging. This page gives a brief overview of the JOS environmentand useful GDB and QEMU commands. Don’t take our word for it, though.Read the GDB and QEMU manuals. These are powerful tools that are worthknowing how to use.
Index
GDB is your friend. Use the qemu-gdb target (or itsqemu-gdb-nox variant) to make QEMU wait forGDB to attach. See the GDB reference below for some commandsthat are useful when debugging kernels.
If you’re getting unexpected interrupts, exceptions, or triple faults,you can ask QEMU to generate a detailed log of interrupts using the-d argument. Windows 10 pro key generator kms.
To debug virtual memory issues, try the QEMU monitor commands infomem (for a high-level overview) or infopg (for lots of detail). Note that these commandsonly display the current page table.
(Lab 4+) To debug multiple CPUs, use GDB’s thread-related commands likethread and info threads.
GDB also lets you debug user environments, but there are a few thingsyou need to watch out for, since GDB doesn’t know that there’s adistinction between multiple user environments, or between user andkernel.
You can start JOS with a specific user environment using makerun-*name* (or you can edit kern/init.c directly).To make QEMU wait for GDB to attach, use therun-*name*-gdb variant.
You can symbolically debug user code, just like you can kernel code, butyou have to tell GDB which symbol table to use with thesymbol-file command, since it can only use onesymbol table at a time. The provided .gdbinit loads the kernelsymbol table, obj/kern/kernel. The symbol table for a userenvironment is in its ELF binary, so you can load it using symbol-fileobj/user/name. Don’t load symbols from any .o files, as thosehaven’t been relocated by the linker (libraries are statically linkedinto JOS user binaries, so those symbols are already included in eachuser binary). Make sure you get the right user binary; libraryfunctions will be linked at different EIPs in different binaries and GDBwon’t know any better!
(Lab 4+) Since GDB is attached to the virtual machine as a whole, itsees clock interrupts as just another control transfer. This makes itbasically impossible to step through user code because a clock interruptis virtually guaranteed the moment you let the VM run again. Thestepi command works because it suppresses interrupts, butit only steps one assembly instruction. Breakpointsgenerally work, but watch out because you can hit the same EIP in adifferent environment (indeed, a different binary altogether!).
The JOS Makefile includes a number of phony targets for running JOSin various ways. All of these targets configure QEMU to listen for GDBconnections (the *-gdb targets also wait for this connection). Tostart once QEMU is running, simply run gdb from your lab directory. Weprovide a .gdbinit file that automatically points GDB at QEMU, loadsthe kernel symbol file, and switches between 16-bit and 32-bit mode.Exiting GDB will shut down QEMU.
The makefile also accepts a few useful variables:
When building JOS, the makefile also produces some additional outputfiles that may prove useful while debugging:
See the GDBmanual for a fullguide to GDB commands. Here are some particularly useful commands forcs3210, some of which don’t typically come up outside of OS development.
info
QEMU represents each virtual CPU as a thread in GDB, so you can use allof GDB’s thread-related commands to view or manipulate QEMU’s virtualCPUs.
QEMU includes a built-in monitor that can inspect and modify the machinestate in useful ways. To enter the monitor, press Ctrl-a c in theterminal running QEMU. Press Ctrl-a c again to switch back to the serialconsole.
For a complete reference to the monitor commands, see the QEMUmanual.Here are some particularly useful commands:
Display a full dump of the machine’s internal register state. Inparticular, this includes the machine’s hidden segment state forthe segment selectors and the local, global, and interruptdescriptor tables, plus the task register. This hidden state is theinformation the virtual CPU read from the GDT/LDT when the segmentselector was loaded. Here’s the CS when running in the JOS kernel inlab 1 and the meaning of each field:
(Lab 2+) Display mapped virtual memory and permissions. For example,
tells us that the 0x00040000 bytes of memory from 0xef7c0000 to0xef800000 are mapped read/write and user-accessible, while thememory from 0xefbf8000 to 0xefc00000 is mapped read/write, but onlykernel-accessible.
QEMU also takes some useful command line arguments, which can be passedinto the JOS makefile using the QEMUEXTRAvariable.
Log all interrupts, along with a full register dump, toqemu.log. You can ignore the first two log entries, “SMM: enter”and “SMM: after RMS”, as these are generated before entering theboot loader. After this, log entries look like
The first line describes the interrupt. The 4: is just a logrecord counter. v gives the vector number in hex. e givesthe error code. i=1 indicates that this was produced by anint instruction (versus a hardware interrupt). The rest of theline should be self-explanatory. See inforegisters for a description of theregister dump that follows.
Note: If you’re running a pre-0.15 version of QEMU, the log will bewritten to /tmp instead of the current directory.
Questions or comments regarding cs3210?Send e-mail to the TAs at *cs3210-staff@cc.gatech.edu*.