p { margin-bottom: 0.08in; }
ldd 第三章
鉴于书中附带代码是综合性的,虽然很简单,但是对于初学者来说还是有点复杂,
我把作者的例子进行了一些简化,更有利于看清最重要的东西。也有利于一步步的学习,循序渐进。
首先,了解一下涉及到数据结构。
我们简化一下 ldd中的设计,如下,
下面,我简要的介绍一下,例子中的函数的作用:
function
mydev_init_module :
申请设备号 register_chrdev_region or alloc_chrdev_region
分配,初始化设备,并添加设备
分配: 静态或者 cdev_alloc
初始化: cdev_init
添加: cdev_add
mydev_clearup_module :
释放分配的用于存放数据的内存
删除设备 cdev_del
释放“设备结构体”所占内存
释放申请的设备号
mydev_llseek:
修改文件的当前的读写位置 (f_pos值 )
mydev_open :
保存”设备“指针到文件结构体的 private_data域
mydev_release :
open 的逆操作
mydev_read :
将写入的数据按照一定规则读出
mydev_write
讲用户数据保存到某个位置(内存或者硬件设备)
下面是简化后的代码结构
macro
MYDEBUG
ELEMENT_SIZE
struct
dataelem
mydev
variable
mydev0
mydev_major
mydev_minor
element_size
mydev_ops
mydev_init_module
mydev_clearup_module
function
mydev_init_module
mydev_setup_cdev
mydev_clearup_module
mydev_free_mem
mydev_llseek
mydev_open
mydev_release
mydev_read
mydev_write
说明:本例子为了更突出重点,而很简陋,重复打开设备的结果是不可预料的
源码:
操作过程:
# make //生成 mydev0.ko
# insmod mydev0.ko //插入生成的模块
# cat /proc/devices //查看分配的主设备号
...
250 mydev <-----我们的模块
251 hidraw
252 usbmon
...
# mknod /dev/mydev0 c 250 0 //创建设备结点
# echo “” > /var/log/messages //清空记录方便查看
# echo “ I love you Linux” > /dev/mydev0 //向设备中写入数据
#cat /dev/mydev0 //从设备中读出数据
#cat /var/log/messages //查看打印出来的调试信息