imx6ull-驱动开发篇37——Linux MISC 驱动实验

目录

MISC 设备驱动

miscdevice结构体

misc_register 函数

misc_deregister 函数

实验程序编写

修改设备树

驱动程序编写

miscbeep.c

miscbeepApp.c

Makefile 文件

运行测试


MISC 驱动也叫做杂项驱动,也就是当某些外设无法进行分类的时候就可以使用 MISC 驱动。

MISC 设备驱动

 所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。MISC 设备会自动创建 cdev,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。

miscdevice结构体

我们需要向 Linux 注册一个 miscdevice 设备, miscdevice是一个结构体,定义在文件 include/linux/miscdevice.h 中。

miscdevice结构体内容如下:

/*** struct miscdevice - 混杂设备(miscdevice)结构体* * 用于表示Linux内核中的混杂设备(次设备号动态分配的字符设备)* 通常用于简单的字符设备驱动,避免手动申请主设备号*/
struct miscdevice {int minor;                   /* 次设备号(MISC_DYNAMIC_MINOR表示动态分配) */const char *name;            /* 设备名称(出现在/dev和sysfs中) */const struct file_operations *fops; /* 文件操作集合(实现read/write/ioctl等) *//* 以下字段通常由内核内部管理,驱动无需初始化 */struct list_head list;       /* 内核使用的链表头 */struct device *parent;       /* 父设备指针(可选) */struct device *this_device;  /* 内核创建的设备实例 *//* 可选扩展字段 */const struct attribute_group **groups; /* 属性组(sysfs接口) */const char *nodename;        /* 设备节点名称(覆盖默认的命名规则) */umode_t mode;               /* 设备节点权限(如0644) */
};

定义一个 MISC 设备(miscdevice 类型)以后,我们需要设置 minor、 name 和 fops 这三个成员变量。

minor 表示子设备号, 用户指定子设备号, Linux 系统已经预定义了一些 MISC 设备的子设备号,这些预定义的子设备号定义在include/linux/miscdevice.h 文件中,如下所示:

/* 输入设备类 */
#define PSMOUSE_MINOR         1    /* PS/2鼠标设备 */
#define MS_BUSMOUSE_MINOR     2    /* 微软总线鼠标(已废弃) */
#define ATIXL_BUSMOUSE_MINOR  3    /* ATI XL总线鼠标(已废弃) */
#define ATARIMOUSE_MINOR      5    /* Atari总线鼠标(已废弃) */
#define SUN_MOUSE_MINOR       6    /* Sun鼠标(已废弃) */
#define APOLLO_MOUSE_MINOR    7    /* Apollo鼠标(已废弃) */
#define PC110PAD_MINOR        9    /* IBM PC110触控板 */
#define ADB_MOUSE_MINOR       10   /* ADB总线鼠标(Mac) *//* 存储/设备控制类 */  
#define WATCHDOG_MINOR        130  /* 看门狗定时器 */
#define TEMP_MINOR            131  /* 温度传感器 */
#define RTC_MINOR             135  /* 实时时钟 */
#define EFI_RTC_MINOR         136  /* EFI实时时钟 */
#define SUN_OPENPROM_MINOR    139  /* Sun Open PROM *//* 网络/通信类 */
#define NVRAM_MINOR          144   /* 非易失性RAM */
#define I2O_MINOR            166   /* I2O设备 */
#define MICROCODE_MINOR      184   /* CPU微代码更新 *//* 特殊功能设备 */  
#define VHCI_MINOR           255   /* USB虚拟主机控制器 */
#define MISC_DYNAMIC_MINOR   255   /* 动态分配标志(与VHCI共享) */

我们在使用的时候可以从这些预定义的子设备号中挑选一个,当然也可以自己定义一个没有被其他设备使用地子设备号。

name : MISC 设备名字,当此设备注册成功以后就会在/dev 目录下生成一个名为 name的设备文件。

fops 就是字符设备的操作集合, MISC 设备驱动最终是需要使用用户提供的 fops操作集合。

