安装openEuler系统的树莓派使用qemu模拟一个内核的运行
前言
首先要在树莓派安装openEuler系统以及安装图形化桌面,可以参考我之前的博客树莓派4b-入门以及树莓派openEuler系统如何实现可视化桌面
安装qemu
这里参照了博客openEuler上如何安装qemu,需要注意的是如果在下载了qemu-6.1.0后要解压使用xz -d命令可能会报错,可以使用如下命令解压
tar -xvf qemu-6.1.0.tar.xz
我在安装依赖库时,使用
dnf install -y libglib2-devel pixman-devel
命令时,pixman-devel无法安装成功,不影响后面的操作。
然后cd qemu-6.1.0,执行configure,我这里遇到了ninja问题,使用如下命令安装
dnf install ninja-build
最后make && make install,这里需要。
至此qemu安装完成。
在树莓派中安装menu和下载编译linux-3.18.6内核
在树莓派上下载menu
首先树莓派上要安装git。
dnf install git
然后在github上克隆menu
git clone https://github.com/mengning/menu.git
下载linux-3.18.6并编译
后续使用qemu启动镜像需要用到linux-3.18.6的内核,需要这里下载linux-3.18.6
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
然后进入linux-3.18.6
cd linux-3.18.6
make defconfig
make
在make时可能会遇到linux/compiler-gcc10.h没有这个文件或目录的问题,这是因为我的gcc版本是10但是这个内核最高gcc版本是5(可以看看你系统gcc版本),解决方法是
cd include/linux
mv compiler-gcc5.h compiler-gcc10.h
cd ~/linux-3.18.6
make
可以对标你的系统解决。。。
但是又遇到了新的问题multiple definition of yylloc,主要是我的gcc版本太高,参考博客新版本gcc(gcc10.x)编译Linux内核,错误:multiple definition of `yylloc‘解决。
make很长时间后完成,可以看看linux-3.18.6/arch/arm64/boot下是否有Image这是后续的关键。
理解进程调度时机跟踪分析进程调度与进程切换的过程
之前已经使用x86架构完成了实验,现在在树莓派arm64上完成,我之前的博客可见理解进程调度时机跟踪分析进程调度与进程切换的过程-基于实验楼。
现在使用putty登录树莓派,然后使用类似
vncserver -geometry 1280x720 -depth 32 :3
命令,使用VNC Viewer登录上树莓派图形化界面(qemu只能在图形化桌面下使用)。进入menu,这里改一下Makefile中的内容,在arm64架构中好像没有32位汇编,所以那个-m32肯定是不行的,同时qemu在arm64架构下指令也和x86下不一样。Makefile内容如下(文件目录根据自己系统而不同):
#
# Makefile for Menu Program
#
CC_PTHREAD_FLAGS = -lpthread
CC_FLAGS = -c
CC_OUTPUT_FLAGS = -o
CC = gcc
RM = rm
RM_FLAGS = -f
TARGET = test
OBJS = linktable.o menu.o test.o
all: $(OBJS)
$(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS)
rootfs:
gcc -o init linktable.c menu.c test.c -static -lpthread
gcc -o hello hello.c -static
find init hello | cpio -o -Hnewc |gzip -9 > ../rootfs.img
qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel ../linux-3.18.6/arch/arm64/boot/Image -initrd ../rootfs.img
.c.o:
$(CC) $(CC_FLAGS) $<
clean:
$(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bak
写入Makefile后保存,然后使用make rootfs命令。
make rootfs
说明可以加载出内核。现在将这个内核冻结起来,再使用gdb调试。
qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel ../linux-3.18.6/arch/arm64/boot/Image -initrd ../rootfs.img -s -S
开启另一个终端
cd ~/linux-3.18.6
gdb
file vmlinux
target remote:1234
现在可以设置几个断点(其中一个断点好像无法设置)
b schedule
b context_switch
b switch_to
b pick_next_task
然后按c,跑起来。
具体分析在我这节之前写的博客里。