从头写一个操作系统 12 (构建工具->GDB调试QEMU)

Concepts you may want to Google beforehand: monolithic kernel, microkernel, debugger, gdb

请自行google:monolithic kernel, microkernel, debugger, gdb

Goal: Pause and organize our code a little bit. Then learn how to debug the kernel with gdb

本节课目标:稍微暂停,梳理一下我们的代码,然后学习如何使用gdb调试我们的kernel。

Maybe you didn't realize it, but you already have your own kernel running!
也许你没有意识到你已经拥有了一个可以跑起来的内核。

However, it does very little, just print an 'X'. Now is the time to stop for a moment and organize the code into folders, create a scalable Makefile for future code, and think on a strategy.

虽然我们的内核还很小,只能打印'X'。但现在是时候停一下,将这些代码放入各自的文件夹中,写一个Makefile。

Take a look at the new folder structure. Most of the files have been symlinked from previous lessons, so if we have to change them at some point, it will be a better idea to remove the symlink and create a new file.

看一看新的文件结构吧,几乎都是从之前的课程目录中引用过的,所以如果要修改这些文件,最好是删掉这些引用重新写个新的。

Furthermore, since from now on we will use mostly C to code, we'll take advantage of qemu's ability to open a connection to gdb. First, let's install a cross-compiled gdb since OSX uses lldb which is not compatible with the ELF file format (neither is the gdb available on Homebrew's repos)

由于后面我们大部分时间都会用C来编码,我们将用gdb连接qemu提供的调试端口。
第一步,我们需要一个交叉编译版本的gdb,苹果系统使用的lldb无法识别ELF格式(并且,homebrew的仓库里也查不到gdb)。

cd /tmp/src
curl -O http://ftp.rediris.es/mirror/GNU/gdb/gdb-7.8.tar.gz
tar xf gdb-7.8.tar.gz
mkdir gdb-build
cd gdb-build
export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
../gdb-7.8/configure --target="TARGET" --prefix="PREFIX" --program-prefix=i386-elf-
make
make install

Check out the Makefile target make debug. This target uses builds kernel.elf, which is an object file (not binary) with all the symbols we generated on the kernel, thanks to the -g flag on gcc. Please examine it with xxd and you'll see some strings. Actually, the correct way to examine the strings in an object file is by strings kernel.elf

We can take advantage of this cool qemu feature. Type make debug and, on the gdb shell:

Set up a breakpoint in kernel.c:main(): b main
Run the OS: continue
Run two steps into the code: next then next. You will see that we are just about to set the 'X' on the screen, but it isn't there yet (check out the qemu screen)
Let's see what's in the video memory: print *video_memory. There is the 'L' from "Landed in 32-bit Protected Mode"
Hmmm, let's make sure that video_memory points to the correct address: print video_memory
next to put there our 'X'
Let's make sure: print *video_memory and look at the qemu screen. It's definitely there.
Now is a good time to read some tutorial on gdb and learn super useful things like info registers which will save us a lot of time in the future!

You may notice that, since this is a tutorial, we haven't yet discussed which kind of kernel we will write. It will probably be a monolithic one since they are easier to design and implement, and after all this is our first OS. Maybe in the future we'll add a lesson "15-b" with a microkernel design. Who knows.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,425评论 0 10
  • The Inner Game of Tennis W Timothy Gallwey Jonathan Cape ...
    网事_79a3阅读 12,232评论 3 20
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,834评论 0 23
  • 1、为什么会有意志力? 人类的进化需要:为了适应环境,需要与他人合作、共享资源,维持彼此关系。 因此,做事不能随心...
    An_An阅读 223评论 0 3
  • 活了二十年 从来没有人给过我一次意外感动或惊喜 也没有人在我生日的时候给过我特别的礼物 生病的时候得到的只是一些不...
    李文雅阅读 323评论 2 1