misc_register 函数

当设置好 miscdevice 以后,就需要使用 misc_register 函数向系统中注册一个 MISC 设备。

misc_register 函数原型如下:

int misc_register(struct miscdevice * misc)
  • misc:要注册的 MISC 设备。
  • 返回值: 负数,失败; 0,成功。

在以前的字符设备驱动中,我们会使用如下几个函数完成设备创建过程:

alloc_chrdev_region(); /* 申请设备号 */
cdev_init(); /* 初始化 cdev */
cdev_add(); /* 添加 cdev */
class_create(); /* 创建类 */
device_create(); /* 创建设备 */

现在只需要使用 misc_register 函数来完成这些功能。

misc_deregister 函数

当我们卸载设备驱动模块的时候。需要调用 misc_deregister 函数来注销掉 MISC 设备,

misc_deregister 函数原型如下:

int misc_deregister(struct miscdevice *misc)
  • misc:要注销的 MISC 设备。
  • 返回值: 负数,失败; 0,成功。

以前注销设备驱动的时候,我们需要删除此前创建的 cdev、设备等等:

cdev_del(); /* 删除 cdev */
unregister_chrdev_region(); /* 注销设备号 */
device_destroy(); /* 删除设备 */
class_destroy(); /* 删除类 */

现在也只需要一个 misc_deregister 函数来实现。

实验程序编写

实验程序,我们需要采用 platform 加 misc 的方式编写 beep 驱动,这也是实际的 Linux 驱动中很常用的方法。采用 platform 来实现总线、设备和驱动, misc 主要负责完成字符设备的创建。

beep硬件原理图和芯片资料,可以参考:裸机学习实验5——蜂鸣器实验

修改设备树

正点原子I.MX6U-ALPHA开发板上的BEEP,使用了SNVS_TAMPER1这个PIN。

打开imx6ull-alientek-emmc.dts,在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_beep”的子节点。

pinctrl_beep”节点内容如下所示:

pinctrl_beep: beepgrp {fsl,pins = <MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x10B0 /* beep */>;
};

在根节点“/”下创建 BEEP 节点,节点名为“beep”。

beep”节点内容如下:

beep {#address-cells = <1>;                // 子节点地址空间占1个32位字#size-cells = <1>;                   // 子节点大小空间占1个32位字compatible = "atkalpha-beep";        // 匹配驱动的唯一标识符pinctrl-names = "default";           // 引脚控制状态名称pinctrl-0 = <&pinctrl_beep>;         // 关联的引脚配置组beep-gpio = <&gpio5 1 GPIO_ACTIVE_HIGH>; // GPIO控制定义:// - gpio5组第1个引脚// - 高电平有效status = "okay";                     // 设备启用状态
};

最后检查imx6ull-alientek-emmc.dts文件里,PIN是否被其它外设使用,若有则屏蔽

驱动程序编写

miscbeep.c

