UE5 C++(15):宏 UFUNCTION() 修饰成员函数,BlueprintCallable,Category,BlueprintPure 纯函数,
2026/1/9 1:00:57
//导出qemu设备树到内核根目录 qemu-system-aarch64 -machine virt -machine dumpdtb=origin.dtb //反编译成dts ./scripts/dtc/dtc -I dtb -O dts -o origin.dts origin.dtb //在origin.dts根节点下添加自定义节点 /{ quan{ #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; myLed{ compatible = "my devicetree"; reg = <0xFDD60000 0x00000004>; }; }; }; //编译成dtb ./scripts/dtc/dtc -I dts -O dtb -o finalized.dtb origin.dts //启动qemu并指定指定自定义dtb(-dtb finalized.dtb) qemu-system-aarch64 -machine virt -cpu cortex-a57 -m 1024 -smp 4 -kernel arch/arm64/boot/Image -dtb finalized.dtb -drive file=./rootfs.ext4,format=raw,if=none,id=rootdev -device virtio-blk-device,drive=rootdev -append "root=/dev/vda rw console=ttyAMA0 earlycon=pl011,0x09000000 loglevel=8" -nographic --fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount //启动之后会有如下打印如何配置,使用qemu启动内核参考这里
Ubuntu下QEMU构建虚拟arm架构Linux
devicetree.c
#include <linux/module.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h> // 平台设备的初始化函数 static int my_platform_probe(struct platform_device *pdev) { printk(KERN_INFO "my_platform_probe: Probing platform device\n"); // 添加设备特定的操作 // ... return 0; } // 平台设备的移除函数 static void my_platform_remove(struct platform_device *pdev) { printk(KERN_INFO "my_platform_remove: Removing platform device\n"); // 清理设备特定的操作 // ... } const struct of_device_id of_match_table_id[] = { {.compatible="my devicetree"}, }; // 定义平台驱动结构体 static struct platform_driver my_platform_driver = { .probe = my_platform_probe, .remove = my_platform_remove, .driver = { .name = "my_platform_device", .owner = THIS_MODULE, .of_match_table = of_match_table_id, }, }; // 模块初始化函数 static int __init my_platform_driver_init(void) { int ret; // 注册平台驱动 ret = platform_driver_register(&my_platform_driver); if (ret) { printk(KERN_ERR "Failed to register platform driver\n"); return ret; } printk(KERN_INFO "my_platform_driver: Platform driver initialized\n"); return 0; } // 模块退出函数 static void __exit my_platform_driver_exit(void) { // 注销平台驱动 platform_driver_unregister(&my_platform_driver); printk(KERN_INFO "my_platform_driver: Platform driver exited\n"); } module_init(my_platform_driver_init); module_exit(my_platform_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("quan");makefile
obj-m += devicetree.o KDIR:=/home/linux/samba-mount/linux-kernel/linux-6.17.5 PWD?=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules echo $(PWD) clean: rm -rf *.ko *.o *.mod *.mod.o *.mod.c *.symvers *.order install: cp *.ko ../../linux-kernel/linux-6.17.5/kmodules编译之后,通过共享目录给到qemu中的arm架构内核
如何配置,使用共享目录参考这里
Ubuntu下QEMU构建虚拟arm架构Linux
验证是否有效