首先先来构建一个简单的Linux内核。大体上是分为两个步骤,首先是现在内核源代码编译内核,然后制作根文件系统,而实验楼已经为我们已经搭建了实验环境,只需要至今cd进Linux 3.18.6就行了,以下是MenuOS正在启动
到此为止就完成了一个简单的内核搭建。然后我们开始使用GDB调试,再重新打开一个终端可以进行如下步骤:
打开shell终端,执行以下命令:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img -s -S
关于-s和-S选项的说明:
-S freeze CPU at startup (use ’c’ to start execution) 在系统启动的时候冻结CPU,使用c键继续执行后续操作
-s shorthand for -gdb tcp::1234 打开远程调试端口,默认使用tcp协议1234端口,若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
指令的作用是在开始的时候就让CPU停止在启动的那一刻,我们可以看到如下的界面:
此时在刚才新建的那个终端窗口输入gdb进入调试模式:
gdb (gdb)filelinux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表 (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行 (gdb)breakstart_kernel # 断点的设置可以在target remote之前,也可以在之后
可以看到进入gdb调试界面
按c键继续执行到start_kernel()函数
然后我们可以使用list命令常看停止断点的源代码:如下图所示就是start_kernel()部分的代码
MenuOS的网络功能
cd ~/LinuxKernel git clone https://github.com/mengning/linuxnet.git cd linuxnet/lab2 make cd ../../menu/ sudo gedit Makefile make rootfs cd ~/LinuxKernel cd linuxnet/lab3 sudo gedit Makefile make rootfs
TCP连接正常