linux设备驱动程序-第三章(简单scull)学习总结

本文是关于《Linux设备驱动程序》第三章学习的总结,通过Unbuntu12.0和2.6.35.3内核进行scull驱动的实践。详细介绍了scull驱动的开发环境、源代码、编译步骤以及模块的加载、测试和读写功能验证过程,旨在通过实践加深对Linux设备驱动的理解。
摘要由CSDN通过智能技术生成

一、前言
花了一整天时间整理下《linux设备驱动程序》第三章的例程和总结,还是要与实践相结合,才能学习到知识。
二、实例
开发环境介绍:使用Unbuntu12.0,内核使用2.6.35.3.
以下是所需的文件:
|scull.c|驱动主要实现方式|
|scull.h|定义结构体和函数|
|Makefile|编译模块 |
|scull_load.sh|加载模块脚本|
|scull_unload.sh|卸载模块脚本|
下面将列出所有源代码
1、scull.c

//#include <linux/config.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
#include <linux/fcntl.h>
#include <linux/seq_file.h>
#include <linux/cdev.h>

#include <asm/system.h>
#include <asm/uaccess.h>

#include "scull.h"

int scull_major = SCULL_MAJOR;
int scull_minor = 0;
int scull_nr_devs = SCULL_NR_DEVS;
int scull_quantum = SCULL_QUANTUM;
int scull_qset = SCULL_QSET;

module_param(scull_major,int,S_IRUGO);
module_param(scull_minor,int,S_IRUGO);
module_param(scull_nr_devs,int,S_IRUGO);

struct scull_dev *scull_devices;

/*empty out the scull device:must be called with the device semaphore held*/

/*scull_trim负责释放整个数据区,并且在文件以写入方式打开时由scull_open调用,它简单遍历链表,并且使用能找到的原子量*/
int scull_trim(struct scull_dev *dev)
{
    struct scull_qset *next,*dptr;
    int qset = dev->qset;
    int i;

    for(dptr=dev->data;dptr;dptr=next){
        if(dptr->data){
            for(i=0;i<qset;i++)
                kfree(dptr->data[i]);
            kfree(dptr->data);
            dptr->data = NULL;
        }
        next=dptr->next;
        kfree(dptr);
    }
    dev->size = 0;
    dev->quantum = scull_quantum;
    dev->qset = scull_qset;
    dev->data = NULL;
    return 0;
}

/*若设备以读写方式打开,它的长度截零,未锁定信号量*/
int scull_open(struct inode *inode,struct file *filep)
{
    struct scull_dev *dev;
    dev = container_of(inode->i_cdev,struct scull_dev,cdev);
    filep->private_data = dev;
    if((filep->f_flags & O_ACCMODE) == O_WRONLY){
     /*if(down_interruptible(&dev->sem))
      * return -ERESTARTSYS;
      * */
     scull_trim(dev);
     /*up(&dev->sem);*/
    }
    return 0;
}

int scull_release(struct inode *inode,struct file *filep)
{
    return 0;
}

struct scull_qset *scull_follow(struct scull_dev *dev,int n)
{
    struct scull_qset *qs = dev->data;
    if(!qs){
        qs = dev->data = kmalloc(sizeof(struct scull_qset),GFP_KERNEL);
        if(qs == N
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值