首先 :
1.
创建设备
//分配cdev结构体
if (globalmem_major)
//手动分配
ret = register_chrdev_region(devno, 1, "globalmem");
else {
//自动分配
ret = alloc_chrdev_region(&devno, 0, 1, "globalmem");
globalmem_major = MAJOR(devno);
}
globalmem 提供给上层使用 。
2 。
创建内核设备
struct globalmem_dev {
struct cdev cdev;
unsigned char mem[GLOBALMEM_SIZE];
struct class *lkm_memory_class;
};
globalmem_devp = kzalloc(sizeof(struct globalmem_dev), GFP_KERNEL);
int err, devno = MKDEV(globalmem_major, index);
//对cdev结构体设置file_operations结构体
cdev_init(&dev->cdev, &globalmem_fops);
dev->cdev.owner = THIS_MODULE;
//将cdev结构体注册入系统,系统能够识别调用当前cdev
err = cdev_add(&dev->cdev, devno, 1);
if (err)
printk(KERN_NOTICE "Error %d adding globalmem%d", err, index);
//实现创建文件系统节点
dev->lkm_memory_class = class_create(THIS_MODULE, "globalmem");
if (IS_ERR(dev->lkm_memory_class))
return PTR_ERR(dev->lkm_memory_class);
device_create(dev->lkm_memory_class, NULL,MKDEV(globalmem_major,0),NULL,"globalmem");
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
} __randomize_layout;