`
hyshucom
  • 浏览: 802831 次
文章分类
社区版块
存档分类
最新评论

Linux内核学习-字符设备驱动学习(一)

 
阅读更多

Linux内核学习-字符驱动学习(一)

现在学习一下Linux的字符设备驱动,参考的样本应该就是ldd3这书大概第3章的内容吧。

下面的所说的字符设备都是基于2.6内核的,

一般的流程都是,呵呵,其实也不算是一般的流程了,只是手动加载字符设备驱动的一种方法吧,

1. 先使用register_chrdev_region或alloc_chrdev_region来注册一个字符设备的设备号,大家都知道Linux是通过设备号来找到相应的驱动程序的,所以你要注册字符设备的时候,需要一个设备号或系统为你指定一个设备号。这两函数的差别就是register_chrdev_region是注册指定设备号的字符设备,这个如果注册设备号已经存在则有可能会失败,而alloc_register_region是系统分配一个未使用的设备号然后再注册

2. 再使用cdev_add函数,把该设备号相应的文件操作file_operation文件操作入口表添加到内核的散列表里面,其中file_operation是需要你在驱动里面实现的。然后使用命令mknod,创建与该字符设备(设备号)对应的设备节点,当有用户程序打开这个设备并对其操作时候,系统会调用kobj_lookup() 函数,根据设备编号就可以找到 cdev 结构变量,从而取出其中的 ops (file_operation)字段,跳到相应的驱动入口去执行。

3. 当需要卸载驱动的时候(手动加载),需要做一些清理工作,cdev_del函数把散列表里面的数据清除,再调用unregister_chrdev_region.

下面简单介绍一下相关的函数:

int register_chrdev_region(dev_t first, unsigned int count,
char *name); //指定设备编号

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,
unsigned int count, char *name); //动态生成设备编号

void unregister_chrdev_region(dev_t first, unsigned int count); //释放设备编号

上面有个count参数,文字意义上是数量的意思,而从函数名中的_region可以看出是注册某一范围的设备号的

把这两个结合起来就是说,注册使用从first[或dev]到(frist+count)[或dev+count],这个编号范围的设备使用该驱动。。。

内核用dev_t类型(<linux/types.h>)来保存设备编号,dev_t是一个32位的数,12位表示主设备号,20为表示次设备号。
在实际使用中,是通过<linux/kdev_t.h>中定义的宏来转换格式。

(dev_t)-->主设备号、次设备号 MAJOR(dev_t dev)
MINOR(dev_t dev)
主设备号、次设备号-->(dev_t) MKDEV(int major,int minor)

如果只是在module_init函数里面做上面的这一步,加载内核模块的时候,会可以cat /proc/devices里面看到你注册的设备和主设备号。

大家应该都知道file_operation函数的,它在<linux/fs.h>文件里面有定义,是一个保存驱动操作函数入口的结构体,我们要做的工作基本都在这里,完成这一步之后,使用cdev_add函数,把设备号与相应的file_operation指针添加到系统cdev_map 散列表里面去,

初始化struct cdev
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
初始化cdev.owner
cdev.owner = THIS_MODULE;

cdev.ops = &fops;
cdev设置完成,通知内核struct cdev的信息(在执行这步之前必须确定你对struct cdev的以上设置已经完成!)
int cdev_add(struct cdev *p, dev_t dev, unsigned count)

这里面的count的意义跟上面register_chrdev_region中的是一样的。
从系统中移除一个字符设备:void cdev_del(struct cdev *p)

完成这一步之后,你已经注册了字符设备,但是你还不能对它进行操作(打开,关闭读,写等),你需要使用mknod命令手动的去生成一个设备号对应的索引节点,这个需要管理员权限的,你的主设备号可以通过cat /proc/devices看到

mknod - make block or character special files
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
option 有用的就是 -m 了
name 自定义
type 有 b 和 c 还有 p
主设备号
次设备号

sudo mknod /dev/char01 c 250 0

最后你可以在你的用户程序里面使用open("/dev/char01", O_RDONLY);去打开这个设备了,

由于创建/dev/*节点的时候,是只有管理员有权限的,所以你的测试程序也需要管理员权限执行。

下面是相应的源文件:

char01.c

Makefile:

测试文件,char01_test.c

参考文章:

http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94290

分享到:
评论

相关推荐

    linux字符设备驱动实例

    本例子是一个linux字符设备驱动的最简单的例子,有详细的说明,适合初次接触者。

    基于S3C2440的嵌入式Linux内核移植及字符设备驱动开发.pdf

    基于S3C2440的嵌入式Linux内核移植及字符设备驱动开发.pdf

    Linux设备驱动程序学习

    ·Linux设备驱动程序学习(6)-高级字符驱动程序操作[(3)设备文件的访问控制] ·Linux设备驱动程序学习(7)-内核的数据类型 ·Linux设备驱动程序学习(9)-与硬件通信 ·Linux设备驱动程序学习(8)-分配内存 ...

    Linux驱动开发:Linux内核模块、字符设备驱动、IO模型、设备树、GPIO子系统、中断子系统.zip

    Linux驱动开发:Linux内核模块、字符设备驱动、IO模型、设备树、GPIO子系统、中断子系统、platform总线驱动、I2C总线驱动、SPI总线驱动 Linux项目是一个开放源代码的操作系统项目,由林纳斯·托瓦兹(Linus Torvalds...

    Linux 驱动学习笔记pdf文档

    ·Linux设备驱动程序学习(6)-高级字符驱动程序操作[(3)设备文件的访问控制] ·Linux设备驱动程序学习(7)-内核的数据类型 ·Linux设备驱动程序学习(9)-与硬件通信 ·Linux设备驱动程序学习(8)-分配内存 ...

    linux内核驱动详解2

    | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd....

    linux字符设备驱动程序学习笔记

    详细介绍了linux字符设备驱动程序,对各个名词做了自己的理解,在学习中的笔记,有错误还请海涵

    linux内核驱动详解1

    | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd....

    Linux简单的字符设备驱动程序

    基于linux2.4内核版本的字符设备驱动,适合作为操作系统课程设计。其中包含了测试文件与makefile文件。

    基于linux2.6内核的字符设备驱动程序设计.pdf

    基于linux2.6内核的字符设备驱动程序设计.pdf

    Linux字符设备驱动(转载)

    概括的说,字符设备驱动主要要做三件事:1、定义一个结构体static struct file_operations变量,其内定义一些设备的打开、关闭、读、写、控制函数;2、在结构体外分别实现结构体中定义的这些函数;3、向内核中注册或...

    linux字符设备驱动

    1)编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I/O控制与释放五个基本操作。 2)编写一个测试程序,测试字符设备驱动程序的正确性。 3)要求在实验报告中列出Linux内核的版本与内核加载的过程

    基于Linux字符设备驱动程序的设计与实现

    Linux 设备驱动程序是为特定的硬件提供给用户程序的 一组标准化接口,它隐藏了设备工作的细节。Linux 系统下 驱动程序是运行在内核态的,是和内核连接在一起的程序。 如果运行在用户态的应用程序想控制硬件设备,...

    国嵌嵌入式LINUX视频教程LINUX内核驱动进阶班共35讲.txt

    linux嵌入式开发 1-1(linux内核简合) 1-2(linux内核源代码) ...6-3(字符设备驱动程序实例分析) 6-4(竞争与互后) 7-1(ioctl设备控制) 7-2(内核等待队列) 7-3(阻塞型字符设备驱动) 7-4(poll设备方法)

    深入Linux设备驱动程序内核机制.pdf

    本文深入探讨了Linux设备驱动程序的内核机制,并提供了一个简单的字符设备驱动程序示例。通过源码示例,详细讲解了驱动程序注册与注销、文件操作函数的实现、设备号分配等关键概念和操作方法。 通过学习本文,您将...

    linux字符设备驱动程序

    “mydriver”的简单字符设备驱动程序,该驱动程序以可加载的模块方式进行编译,这样可以免去重新编译内核的工作。

    linux内核字符设备驱动

    描述了字符设备驱动的执行过程以及原理,以及struct file的执行过程

    Linux设备驱动程序开发基础(PPT)

    Linux设备驱动程序开发简介 Linux设备驱动程序结构 Linux设备驱动程序加载方式 实验:编写一个字符设备驱动程序(LED或蜂鸣器) 分别用静态编译,模块动态加载方法实现加入内核

    LINUX内核经典面试题

    LINUX内核经典面试题 ,20) 如何加载、卸载一个模块? 21) 模块和应用程序分别运行在什么空间? 22) Linux中的浮点运算由应用程序实现还是内核实现? 23) 模块程序能否使用可链接的库函数? 24) TLB中缓存的是什么...

    FL2440 linux2.6.12内核 字符设备驱动

    FL2440 linux2.6.12内核 字符设备驱动 内附详细操作步骤及makefile文件 .ko文件等 与大家分享 希望对大家有帮助 如有错误还请指正

Global site tag (gtag.js) - Google Analytics