# 编译内核
# 如果一开始就打算将所有的编译结果放到build目录,那么之后
# 无论干嘛,就连make modules_install也要带上O=build,
# make modules_install是将编译出来的模块安装到指定目录,必须使用绝对路径。
# 注意,模块有很多,最好用哪个安装哪个。
make mrproper
make clean
mkdir build
make O=build menuconfig
make O=build -j 8 all 2>build/make_error_output
(此时不做)make O=build modules_install INSTALL_MOD_PATH=/home/jison/code/linux_bench/fs
# 配置qemu使用的根文件系统磁盘disk-master.raw
# 需要哪个模块再安装哪个模块
qemu-img create -f raw disk-master.raw 1024M
mkfs.ext4 disk-master.raw
file disk-master.raw
mkdir fs
sudo mount -o loop ./disk-master.raw ./fs
(选做)make O=build modules_install INSTALL_MOD_PATH=/home/jison/code/linux_bench/fs
# 编译busybox,从而获得最精简的根目录内容
# 在make menuconfig配置使用静态编译
# make install的时候直接把整个根文件系统放到挂载的目录里
make menuconfig
make -j 8
make CONFIG_PREFIX=/home/jison/code/linux_bench/fs install
# 制作根文件系统
cd ./fs
mkdir proc dev sys tmp
$ vim fs/etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
$ vim fs/etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/bin/umount -a –r
$ vim fs/etc/init.d/rcS
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
echo -e "Welcome to Jison Linux."
# 解开挂载
sudo umount ./fs
# 运行qemu
# 如果不写init=/linuxrc,则会自动调用/sbin/init,效果一样
# 如果发现qemu键盘错乱,则加上“-k en-us”
qemu-system-x86_64 -m 1G -smp 4 -k en-us -kernel ./bzImage -drive format=raw,file=./disk-master.raw -append "root=/dev/sda init=/linuxrc rw"
# 启动qemu时使用GDB调试
# Qemu虚拟机会在启动时暂停,必须使用另一个终端启动gdb并加载未压缩内核(内核符号表),
# 然后链接通过tcp链接本地1234端口,然后加断点,最后使用c,开始执行到断点处,就可以
# 用gdb分析运行过程,和调试ucore差不多了就。
qemu-system-x86_64 -S -s -m 1G -smp 4 -k en-us -kernel ./bzImage -drive format=raw,file=./disk-master.raw -append "root=/dev/sda init=/linuxrc nokaslr"
# 直接调试vmlinux
$ gdb ../linux_kernel_study/linux-5.19.12/build/vmlinux
# 或者可以像ucore那样进入gdb后用file命令将vmlinux加载进来
$ gdb
(gdb) file ../linux_kernel_study/linux-5.19.12/build/vmlinux
# 接下来连接qemu
# 因为运行qemu的时候使用命令“-s”会默认占用1234端口,所以在gdb里面要连接本地1234端口
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000000000000000 in fixed_percpu_data ()
(gdb) b start_kernel
# 开启美观打印struct类型变量
(gdb) set print pretty on
(gdb) p init_task
# 退出
(gdb) q
# 直接将gdb要使用的命令写到gdbinit文件中,通过“-x”使用这个文件。
# gdbinit就放到内核源码根目录下
$ cat gdbinit
file build/vmlinux
target remote :1234
# 就在gdbinit的目录下执行该命令,gdbinit前面不能带路径。
$ gdb -x gdbinit
# 备注
# 可以通过将“-s”改为“-gdb tcp::1134”的方式,将qemu的调试端口修改为1134,
# 这样在gdb里面就可以通过连接1134端口来连接qemu进行调试了。
qemu-system-x86_64 -m 1G -smp 4 -k en-us -kernel ./bzImage -drive format=raw,file=./disk-master.raw -append "root=/dev/sda init=/linuxrc nokaslr" -S -gdb tcp::1134
用qemu搭载Linux内核+文件系统步骤
于 2023-01-27 16:39:36 首次发布