linux字符设备

  • 动态申请设备号

  • 静态申请设备号

  • cdev的结构体介绍

  • cdev_init () 结构体介绍

有了设备号后用cdev_init 函数初始化结构体

c 复制代码
/**
 * cdev_init() - initialize a cdev structure
 * @cdev: the structure to initialize
 * @fops: the file_operations for this device
 *
 * Initializes @cdev, remembering @fops, making it ready to add to the
 * system with cdev_add().
 */
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
	memset(cdev, 0, sizeof *cdev);
	INIT_LIST_HEAD(&cdev->list);
	kobject_init(&cdev->kobj, &ktype_cdev_default);
	cdev->ops = fops;
}
  • step3 cdev_add 函数设置

向系统添加一个cdev结构体

  • 参数1:添加cdev结构体
  • 参数2:添加设备号
  • 参数3:注册的设备个数
c 复制代码
/**
 * cdev_add() - add a char device to the system
 * @p: the cdev structure for the device
 * @dev: the first device number for which this device is responsible
 * @count: the number of consecutive minor numbers corresponding to this
 *         device
 *
 * cdev_add() adds the device represented by @p to the system, making it
 * live immediately.  A negative error code is returned on failure.
 */
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
{
	int error;

	p->dev = dev;
	p->count = count;

	if (WARN_ON(dev == WHITEOUT_DEV)) {
		error = -EBUSY;
		goto err;
	}

	error = kobj_map(cdev_map, dev, count, NULL,
			 exact_match, exact_lock, p);
	if (error)
		goto err;

	kobject_get(p->kobj.parent);

	return 0;

err:
	kfree_const(p->kobj.name);
	p->kobj.name = NULL;
	return error;
}

代码实现流程


卸载字符设备 通过modulecdec_exit() 函数实现

  • 先卸载设备号
  • 再进行cdev结构体的删除

makefile

  • 实现cdev设备的makefile

    obj -m += cdev.o
    KDIR :=/home/....(实际内核源码路径)
    PWD?= (shell pwd) all: make -C (KDIR) M =$(PWD) modules

    clean:
    rm -r *.ko *.mod.o *mod.c *symvers *.order

makefile 代码

相关推荐
Ruiery15 小时前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
欧米欧15 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery15 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
qetfw16 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
逆风的蚂蚁17 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器
沫璃染墨21 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
AI_Lab011 天前
宝塔用了两年,有没有必要换成轻量方案?
linux·运维·服务器
by209991 天前
Linux GDB 调试与 CGDB 使用
linux·运维·服务器·经验分享
星恒随风1 天前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
feng_you_ying_li1 天前
linux之网络层
linux·运维·网络