蜂鸣器的驱动文件,代码如下:
 

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>#define MISCBEEP_NAME		"miscbeep"	/* 名字 	*/
#define MISCBEEP_MINOR		144			/* 子设备号 */
#define BEEPOFF 			0			/* 关蜂鸣器 */
#define BEEPON 				1			/* 开蜂鸣器 *//* miscbeep设备结构体 */
struct miscbeep_dev{dev_t devid;			/* 设备号 	 */struct cdev cdev;		/* cdev 	*/struct class *class;	/* 类 		*/struct device *device;	/* 设备 	 */struct device_node	*nd; /* 设备节点 */int beep_gpio;			/* beep所使用的GPIO编号		*/
};struct miscbeep_dev miscbeep;		/* beep设备 *//** @description		: 打开设备* @param - inode 	: 传递给驱动的inode* @param - filp 	: 设备文件,file结构体有个叫做private_data的成员变量* 					  一般在open的时候将private_data指向设备结构体。* @return 			: 0 成功;其他 失败*/
static int miscbeep_open(struct inode *inode, struct file *filp)
{filp->private_data = &miscbeep; /* 设置私有数据 */return 0;
}/** @description		: 向设备写数据 * @param - filp 	: 设备文件,表示打开的文件描述符* @param - buf 	: 要写给设备写入的数据* @param - cnt 	: 要写入的数据长度* @param - offt 	: 相对于文件首地址的偏移* @return 			: 写入的字节数,如果为负值,表示写入失败*/
static ssize_t miscbeep_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{int retvalue;unsigned char databuf[1];unsigned char beepstat;struct miscbeep_dev *dev = filp->private_data;retvalue = copy_from_user(databuf, buf, cnt);if(retvalue < 0) {printk("kernel write failed!\r\n");return -EFAULT;}beepstat = databuf[0];		/* 获取状态值 */if(beepstat == BEEPON) {	gpio_set_value(dev->beep_gpio, 0);	/* 打开蜂鸣器 */} else if(beepstat == BEEPOFF) {gpio_set_value(dev->beep_gpio, 1);	/* 关闭蜂鸣器 */}return 0;
}/* 设备操作函数 */
static struct file_operations miscbeep_fops = {.owner = THIS_MODULE,.open = miscbeep_open,.write = miscbeep_write,
};/* MISC设备结构体 */
static struct miscdevice beep_miscdev = {.minor = MISCBEEP_MINOR,.name = MISCBEEP_NAME,.fops = &miscbeep_fops,
};/** @description     : flatform驱动的probe函数,当驱动与*                    设备匹配以后此函数就会执行* @param - dev     : platform设备* @return          : 0,成功;其他负值,失败*/
static int miscbeep_probe(struct platform_device *dev)
{int ret = 0;printk("beep driver and device was matched!\r\n");/* 设置BEEP所使用的GPIO *//* 1、获取设备节点:beep */miscbeep.nd = of_find_node_by_path("/beep");if(miscbeep.nd == NULL) {printk("beep node not find!\r\n");return -EINVAL;} /* 2、 获取设备树中的gpio属性,得到BEEP所使用的BEEP编号 */miscbeep.beep_gpio = of_get_named_gpio(miscbeep.nd, "beep-gpio", 0);if(miscbeep.beep_gpio < 0) {printk("can't get beep-gpio");return -EINVAL;}/* 3、设置GPIO5_IO01为输出,并且输出高电平,默认关闭BEEP */ret = gpio_direction_output(miscbeep.beep_gpio, 1);if(ret < 0) {printk("can't set gpio!\r\n");}/* 一般情况下会注册对应的字符设备,但是这里我们使用MISC设备* 所以我们不需要自己注册字符设备驱动,只需要注册misc设备驱动即可*/ret = misc_register(&beep_miscdev);if(ret < 0){printk("misc device register failed!\r\n");return -EFAULT;}return 0;
}/** @description     : platform驱动的remove函数,移除platform驱动的时候此函数会执行* @param - dev     : platform设备* @return          : 0,成功;其他负值,失败*/
static int miscbeep_remove(struct platform_device *dev)
{/* 注销设备的时候关闭LED灯 */gpio_set_value(miscbeep.beep_gpio, 1);/* 注销misc设备 */misc_deregister(&beep_miscdev);return 0;
}/* 匹配列表 */static const struct of_device_id beep_of_match[] = {{ .compatible = "atkalpha-beep" },{ /* Sentinel */ }};/* platform驱动结构体 */
static struct platform_driver beep_driver = {.driver     = {.name   = "imx6ul-beep",         /* 驱动名字,用于和设备匹配 */.of_match_table = beep_of_match, /* 设备树匹配表          */},.probe      = miscbeep_probe,.remove     = miscbeep_remove,
};/** @description	: 驱动出口函数* @param 		: 无* @return 		: 无*/
static int __init miscbeep_init(void)
{return platform_driver_register(&beep_driver);
}/** @description	: 驱动出口函数* @param 		: 无* @return 		: 无*/
static void __exit miscbeep_exit(void)
{platform_driver_unregister(&beep_driver);
}module_init(miscbeep_init);
module_exit(miscbeep_exit);
MODULE_LICENSE("GPL");

