Hello,World驱动之旅,用户层简单交互(三)

目录

(一)上篇回顾:上一篇讲到用户层怎么与驱动模块进行交互。Hello,World驱动之旅,对外接口(二)-CSDN博客

(二)通过简单程序与驱动交互

读操作,代码如下:

写操作,代码如下:

主函数如下:

(三)编译源码指令:gcc test.c -o test

(四)执行指令:./test

(五)源代码如下


(一)上篇回顾:上一篇讲到用户层怎么与驱动模块进行交互。Hello,World驱动之旅,对外接口(二)-CSDN博客

1.通过insmod加载驱动

2.通过指令echo指令对驱动文件节点进行写操作

3.通过指令cat对驱动文件节点进行读操作

4.驱动底层记录写入次数,并通过cat读操作反馈出来。

(二)通过简单程序与驱动交互

前文已经通过指令echo、cat与驱动模块进行了交互,接下来我们通过简单的C语言程序与驱动程序进行交互。

读操作,代码如下:

int sys_files_read(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }
    //打开文件
    fd = open(path, O_RDONLY);    
    if(fd > 0){
        //读文件
        ret = read(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        //关闭文件
        close(fd);
        return ret;
    }else{
        return -3;
    }
}

open、read、close为linux系统调用,通过指令“man 2  xxxx”可以查看具体系统调用用法,包括头文件、参数、返回值、错误码等。xxx即为open、read、write等,示例指令如下:

写操作,代码如下:

//sys file write operation
int sys_files_write(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }
    //打开文件
    fd = open(path, O_WRONLY);    
    if(fd > 0){
        //写文件
        ret = write(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        //关闭文件
        close(fd);
        return 0;
    }else{
        return -3;
    }
}

主函数如下:

int main(int argc,char **argv){
    int ret;
    char *buf = (char *)malloc(1024);
    if(NULL == buf){
        printf("not enought memory\n");
        return -1;
    }
    
    ret = sys_files_read(TEST_DRIVER_SYSFILE,buf,1024);
    if(ret > 0){
        printf("%s",buf);
    }else{
        printf("read file error,error code=%d\n",ret);
    }
    ret = sys_files_write(TEST_DRIVER_SYSFILE, "1", 1);
    if(0 != ret){
        printf("write file error,error code=%d\n",ret);
    }else{
        printf("write %s successful\n",TEST_DRIVER_SYSFILE);
    }
    free(buf);
    return 0;
}

其中驱动节点文件"/sys/class/cdevhelloclass/test"对应宏定义TEST_DRIVER_SYSFILE 即为驱动文件所对应的底层节点文件。main函数中,每次对该文件进行一次读写操作。

(三)编译源码指令:gcc test.c -o test

(四)执行指令:./test

貌似结果与预期不符,从code返回-3可知,程序在open的时候就出错了,具体什么原因导致的出错,我们可以通过errno获取,稍微修改下程序,在return -3之前增加如下代码:

printf("%s\n",strerror(errno));

再编译执行一次,效果如下,提示没有相应目录:

是的、由于我虚拟机重启了,此处未加载驱动模块,执行指令sudo insmod hello.ko,再次执行指令如下:

有变化,没有文件或者目录错误解决了,当前提示没有权限,使用ls命令看看具体该文件本身所具备的权限,执行如下指令ls -l /sys/class/cdevhelloclass/test

果然,当前文件的用户属于root,目前只有root用户可以读写(rw-)、其他用户只能读(r--),接下来解决思路有两个:

第一:通过sudo指令执行test程序,

第二:通过chmod指令修改驱动文件权限sudo chmod 666 /sys/class/cdevhelloclass/test

我们可以看到,该文件的权限由之前的rw-r--r--,修改为rw-rw-rw-,再次通过指令./test执行,不加sudo,效果如下,异常已解决,同时我们也可以看出,每执行一次,我们的count都会增加1。

至此介绍完一个简单的与底层驱动交互的test程序,麻雀虽小五脏俱全。接下来我们看看,如何通过java来与我们的驱动进行交互,可以满足后续的Android开发。

(五)源代码如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define TEST_DRIVER_SYSFILE ("/sys/class/cdevhelloclass/test")

int sys_files_read(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }

    fd = open(path, O_RDONLY);    
    if(fd > 0){
        ret = read(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        close(fd);
        return ret;
    }else{
        printf("%s\n",strerror(errno));
        return -3;
    }
}

//sys file write operation
int sys_files_write(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }
    fd = open(path, O_WRONLY);    
    if(fd > 0){
        ret = write(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        close(fd);
        return 0;
    }else{
        printf("%s\n",strerror(errno));
        return -3;
    }
}

int main(int argc,char **argv){
    int ret;
    char *buf = (char *)malloc(1024);
    if(NULL == buf){
        printf("not enought memory\n");
        return -1;
    }
    
    ret = sys_files_read(TEST_DRIVER_SYSFILE,buf,1024);
    if(ret > 0){
        printf("%s",buf);
    }else{
        printf("read file error,error code=%d\n",ret);
    }
    ret = sys_files_write(TEST_DRIVER_SYSFILE, "1", 1);
    if(0 != ret){
        printf("write file error,error code=%d\n",ret);
    }else{
        printf("write %s successful\n",TEST_DRIVER_SYSFILE);
    }
    free(buf);
    return 0;
}

Hello,World驱动之旅,初识驱动模块(一)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Canal解决select count(*)执行慢的问题

