用qemu搭载Linux内核+文件系统步骤

# 编译内核
# 如果一开始就打算将所有的编译结果放到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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值