关键代码分析如下:

MISC 设备 beep_miscdev结构体,当系统启动以后就会在/dev/目录下存在一个名为“miscbeep”的设备文件。

static struct miscdevice beep_miscdev = {.minor = MISCBEEP_MINOR,.name = MISCBEEP_NAME,.fops = &miscbeep_fops,
};

miscbeep_probe函数,platform 框架的 probe 函数,当驱动与设备匹配以后此函数就会执行,首先在此函数中初始化 BEEP 所使用的 IO,然后通过 misc_register 函数向 Linux 内核注册MISC 设备 beep_miscdev。

ret = misc_register(&beep_miscdev);

miscbeep_remove函数,platform 框架的 remove 函数,调用 misc_deregister 函数来注销MISC 设备。

misc_deregister(&beep_miscdev);

miscbeepApp.c

测试app文件miscbeepApp.c,代码如下:

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"#define BEEPOFF	0
#define BEEPON 	1/** @description		: main主程序* @param - argc 	: argv数组元素个数* @param - argv 	: 具体参数* @return 			: 0 成功;其他 失败*/
int main(int argc, char *argv[])
{int fd, retvalue;char *filename;unsigned char databuf[1];if(argc != 3){printf("Error Usage!\r\n");return -1;}filename = argv[1];fd = open(filename, O_RDWR);	/* 打开beep驱动 */if(fd < 0){printf("file %s open failed!\r\n", argv[1]);return -1;}databuf[0] = atoi(argv[2]);	/* 要执行的操作:打开或关闭 */retvalue = write(fd, databuf, sizeof(databuf));if(retvalue < 0){printf("BEEP Control Failed!\r\n");close(fd);return -1;}retvalue = close(fd); /* 关闭文件 */if(retvalue < 0){printf("file %s close failed!\r\n", argv[1]);return -1;}return 0;
}
Makefile 文件

makefile文件只需要修改 obj-m 变量的值,改为miscbeep.o。

KERNELDIR := /home/huax/linux/linux_test/linux-imx-rel_imx_4.1.15_2.1.0_gaCURRENT_PATH := $(shell pwd)
obj-m := miscbeep.obuild: kernel_modules
kernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

运行测试

编译代码:

make -j32 //编译makefile文件
arm-linux-gnueabihf-gcc miscbeepApp.c -o miscbeepApp  //编译测试app

编译成功以后,就会生成一个名为“miscbeep.ko”的驱动模块文件,和miscbeepApp 应用程序。

将编译出来的miscbeep.ko 和 miscbeepApp 这两个文件拷贝到rootfs/lib/modules/4.1.15 目录中,重启开发板。

进入到目录 lib/modules/4.1.15 中,输入如下命令加载 miscbeep.ko 这个驱动模块:

depmod //第一次加载驱动的时候需要运行此命令
modprobe miscbeep.ko //加载设备模块

当驱动模块加载成功以后,我们可以在/sys/class/misc 这个目录下看到一个名为“miscbeep”的子目录,如图:

所有的 misc 设备都属于同一个类, /sys/class/misc 目录下就是 misc 这个类的所有设备,每个设备对应一个子目录。

驱动与设备匹配成功以后就会生成/dev/miscbeep 这个设备驱动文件,要查看这个文件的主次设备号,可以输入如下命令:

ls /dev/miscbeep -l

输入如下命令测试 BEEP:

./miscbeepApp /dev/miscbeep 1 //打开 BEEP
./miscbeepApp /dev/miscbeep 0 //关闭 BEEP

观察一下 BEEP 能否打开和关闭,如果可以的话就说明驱动工作正常。

卸载驱动,输入如下命令:

rmmod miscbeep.ko

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94087.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 项目“交互式展厅管理客户端“针对的是“.NETFramework,Version=v4.8”,但此计算机上没有安装它。

