news 2026/3/23 22:02:35

66.qemu设备树配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
66.qemu设备树配置
//导出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

验证是否有效

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 22:29:51

42545

45638

作者头像 李华
网站建设 2026/3/19 13:45:14

Java中有哪些垃圾回收算法?

Java中的垃圾回收算法主要有3种&#xff0c;分别是标记-清除算法、复制算法、标记-整理算法。 1.标记-清除算法 这种算法的逻辑其实很简单&#xff0c;就是先遍历一遍&#xff0c;把有用的东西都打个勾✅&#xff08;标记&#xff09;&#xff0c;然后把那些没打勾的垃圾直接扔…

作者头像 李华
网站建设 2026/3/15 14:05:48

在RabbitMQ中,怎么确保消息不会丢失?

为了确保消息不会丢失&#xff0c;可以从以下3个方面解决&#xff1a; 1.在创建队列的时候设置durable为true&#xff0c;发布消息的时候设置delivery为2&#xff0c;从而确保队列和消息都是持久的。 这样&#xff0c;就算是RabbitMQ服务器重启也不会造成消息的丢失。 2.开启发…

作者头像 李华
网站建设 2026/3/18 1:32:46

两个链表的第一个公共结点

求解代码 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {// 初始化两个临时指针&#xff0c;分别指向两个链表的头节点ListNode temp1 pHead1;ListNode temp2 pHead2;// 只要两个指针不指向同一个节点&#xff0c;就继续遍历while (temp1 ! temp2…

作者头像 李华
网站建设 2026/3/15 18:02:29

二分搜索树的特性

二分搜索树的特性 引言 二分搜索树(Binary Search Tree,BST)是一种常见的树形数据结构,在计算机科学中有着广泛的应用。它是一种特殊的二叉树,具有以下特性:每个节点都有一个键值,左子树中的所有键值都小于该节点的键值,右子树中的所有键值都大于该节点的键值。本文将…

作者头像 李华