Concepts you may want to Google beforehand: monolithic kernel, microkernel, debugger, gdb
請自行g(shù)oogle:monolithic kernel, microkernel, debugger, gdb
Goal: Pause and organize our code a little bit. Then learn how to debug the kernel with gdb
本節(jié)課目標(biāo):稍微暫停,梳理一下我們的代碼,然后學(xué)習(xí)如何使用gdb調(diào)試我們的kernel昨稼。
Maybe you didn't realize it, but you already have your own kernel running!
也許你沒有意識(shí)到你已經(jīng)擁有了一個(gè)可以跑起來的內(nèi)核。
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.
雖然我們的內(nèi)核還很小坷备,只能打印'X'。但現(xiàn)在是時(shí)候停一下挨务,將這些代碼放入各自的文件夾中击你,寫一個(gè)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.
看一看新的文件結(jié)構(gòu)吧谎柄,幾乎都是從之前的課程目錄中引用過的丁侄,所以如果要修改這些文件,最好是刪掉這些引用重新寫個(gè)新的朝巫。
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)
由于后面我們大部分時(shí)間都會(huì)用C來編碼鸿摇,我們將用gdb連接qemu提供的調(diào)試端口。
第一步劈猿,我們需要一個(gè)交叉編譯版本的gdb拙吉,蘋果系統(tǒng)使用的lldb無法識(shí)別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="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.