当前位置: 首页 > news >正文

全国网站建设有实力杭州百度人工优化

全国网站建设有实力,杭州百度人工优化,dw做网站怎么写弹出客服邮箱,WordPress留言提取1 字符设备驱动框架 1.1字符设备 定义:只能以一个字节一个字节的方式读写的设备,不能随机的读取设备中中的某一段数据,读取数据需要按照先后顺序。(字符设备是面向字节流的) 常见的字…

1 字符设备驱动框架
        1.1字符设备
            定义:只能以一个字节一个字节的方式读写的设备,不能随机的读取设备中中的某一段数据,读取数据需要按照先后顺序。(字符设备是面向字节流的)
            常见的字符设备:鼠标 键盘 串口 控制台 
            块设备:可以从设备的任意位置读取一定长度数据的设备。
            常见的块设备:硬盘 磁盘 光盘 U盘 SD卡 tf卡。。
        1.2字符设备驱动框架
            init流程:--》HelloModule
                {
                    1 申请设备号(静态申请 动态申请)
                    2 创建一个字符设备
                    3 初始化字符设备
                    4 将设备号和字符设备关联起来
                }
            exit流程:--》HelloExit
                {
                    1 删除字符设备
                    2 删除设备号   
                }
        
        买车:
            1 申请车牌号(静态申请 动态申请) 陕U.88888
            2 买车
            3 将车牌号和车关联起来
        卖车:
            1 卖车
            2 注销车牌号
        
        1.2.1设备号
            定义:设备号是设备在内核中的身份和标识,是内核区分不同设备的唯一信息,设备号是由主设备号和次设备号构成,主设备号表示一类设备,次设备号表示该类设备中的某一个设备。
            设备号:是一个32bit的无符号整数,高12bit是主设备号,低20bit是次设备号。
            《linux/kdev_t.h》
            #define MINORBITS    20
            #define MINORMASK    ((1U << MINORBITS) - 1)
            #define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))
            #define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))
            #define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))
        1.2.2申请设备号
            申请设备号有两种方式:静态申请 动态申请
            静态申请设备号:
            int register_chrdev_region(dev_t from, unsigned count, const char *name)
                    作用:静态申请设备号
                    from:设备号(由主次设备号构成)
                    count:子设备个数
                    *name:设备名称
                    返回值:0 成功 非0 失败

            void unregister_chrdev_region(dev_t from, unsigned count)
                    作用:从内核中移除设备号
                    from:设备号(由主次设备号构成)
                    count:子设备个数
            动态申请设备号:
            int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
            const char *name)
                作用:动态申请设备号
                *dev:指向设备号的指针
                baseminor:子设备的第一个编号
                count:子设备个数
                *name:设备名称
                返回值:0 成功 非0 失败
        1.2.3创建字符设备
            struct cdev *cdev_alloc(void)
                作用:创建一块用于存放字符设备的空间
                返回值:是指向创建成功的字符设备的指针
                在Linux内核中用struct cdev来描述一个字符设备
        struct cdev {
            struct kobject kobj;--》内嵌的内核对象
            struct module *owner;--》该字符设备所在的内核模块的对象指针
            const struct file_operations *ops;--》指向操作字符设备的方法集
            struct list_head list;--》用来将已向内核注册的所有字符设备形成链表
            dev_t dev;--》设备号(由主设备号和次设备号构成)
            unsigned int count;--》隶属于同一个主设备号的次设备个数
            };
            void cdev_del(struct cdev *p)
                作用:删除字符设备
                *p:指向字符设备的指针
        1.2.4初始化字符设备--》绑定驱动方法
        void cdev_init(struct cdev *cdev, const struct file_operations *fops)
                作用:初始化字符设备
                *cdev:指向字符设备的指针
                *fops:指向操作字符设备的函数集的指针
        1.2.5将字符设备和设备号关联
            int cdev_add(struct cdev *p, dev_t dev, unsigned count)
            作用:将字符设备和设备号关联,并将字符设备添加到内核中
            *p:指向字符设备的指针
            dev:设备号
            count:子设备的个数
            返回值:成功为0   失败非0

        测试步骤:
            1 sudo insmod hello.ko
            2 dmesg |tail -->250 0
            3 cat /proc/devices-->查看设备号   250 0
            4 sudo mknod /dev/haha0 c 250 0
            5 ls -l /dev/haha*--->查看创建字符设备文件
            6 sudo ./test-->open hahao ok!
            7 dmesg |tail-->helloopen/helloClose
            8 sudo rmmod hello.ko
            9 sudo rm /dev/haha0

        区分字符设备驱动框架中使用的三个结构体:
            struct file:代表内核中一个打开的文件。系统中每个打开的文件在内核中都有一个关联的struct file。
            struct inode:用来记录文件在物理上的信息。它和打开文件struct file结构不同,一个文件可以对应多个struct file,但是只有一个struct inode.
            struct file_operations:是内核给用户提供的驱动接口函数集,用户可以定义函数集中的任何驱动方法。(对于不支持的一般不写)  

            字符设备文件--》250 0<--字符设备(helloopen/helloclose)
            mice----------->鼠标
            sudo cat mice
                
     2 实现用户空间和内核空间的数据拷贝
        用户代码对字符设备的任何操作,最终都要落实到设备对应的底层操作函数上
        内核空间--》用户空间     read-->HelloRead
        用户空间--》内核空间     write--》HelloWrite

        应用层 :fd=open("/dev/haha0")
                   read(fd,)
                    close(fd)
       驱动层:
            增加HelloRead
            ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        char g_buf[]="hellotest----";
        ssize_t HelloRead(struct file *pFile,char __user *buf,size_t count,loff_t *p)
            {
                copy_to_user(buf,g_buf,count);
            }

            unsigned long copy_to_user(void __user *to, const void *from, 
                                        unsigned long n)
                    作用:从内核空间向用户空间拷贝数据
                *to:用户空间指针
                *from:内核空间指针(数据源)
                n:拷贝的字节数

            copy_from_user
       
      测试步骤:
            1 sudo insmod hello.ko
            2 dmesg |tail
            3 sudo mknod /dev/haha0 c 250 0
            4 ls -l /dev/hah*
            5 sudo ./test-->查看是否读到数据?
            6 sudo rmmod hello
            7 sudo rm /dev/haha0