C# 项目“交互式展厅管理客户端"针对的是".NETFramework,Versionv4.8”&#xff0c;但此计算机上没有安装它。 解决方法&#xff1a; C# 项目“交互式展厅管理客户端"针对的是".NETFramework,Versionv4.8”&#xff0c;但此计算机上没有安装它。 下载地址…

FFmpeg及 RTSP、RTMP

FFmpeg 是一个功能强大的跨平台开源音视频处理工具集 &#xff0c;集录制、转码、编解码、流媒体传输等功能于一体&#xff0c;被广泛应用于音视频处理、直播、点播等场景。它支持几乎所有主流的音视频格式和协议&#xff0c;是许多媒体软件&#xff08;如 VLC、YouTube、抖音等…

金山办公的服务端开发工程师-25届春招笔试编程题

1.作弊 溪染&#xff1a;六王毕&#xff0c;四海一&#xff1b;蜀山兀&#xff0c;阿房出。覆压三百余里&#xff0c;隔离天日。骊山北构而西折&#xff0c;直走咸阳。二川溶溶&#xff0c;流入宫墙。五步一楼&#xff0c;十步一阁&#xff1b;廊腰缦回&#xff0c;檐牙高啄&am…

注意力机制中为什么q与k^T相乘是注意力分数

要理解 “qkT\mathbf{q} \times \mathbf{k}^TqkT 是注意力分数”&#xff0c;核心是抓住注意力机制的本质目标 ——量化 “查询&#xff08;q&#xff09;” 与 “键&#xff08;k&#xff09;” 之间的关联程度&#xff0c;而向量点积&#xff08;矩阵相乘的元素本质&#xff…

Krea Video:Krea AI推出的AI视频生成工具

本文转载自&#xff1a;Krea Video&#xff1a;Krea AI推出的AI视频生成工具 - Hello123工具导航 ** 一、平台定位与技术特性 Krea Video 是 Krea AI 推出的 AI 视频生成工具&#xff0c;通过结合关键帧图像与文本提示实现精准视频控制。用户可自定义视频首尾帧、为每张图片设…

C++初阶(2)C++入门基础1

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式 等。熟悉C语言之后&#xff0c;对C学习有一定的帮助。 本章节主要目标&#xff1a; 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计不合理的地方…

ANSI终端色彩控制知识散播(II):封装的层次(Python)——不同的逻辑“一样”的预期

基础高阶各有色&#xff0c;本原纯真动乾坤。 笔记模板由python脚本于2025-08-22 18:05:28创建&#xff0c;本篇笔记适合喜欢终端色彩ansi编码和python的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述…

前端无感刷新 Token 的 Axios 封装方案

在现代前端应用中&#xff0c;基于 Token 的身份验证已成为主流方案。然而&#xff0c;Token 过期问题常常困扰开发者 —— 如何在不打断用户操作的情况下自动刷新 Token&#xff0c;实现 "无感刷新" 体验&#xff1f;本文将详细介绍基于 Axios 的解决方案。什么是无…

【数据结构】线性表——链表

这里写自定义目录标题线性表链表&#xff08;链式存储&#xff09;单链表的定义单链表初始化不带头结点的单链表初始化带头结点的单链表初始化单链表的插入按位序插入带头结点不带头结点指定结点的后插操作指定结点的前插操作单链表的删除按位序删除&#xff08;带头结点&#…

容器安全实践(三):信任、约定与“安全基线”镜像库

容器安全实践&#xff08;一&#xff09;&#xff1a;概念篇 - 从“想当然”到“真相” 容器安全实践&#xff08;二&#xff09;&#xff1a;实践篇 - 从 Dockerfile 到 Pod 的权限深耕 在系列的前两篇文章中&#xff0c;我们探讨了容器安全的底层原理&#xff0c;并详细阐述…

百度面试题:赛马问题

题目现在有25匹马和一个赛马场&#xff0c;赛马场有5条跑道&#xff08;即一次只能比较5匹马&#xff09;&#xff0c;并且没有秒表等计时工具&#xff0c;因此每次赛马只能知道这5匹马的相对时间而非绝对时间。问&#xff1a;如何筛选出跑的最快的3匹马&#xff1f;需要比赛几…

