关闭

Linux Char-Driver (字符驱动 摘要)(一)

标签: linux字符驱动
762人阅读 评论(0) 收藏 举报
分类:

#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

Linux 系统运行时,文件系统与驱动的前世今生

    在Linux系统中,一切皆文件.
    所以在Linux中,设备也被作为一种文件来操作.而实现这些操作的,就叫做设备驱动.
    在Linux中,设备被分为三类:
        - 字符设备(如,鼠标,键盘==)
        - 块设备(如硬盘)
        - 网络设备(这里指网络接口,如常见的eth0,wlan0,lo)

    我们都知道,Linux一切皆文件,且,Linux具有两个空间--用户与内核.那么具体到用户态的表现就是,我们Open某个设备后,我们就会得到一个在系统中唯一的文件描述符号fd.我们所有关于设备的操作,都是以fd为依据进行操作.
    那么我们来看一个字符驱动在的调用过程.
        1.当我们在用户态执行到open("/dev/xxx-device",mode,flag)函数时.
        2.文件系统会到系统中找一个与设备文件(例子中的/dev/xxx-device)对应的inode结构体,同时在一个设备表中去查到对应设备号i_rdev的struct cdev 地址赋值给i_cdev.
struct inode{
        dev_t i_rdev; //设备编号
        umode_t i_mode;//设备类型
        struct cdev *i_cdev; //cdev 指向设备的内核的内部驱动结构
        ......
        };
内核中的struct cdev
struct cdev
{
  struct kobject kobj;//内嵌的kobject对象
  struct module *owner;//所属模块
  struct file_operations *ops;//文件操作结构体
  struct list_head list;
  dev_t dev;//设备号,长度为32位,其中高12为主设备号,低20位为此设备号
  unsigned int count;
};
        3.找到了设备文件对应的inode后,文件系统将会建立file结构体.并初始化其中的变量,其中最重要的,也是我们写驱动将会用到的是f_op变量的值,这个就是我们驱动中的 struct file_operations 变量的地址.也就是为了使用这个地址,能够调用到我们在驱动中提供的操作设备的一些基本调用.
 struct file{

  mode_t fmode; //文件模式,如FMODE_READ,FMODE_WRITE

  ......

  loff_t f_pos; //loff_t 是一个64位的数,需要时,须强制转换为32位

  unsigned int f_flags; //文件标志,如:O_NONBLOCK

 struct file_operations *f_op;

 void *private_data; //非常重要,用于存放转换后的设备描述结构指针

 .......

 };
        4.当以上的所有流程走完,那么我们就可以操作设备了.别如read(),write,ioctl()等等

以上就是Linux中,驱动与文件系统的故事,只有了解了这些,我们才能够知道我们为何要用那样的方式,结构,架构等等去写Linux的驱动.

    友情提示:我们在用户态操作设备,而驱动在内核态,是两个不同的地址空间.所以我们在用户态的一系列函数(如open(),read(),write(),ioctl()等等)都会被翻译为内核空间中对应的系统调用去执行.而不是直接执行的操作.想详细了解,可自行搜索关键字:Linux 系统调用

#PS:请尊重原创,不喜勿喷

#PS:要转载请注明出处,本人版权所有.

有问题请留言,看到后我会第一时间回复

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Linux 设备驱动之 DTS 描述的资源

在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 platform_driver 的probe() 里面知道设备的中断号, 内...
  • xy010902100449
  • xy010902100449
  • 2015-07-16 22:27
  • 3185

linux字符设备驱动开发模板及Makefile

linux2.6字符设备驱动开发模板 #include #include #include #include #include //=======================字符设备...
  • wdzxl198
  • wdzxl198
  • 2013-04-18 09:14
  • 4157

图解linux char驱动

图解linux char驱动 在写字符驱动的时候需要使用内核提供的cdev_add()函数来想kobj_map添加自己的cdev结构体. 1.当执行完cdev_add()函数之后.我...
  • shaohuazuo
  • shaohuazuo
  • 2015-01-02 19:35
  • 1444

简单字符设备驱动(driver of simple char device)

1>驱动代码:/* * Copyright (c) 2011 sudo.lee * * This program is free software; you can redistribute ...
  • sudolee
  • sudolee
  • 2011-11-28 22:59
  • 1190

LINUX驱动开发 字符驱动实例

  • 2012-06-30 11:25
  • 316KB
  • 下载

Linux 驱动学习笔记3 -- 字符设备驱动实例(driver+client)

字符设备驱动实例 有了上一节的基础,下面学习一下如何编写一个字符设备驱动,并通过客户端测试,验证字符设备驱动是否创建成功 1、字符设备驱动程序 下面是字符设备驱动源码 bory...
  • fangchongbory
  • fangchongbory
  • 2012-07-10 17:31
  • 1658

【Linux Device Driver】—(1)—Char Drivers——原理

好久没有写过这些东西了,自己也是无聊的很,也不知道这几个月我在干些什么。。。   哦,对了,貌似一直在玩坦克世界,表示很蛋疼。。   好几个月没哟接触过这些东西,毕竟忘记很多,所以决定从新复习...
  • LonlyCorner520
  • LonlyCorner520
  • 2012-08-09 09:37
  • 795

【Linux Device Driver】—(1)—Char Drivers——代码

上一篇文章简单介绍了下几点需要注意的,我今天看了看那本书,发现 register_chrdev() 和 unregister_chrdev() 这两个函数即将要退出时代的舞台。。。。。 但是我发现这...
  • LonlyCorner520
  • LonlyCorner520
  • 2012-08-14 19:34
  • 607

字符驱动移植--bus(平台总线), device, driver

bus#include #include #include char bus_version[128] = "bus version v1";// 如果匹配成功,返回1, 失败返回0 int my...
  • hua_zai_arm
  • hua_zai_arm
  • 2016-06-24 21:00
  • 165

字符驱动移植---(系统总线),device, driver-

led_test.c(参数代码)#include #include #include #include #include #include int main(int argc, char ...
  • hua_zai_arm
  • hua_zai_arm
  • 2016-06-24 20:50
  • 201
    个人资料
    • 访问:59313次
    • 积分:1125
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:6篇
    • 译文:1篇
    • 评论:24条
    最新评论