• 下载内核,解压,编译

mdkir LinuxKernel#创建工作目录
cd LinuxKernel#进入工作目录
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
xd -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar # 解压内核文件
cd linux-5.0.1 #进入·内核·文件夹·
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev#安装内核编译工具
make i386_defconfig#内核为32位默认选项
make menuconfig#这里是进入menu界面,更改设置,见下图
make#编译内核

        这里我在make这一步总是遇到不能编译成功的问题·,后来通过apt-get upgrade命令更新软件后,就没问题了,进入menuconfig目的是更改选项开启内核调试模式,后面聚能就能看到系统调用接口代码,详见下图。

  •  通过qemu加载内核

sudo apt install qemu#安装qemu
qemu-system-i386 -kernel arch/x86/boot/bzImage#加载32内核

        弹出如图界面:

  •  构建menuos

cd ..#返回LinuxKernel
git clone https://github.com/mengning/menu.git#拷贝文件
cd menu#加载进入menu
sudo apt-get install libc6-dev-i386 #安装编译环境
vim makefile#修改makefile,见下图 make rootfs cd .. #返回LinuxKernel
qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img

        Makefile文件修改后:

        qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img弹出下图:

  • 构建GDB调试环境、建立GDB SERVER连接

qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img -append nokaslr -s -S#弹出和平qemu窗口,不要关闭。再打开一个新终端,接着输入下面命令
cd home/rings/LinuxKernel/linux-5.0.1
file vmlinux #加载符号表
break start_kernel #在内核函数处设置断点
target remote:1234 #建立gdb和gdb server之间的连接
c #回车让qemu上的Linux继续运行
list #查看之前设置的断点

        c 回车过后之前黑屏的窗口变为下图:

  • 将TCP网络程序集中到menu OS中

cd ..#回到LinuxKernel
git clone https://github.com/mengning/linuxnet.git cd linuxnet/lab2 make cd ../lab3 vim Makefile#同样,修改命令中linux版本号 make rootfs#结果见下

        menu OS的网络可以工作了,见图:

  • 跟踪内核代码

gdb
file vmlinux #加载符号表
target remote:1234
break start_kernel
c
list
b sock_init
c
list
b inet_init
c
list
02-13 05:02