centos下安装Nginx(搭建高可用集群)

CentOS-7下安装Nginx的详细过程_centos7安装nginx-CSDN博客 centos换yum软件管理包镜像 CentOS 7.* 更换国内镜像源完整指南_centos7更换国内源-CSDN博客 VMware虚拟机上CentOS配置nginx后,本机无法访问 执行命令&#xff1a;/sbin/iptables -I INPUT -p tcp --dport 80 -j…

实时视频技术选型深度解析:RTSP、RTMP 与 WebRTC 的边界

引言&#xff1a;WebRTC 的“光环”与现实落差 在实时音视频领域&#xff0c;WebRTC 常常被贴上“终极解决方案”的标签&#xff1a;浏览器原生支持、无需插件、点对点传输、毫秒级延迟&#xff0c;这些特性让它在媒体和开发者群体中拥有了近乎神话般的地位。许多人甚至认为&a…

基于深度学习的阿尔茨海默症MRI图像分类系统

基于深度学习的阿尔茨海默症MRI图像分类系统 项目概述 阿尔茨海默症是一种进行性神经退行性疾病&#xff0c;早期诊断对于患者的治疗和生活质量至关重要。本项目利用深度学习技术&#xff0c;基于MRI脑部扫描图像&#xff0c;构建了一个高精度的阿尔茨海默症分类系统&#xff0…

54 C++ 现代C++编程艺术3-移动构造函数

C 现代C编程艺术3-移动构造函数 文章目录C 现代C编程艺术3-移动构造函数场景1&#xff1a;动态数组资源转移 #include <iostream> #include <vector> class DynamicArray { int* data; size_t size; public: // 移动构造函数&#xff08;关键实现&#xf…

Sping Boot + RabbitMQ :如何在Spring Boot中整合RabbitMQ实现消息可靠投递?

Spring Boot整合RabbitMQ实现消息可靠投递全解析 在分布式系统中&#xff0c;消息中间件是解耦、异步、流量削峰的核心组件。RabbitMQ作为高可靠、易扩展的AMQP协议实现&#xff0c;被广泛应用于企业级场景。但消息传递过程中可能因网络波动、服务宕机等问题导致消息丢失&#…

STAR-CCM+|K-epsilon湍流模型溯源

【1】引言 三维CFD仿真经典软件很多&#xff0c;我接触过的有Ansys和STAR-CCM两种。因为一些机缘&#xff0c;我使用STAR-CCM更多&#xff0c;今天就来回顾一下STAR-CCM中K-epsilon湍流模型的基本定义。 【2】学习地址介绍 点击链接User Guide可以到达网页版本的STAR-CCM 24…

osgEarth 图像融合正片叠底

* 需求&#xff1a;* 高程渲染图 RGB.tif、 山体阴影图 AMP.tif** 高程渲染图 rgb波段分别 乘以 山体阴影图r波段&#xff0c; 然后除以255(AI说 读取的纹理就已经归一化到了 0~1 范围&#xff0c;不用除以 255)。本人遥感知识匮乏。问了AI,以上 需求在许多商业软件上已实现。…

Java接口响应速度优化

在 Java 开发中&#xff0c;接口响应速度直接影响用户体验和系统吞吐量。优化接口性能需要从代码、数据库、缓存、架构等多个维度综合考量&#xff0c;以下是具体方案及详细解析&#xff1a;一、代码层面优化代码是接口性能的基础&#xff0c;低效的代码会直接导致响应缓慢。1.…

A Large Scale Synthetic Graph Dataset Generation Framework的学习笔记

文章的简介 作者提出了一个可扩展的合成图生成框架&#xff0c;能够从真实图中学习结构和特征分布&#xff0c;并生成任意规模的图数据集&#xff0c;支持&#xff1a; 节点和边的结构生成节点和边的特征生成特征与结构的对齐&#xff08;Aligner&#xff09; 它区别于GraphWor…