QEMU裸机开发之M模式核间中断
QEMU的virt平台基本是参考SIFIVE的U540平台设计的,所以其寄存器大部分都和U540中的一样,我们再来看下CLINT中定义的核间中断设置寄存器,如下所示。
每个寄存器都是4字节大小,由于我们当前只使用了一个核,所以我们只需要操作第一个“msip”寄存器即可。这个寄存器只有bit0有效,置1触发核间中断,置0取消核间中断。定义“clint.c”,对这两个操作封装相应的函数,如下所示。
#include "address.h" // core local interruptor (CLINT), which contains the timer. #define CLINT_MSIP (CLINT_REG_BASE + 0x0) void msoftint_make(void) { *(volatile unsigned int*)CLINT_MSIP = 1; } void msoftint_clear(void) { *(volatile unsigned int*)CLINT_MSIP = 0; }
随后在“start”中添加触发核间中断的代码,如下所示。
void start(void) { printf("%s %d.\r\n", __func__, __LINE__); machine_trap_init(); msoftint_make(); }
在“trap.c”中添加取消核间中断的代码,不然会一直产生中断,如下所示。
void machine_trap(void) { printf("%s %d.\r\n", __func__, __LINE__); msoftint_clear(); }
在命令行执行“make qemu”,可以在最后看到打印的函数名以及行号信息,如下所示。
gewenbin@gewenbin-virtual-machine:~/Desktop/qemu_test/lesson4$ make qemu riscv64-unknown-elf-gcc -c -o entry.o entry.S riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o start.o start.c riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o uart.o uart.c riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o trap.o trap.c riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o clint.o clint.c riscv64-unknown-elf-ld -z max-page-size=4096 -T kernel.ld -o kernelimage entry.o start.o uart.o trap.o clint.o riscv64-unknown-elf-objdump -S kernelimage > kernel.asm riscv64-unknown-elf-objdump -t kernelimage | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel.sym qemu-system-riscv64 -machine virt -bios none -kernel kernelimage -m 128M -smp 1 -nographic start 28. machine_trap 7.
工程源码:链接:https://pan.baidu.com/s/1TnTYr7mywdKj5bxpdmWnyA,提取码:q772,见lesson4。
评论