字符设备驱动
2.4内核
static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)
2.6内核
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) //将主设备号和次设备号转换成dev_t类型
int register_chrdev_region(dev_t from, unsigned count, const char *name) //注册设备号
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
void unregister_chrdev_region(dev_t from, unsigned count)
struct cdev *cdev_alloc(void)
void cdev_init(struct cdev *cdev, const struct file_operations *fops) //初始化
int cdev_add(struct cdev *p, dev_t dev, unsigned count) //添加到内核
void cdev_del(struct cdev *p) //删除
手动创建设备节点
# cat /proc/devices //查看主设备号
# mknod /dev/设备名 c|b(c是字符设备,b是块设备) 主设备号 次设备号 //创建
# rm /dev/char //删除
借助class创建设备节点
从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代
#define class_create(owner, name)
void class_destroy(struct class *cls)
struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...)
void device_destroy(struct class *class, dev_t devt)
创建多个设备
struct cdev *cdev;
cdev = kzalloc(sizeof(struct cdev) * COUNT, GFP_KERNEL);
for(i = 0; i < COUNT; i++)
{
cdev_init(&cdev[i], &fops);
cdev_add(&cdev[i], dev+i, 1);
}
for(i = 0; i < COUNT; i++)
{
cdev_del(&cdev[i]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!