转:1.1 cdev_init cdev_alloc 使用说明
- /fs/char_dev.c 2.6.35
- 550 void cdev_init(struct cdev *cdev, const struct file_operations *fops)
- 551 {
- 552 memset(cdev, 0, sizeof *cdev);
- 553 INIT_LIST_HEAD(&cdev->list); //初始化链表
- 554 kobject_init(&cdev->kobj, &ktype_cdev_default);//初始化 kobject 对象
- 555 cdev->ops = fops; //将传入的fops 传递给 cdev结构体
- 556 }
- /fs/char_dev.c 2.6.35
- 532 struct cdev *cdev_alloc(void)
- 533 {
- 534 struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);
- 535 if (p) {
- 536 INIT_LIST_HEAD(&p->list); //操作与 cdev_init中的部分是一致的
- 537 kobject_init(&p->kobj, &ktype_cdev_dynamic);
- 538 }
- 539 return p;
- 540 }
- src/linux/drivrs/char/raw.c
- static struct cdev raw_cdev;//分配结构体类型
- static const struct file_operations raw_fops={
- .read = do_siync_read,
- .write = ...
- };
- static int __init raw_init(void)
- {
- ...
- cdev_init(&raw_cdev,&raw_fops);
- cdev_add();
- ...
- }
- src/drivers/char/snsc.c
- struct sysctl_data_s{
- struct cdev scd_cdev;
- nasid_t scd_nasid;
- };
- static const struct file_operations scdrev_fops={
- .read=scdrv_read,
- ...
- };
- static int __init scrdv_init(void)
- {
- ...
- struct sysctl_data_s *scd;//申请指针
- ...
- scd=kzalloc(sizeof(struct sysctl_data_s),GFP_KERKEL);
- ...
- cdev_init(&scd->scd_cdev,&scdrv_fops);
- cdev_add();
- }
转:1.1 cdev_init cdev_alloc 使用说明的更多相关文章
- 【整理】--【字符设备】cdev_init()/cdev_alloc(),cdev_add(),cdev_del()
(1) 内核中每个字符设备都对应一个 cdev结构的变量,下面是它的定义: linux-2.6.22/include/linux/cdev.h struct cdev { struct kobject ...
- cdev_alloc与cdev_init区别
struct cdev *cdev_alloc(void) { struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL); if (p) { ...
- cdev_init函数
linux-2.6.22/include/linux/cdev.hstruct cdev { struct kobject kobj; // 每个 cdev 都是一个 kobje ...
- 转:Linux 内核中的 cdev_alloc和cdev_add
内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev {struct kobject kobj; ...
- linux内核cdev_init系列函数(字符设备的注册)
内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义: linux-2.6.22/include/linux/cdev.h struct cdev { struct kobject ...
- cdev_init和register_chrdev区别
--- 01:include/linux/fs.h static inline int register_chrdev(unsigned int major, const char *name, co ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
随机推荐
- HDU_1071——积分求面积,抛物线顶点公式
Problem Description Ignatius bought a land last week, but he didn't know the area of the land becaus ...
- WebMagic开源垂直爬虫介绍
WebMagic项目代码分为核心和扩展两部分.核心部分(webmagic-core)是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.WebMagic的架构设计参照了Scrap ...
- PHPExcell单元格中某些时间格式的内容不能正确获得的处理办法
今天在写导入功能的时候某个时间格式的单元格内容不能正确获得,得出的是一串非时间戳的数字. 此时可以使用PHPExcell中自带的方法进行处理:PHPExcel_Shared_Date::ExcelTo ...
- Demon_接金币(三个掉落物品预设体,一接物体的工具)
接物体的工具 using UnityEngine; using System.Collections; public class Tool : MonoBehaviour { float hor; V ...
- Spark RDD API具体解释(一) Map和Reduce
本文由cmd markdown编辑.原始链接:https://www.zybuluo.com/jewes/note/35032 RDD是什么? RDD是Spark中的抽象数据结构类型,不论什么数据在S ...
- 怎样绕过oracle listener 监听的password设置
怎样绕过oracle 监听的password设置: 1.找到监听进程pid ,并将它kill 掉 ps -ef|grep tns [oracle@lixora admin]$ ps -ef|gr ...
- Java编程 的动态性,第 2部分: 引入反射--转载
在“ Java编程的动态性,第1部分,”我为您介绍了Java编程类和类装入.该篇文章介绍了一些Java二进制类格式的相关信息.这个月我将阐述使用Java反射API来在运行时接入和使用一些相同信息的基础 ...
- java byte数组与int,long,short,byte转换
public class DataTypeChangeHelper { /** * 将一个单字节的byte转换成32位的int * * @param b * byte * @return conver ...
- 为什么不使用frame框架的原因
框架的优点 重载页面时不需要重载整个页面,只需要重载页面中的一个框架页(减少了数据的传输,增加了网页下载速度) 方便制作导航栏 框架的缺点 会产生很多页面,不容易管理 不容易打印 浏览器的后退按钮无效 ...
- 如何使用css、布局横向导航栏
使用css布局横向导航栏,css应用给网页样式的方式,就相当于,给人怎么去穿上衣服,不同的衣服有不同的穿法,这里我们使用的是内联式.在这里 我们可以适当的把值调的大一点,这样我们就可以很容易的对比. ...