http://www.dt0577.cn/news/19930.html

相关文章:

  • 微信微网站开发网页代码
  • 做办公设备网站市场监督管理局官网入口
  • 如何做网站seo电商软文范例300字
  • 做视频网站 买带宽谷歌官网入口手机版
  • 如何运营好一个网站网络怎么推广自己的产品
  • 做网站 前台和后台制作一个网站需要多少费用
  • 衡阳高端网站建设网络营销品牌
  • 网站建设趋势seo常用工具网站
  • 注册公司需要多久的时间seo是什么的缩写
  • 安丘做网站的公司app推广引流方法
  • 网站开发建设流程晚上偷偷看b站软件推荐
  • 入侵织梦网站营销策划与运营公司
  • 开一间网站建设有限公司优化建站
  • 株洲做网站渠道电话win10最强优化软件
  • 国内哪个网站做水产比较大百度空间登录
  • 营销型网站模板中小企业网络营销现状
  • 做类似电影天堂的网站违法吗广州百度seo排名优化
  • 型云网站建设热门国际新闻
  • 网站后台数据库管理百度搜索指数和资讯指数
  • 网站开发设计内容白度指数
  • 丽水做网站的公司seo推广教学
  • 全国做网站的大公司有哪些校园推广
  • 什么网站可以找人做软件下载网络平台怎么创建需要多少钱
  • 全国各地疫情最新情况石家庄关键词优化软件
  • 做钓鱼网站原理百度渠道开户哪里找
  • 北京网站模板做一个官网要多少钱
  • 用层还是表格做网站快阿里云免费建站
  • 电子商务网站建设规划实践成果源码网
  • 做网站能用假图片吗windows11优化大师
  • a4网站建设杭州关键词优化平台