前言 count 的常用方式&#xff0c;使用 count(*)来统计数据条数&#xff0c;但是 innodb 没有存储数据总数&#xff0c;所以执行起来就会很慢。 可以使用 expalin sql 来返回预估行数&#xff0c;expalin select count(*)....., 通过预估的方式,统计数据条数。可以使用 redi…

每日5题Day1 - LeetCode 1-5

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] twoSum(int[] nums, int target) {//返回值为Int[]数组&#xff0c;所以先初…

【计算机网络】数据链路层 差错控制 循环冗余码CRC及FCS 习题5

在计算机网络中&#xff0c;关于差错控制&#xff0c;我们主要要比特控制。 比特控制&#xff0c;简单理解&#xff0c;即在传输过程中&#xff0c;0变为1&#xff0c;1变为0。 差错控制主要有两类 自动重传请求ARQ——检错编码 &#xff08;接收方检测出差错&#xff0c;就设…

数字社交的先锋:探索Facebook的未来发展

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook一直处于引领地位&#xff0c;不断探索和创新&#xff0c;塑造着数字社交的未来。本文将深入探讨Facebook作为数字社交的先锋&#xff0c;探索其未来发展…

LabVIEW天然气压缩因子软件设计

LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源&#xff0c;其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐&#xff0c;而且难以满足现场快速响应的需求。因此&#xff0c;开发一款既能保证计算精度又便于…

BUUCTF靶场[MISC]wireshark、被嗅探的流量、神秘龙卷风、另一个世界

[misc]wireshark 考点&#xff1a;流量、追踪流 工具&#xff1a;wireshark 先看题目&#xff0c;管理员密码 将下载的文件用wireshark打开&#xff0c;查找flag 点击追踪tcp流&#xff0c;开始挨个查看flag [misc]被嗅探的流量 考点&#xff1a;流量、追踪流 工具&#xf…

010.理解异步性

异步消息传递是响应式系统的一个关键特性。但到底是什么异步性&#xff0c;为什么它对响应式应用程序如此重要?我们的人生注定在许多异步任务中。你可能没有意识到&#xff0c;但你的日常活动如果它们本质上不是异步的&#xff0c;那就太烦人了。要理解什么是异步&#xff0c;…

批量提取指定目录下的所有文件名

::批量提取指定目录下的所有文件名&#xff1a; echo off chcp 65001 > nul setlocal enabledelayedexpansion set "folder目录路径" for /r "%folder%" %%F in (*) do ( set "filename%%~nxF" echo !filename! ) endlocal pause…

ASIL详解

概念 随着汽车新四化的发展&#xff0c;整车E/E系统的复杂性也不断增加&#xff0c;功能安全正成为一种更主流的要求。汽车安全完整性等级&#xff08;ASIL&#xff09;分解为实现更高水平的诊断覆盖度提供了可靠而稳健的途径&#xff0c;并在开发具有更高ASIL等级的安全关键系…

Edge浏览器自动翻译功能按钮不见了

前言&#xff1a; 平时偶尔会用到Edge的页面翻译功能&#xff0c;使用挺方便。突然发现Edge浏览器的翻译功能不见 了。如下图所示&#xff1a; 解决思路&#xff1a; 1、从网上找各种解决方案也没有解决&#xff0c;其中有一个说到点右上角的三个点 2、点击设置…

专业矢量绘图软件Sketch for mac v100中文激活版

Sketch for Mac 是一款专业的矢量图形设计工具&#xff0c;主要用于 UI/UX 设计、网页设计、图标设计等领域。它的界面简洁、易用&#xff0c;功能强大&#xff0c;可以帮助设计师快速创建高质量的设计作品。 Sketch for Mac 可以轻松地创建矢量图形、图标、网页布局、移动应用…

利用关系感知一致性和虚拟特征补偿解决医学分类中的长尾问题

文章目录 Combat Long-Tails in Medical Classification with Relation-Aware Consistency and Virtual Features Compensation摘要方法实验结果 Combat Long-Tails in Medical Classification with Relation-Aware Consistency and Virtual Features Compensation 摘要 由于…

SpringBoot接收参数的19种方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583

业务系统加固和安全设备加固

业务系统加固 业务系统包含哪些系统? 业务系统漏洞面临的风险 1web风险 2漏洞扫描&#xff0c;端口扫描 3系统漏洞 4逻辑漏洞 5 信息泄露 6拒绝服务 7口令爆破 加固方式&#xff1a; 在风险加上修复 1web漏洞&#xff1a; 包括csrf,xss&#xff0c;口令破解等等 修…

仿C#或Java基础类型自定义

class Int{ private:int _value 0; public:operator int() const{ // 隐式转换return _value;}// 显式转换explicit operator int*() const { return nullptr; }operator(const int page){_value page;}operator float() const{return static_cast<float>(_value);}ope…

如何利用AI生成答辩PPT?笔灵AI答辩PPT,智能识别关键点

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

Java后端的字符串相等、集合非空判定

一.字符串相等判定 使用工具类的判定 使用原始方法 在调用equals()之前显式地检查对象是否为null&#xff1a; 将常量字符串放在前面调用equals()&#xff0c;这样即使roleCode为null也不会抛出NullPointerException&#xff1a; 二.集合非空判定 使用工具类 原始&#xff0…

Python-VBA函数之旅-vars函数

目录 一、vars函数的常见应用场景 二、vars函数使用注意事项 三、如何用好vars函数&#xff1f; 1、vars函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、vars函数…

数据结构--AVL树

一、什么是AVL树 1、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在…

YOLOv5独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv5结合:替代YOLOv5的backbone 收录 YOL…