点击上方蓝字【囧囧妹】一起学习,一起成长!
一、开篇
二、构思

我们的构思大概是这样的,后面也可能会大幅度来调整,我们创建一个全局的设备类,该设备类下创建256个字符设备,每个字符设备我们绑定一个channel,channel下面可以放n个消息元素。
我们通过open来打开一个channel,read、write分别进行消息的读写,close关闭这个channel,poll用来让进程或者线程来监听消息的到达。至于ioctl我们是想调整channel内的消息优先级。
大致的一个思路就是这样子,可能在后面实现的过程中会有调整。
/** @brief msg_init* 模块初始化函数* @param* @param* @return 0-成功;其它错误码* @discri* @note*/static int __init msg_init(void){u32 ret = 0;//申请一个全局chanpcalloc(get_globalchan(chan), sizeof(chan_st), chan_st);//申请一个字符设备ret = alloc_chrdev_region(&get_globalchan(chan)->devno, 0, CHANNEL_MAX, CHANNEL_NAME);if(ret != 0){ pfree(get_globalchan(chan)); get_globalchan(chan) = nil; return ret; } //释放pchando{//初始化cdev_init(&(get_globalchan(chan)->cdev), &chan_fops);//添加到内核ret = cdev_add(&(get_globalchan(chan)->cdev), get_globalchan(chan)->devno, CHANNEL_MAX);if(ret < 0){ cdev_del(&(get_globalchan(chan)->cdev)); break; }get_globalchan(chan)->dev_class = class_create(THIS_MODULE, CHANNEL_NAME);if(IS_ERR(get_globalchan(chan)->dev_class)){kernel_print(KERN_ERR "Unable create sysfs class for demo\n");ret = PTR_ERR(get_globalchan(chan)->dev_class);break;}//将所有字符设备创建出来chan_create();return 0;}while(0);unregister_chrdev_region(get_globalchan(chan)->devno, CHANNEL_MAX);pfree(get_globalchan(chan));get_globalchan(chan) = nil;return -1;}
/** @brief chan_create* 创建字符设备* @param* @param* @return 0-成功;其它错误码* @discri* @note*/static int chan_create(void){u32 i = 0;//分配所有通道get_globalchan(chan)->chan_count = CHANNEL_MAX;pcalloc(get_globalchan(chan)->chan_item, \get_globalchan(chan)->chan_count * sizeof(chan_item_st), \chan_item_st);for_zero_travel(i, CHANNEL_MAX){//创建设备节点get_globalchan(chan)->chan_item[i].devno = MKDEV(MAJOR(get_globalchan(chan)->devno), i);get_globalchan(chan)->chan_item[i].minor = i;device_create(get_globalchan(chan)->dev_class, nil, \get_globalchan(chan)->chan_item[i].devno, \nil, "%s_%d", CHANNEL_NAME, i);}return 0;}


文章转载自囧囧妹,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




