Linux设备驱动----之一 cdev

2024-04-16 08:32
文章标签 linux 驱动 设备 cdev

本文主要是介绍Linux设备驱动----之一 cdev,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:

linux-2.6.22/include/linux/cdev.h

struct cdev {

  13        struct kobject kobj;

  14        struct module *owner;

  15        const struct file_operations *ops;

  16        struct list_head list;

  17        dev_t dev;

  18        unsigned int count;

  19};

1>kobj是一个嵌入在该结构中的内核对象。它用于该数据结构的一般管理。

2>owner指向提供驱动程序的模块

3>ops是一组文件操作,实现了与硬件通信的具体操作。

4>dev指定了设备号

5>count表示与该设备关联的从设备的数目

6>list用来实现一个链表,其中包含所有表示该设备的设备特殊文件的inode.

2.一个 cdev 一般它有两种定义初始化方式:静态的和动态的

   1>静态内存定义初始化:

   struct cdev my_cdev;

   cdev_init(&my_cdev, &fops);

   my_cdev.owner = THIS_MODULE;

   cdev.ops = &fops;

  2>动态内存定义初始化:

  struct cdev *my_cdev = cdev_alloc();

  my_cdev->ops = &fops;

  my_cdev->owner = THIS_MODULE;

两种使用方式的功能是一样的,只是使用的内存区不一样,一般视实际的数据结构需求而定。

3 .初始化 cdev 后,需要把它添加到系统中去。为此可以调用 cdev_add()函数。传入 cdev结构的指针,起始设备编号,以及设备编号范围。

  int cdev_add(struct cdev *p, dev_t dev, unsigned count)

   count参数表示该设备提供的从设备号的数量

 




这样创建一个字符设备的步骤是:

一: 申请设备号,注册设备

  方法一:静态,register_chrdev_region(dev_t from, unsigned count, const char *name)

  方法二:动态,alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)


二:初始化cdev结构

   1>静态内存定义初始化:

   struct cdev my_cdev;

   cdev_init(&my_cdev, &fops);

   my_cdev.owner = THIS_MODULE;

   cdev.ops = &fops;

  2>动态内存定义初始化:

  struct cdev *my_cdev = cdev_alloc();

  my_cdev->ops = &fops;

  my_cdev->owner = THIS_MODULE;

三:添加注册字符设备  

    int cdev_add(struct cdev *p, dev_t dev, unsigned count)


四:为设备分配内存

   mem_devp = kmalloc(sizeof(struct mem_dev), GFP_KERNEL);



需要手动创建设备节点


eg:

static int memdev_init(void)
{
  int result;
  int i;

  dev_t devno = MKDEV(mem_major, 0);

  /* 静态申请设备号*/
  if (mem_major)
    result = register_chrdev_region(devno, 2, "memdev");
  else  /* 动态分配设备号 */
  {
    result = alloc_chrdev_region(&devno, 0, 2, "memdev");
    mem_major = MAJOR(devno);
  }  
 
  if (result < 0)
    return result;

  /*初始化cdev结构*/
  cdev_init(&cdev, &mem_fops);
  cdev.owner = THIS_MODULE;
  cdev.ops = &mem_fops;
 
  /* 注册字符设备 */
  cdev_add(&cdev, MKDEV(mem_major, 0), MEMDEV_NR_DEVS);
   
  /* 为设备描述结构分配内存*/
  mem_devp = kmalloc(MEMDEV_NR_DEVS * sizeof(struct mem_dev), GFP_KERNEL);
  if (!mem_devp)    /*申请失败*/
  {
    result =  - ENOMEM;
    goto fail_malloc;
  }
  memset(mem_devp, 0, sizeof(struct mem_dev));
 
  /*为设备分配内存*/
  for (i=0; i < MEMDEV_NR_DEVS; i++)
  {
        mem_devp[i].size = MEMDEV_SIZE;
        mem_devp[i].data = kmalloc(MEMDEV_SIZE, GFP_KERNEL);
        memset(mem_devp[i].data, 0, MEMDEV_SIZE);
  }
    
  return 0;

  fail_malloc:
  unregister_chrdev_region(devno, 1);
 
  return result;
}


这篇关于Linux设备驱动----之一 cdev的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908284

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对

什么是 Linux Mint? 适合初学者体验的桌面操作系统

《什么是LinuxMint?适合初学者体验的桌面操作系统》今天带你全面了解LinuxMint,包括它的历史、功能、版本以及独特亮点,话不多说,马上开始吧... linux Mint 是一款基于 Ubuntu 和 Debian 的知名发行版,它的用户体验非常友好,深受广大 Linux 爱好者和日常用户的青睐,

Linux(Centos7)安装Mysql/Redis/MinIO方式

《Linux(Centos7)安装Mysql/Redis/MinIO方式》文章总结:介绍了如何安装MySQL和Redis,以及如何配置它们为开机自启,还详细讲解了如何安装MinIO,包括配置Syste... 目录安装mysql安装Redis安装MinIO总结安装Mysql安装Redis搜索Red

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch