嵌入式Linux(4):应用层和内核层数据传输

news2024/11/16 17:56:06

文章目录

  • 简介
  • 1、如果在应用层使用系统IO对设备节点进行打开,关闭,读写等操作会发生什么呢?
  • 写个例子
  • 2、假如驱动层的file_operations里面没有实现read之类的操作函数,会发生什么?
  • 3、应用层和内核层室不能直接进行数据传输的

简介

Linux一切皆文件!
文件对应的操作有打开,关闭,读写。
设备节点对应的操作也有打开,关闭,读写。

在这里插入图片描述

1、如果在应用层使用系统IO对设备节点进行打开,关闭,读写等操作会发生什么呢?

文件操作集的描述在:include/linux/fs.h

应用层调用函数对设备节点进行操作驱动层对应的函数
read()ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
write()ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
poll()/select()__poll_t (*poll) (struct file *, struct poll_table_struct *);
ioctl()long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
open()int (*open) (struct inode *, struct file *);
close()int (*release) (struct inode *, struct file *);

写个例子

file_operatiion.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>

int misc_open(struct inode* inode, struct file* file)
{
	printk("hello misc_open\n");
	return 0;
}

int misc_release(struct inode* inode, struct file* file)
{
        printk("misc_release bye\n");
        return 0;
}

ssize_t misc_read(struct file *file, char __user *ubuf, \
                        size_t size, loff_t *loff_t)
{
        printk("misc_read\n");
        return 0;
}

ssize_t misc_write(struct file *file, char __user *ubuf, \
                        size_t size, loff_t *loff_t)
{
        printk("misc_write\n");
        return 0;
}

struct file_operations misc_fops = {
        .owner = THIS_MODULE,
        .open = misc_open,
        .release = misc_release,
        .read = misc_read,
        .write = misc_write
};

struct miscdevice misc_dev = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = "hello_misc",
        .fops = &misc_fops
};


static int misc_init(void)
{
        int ret ;
        ret = misc_register(&misc_dev);
        if(ret < 0)
        {
                printk("misc registe is error\n");
                return -1;
        }
        printk("misc registe is ok\n");
        return 0;
}

static void misc_exit(void)
{
        misc_deregister(&misc_dev);
        printk("Bye Misc\n");
}

module_init(misc_init);
module_exit(misc_exit);

/* 模块声明 */
MODULE_LICENSE("GPL");

Makefile

# 定义内核源码的目录
KERN_DIR ?=/home/liefyuan/Liefyuan/bingpi-v3s/linux-zero-5.2.y
# 定义当前目录
PWD        :=$(shell pwd)
# 要生成的内核模块
obj-m +=file_operation.o

all:
	make -C $(KERN_DIR) M=$(PWD) modules

clean:
	rm -rf *.order *o *.symvers *.mod.c *.mod *.ko

编译模块:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make

复制到开发板上去安装模块:

$ insmod file_operation.ko

测试应用:
app.c

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


int main(int argc, char** argv)
{
    int fd;
    char buf[64] = {0};

    fd = open("/dev/hello_misc", O_RDWR);
    if(fd < 0)
    {
        perror("open error\n");
        return fd;
    }

    //read(fd, buf, sizeof(buf));

    write(fd, buf, sizeof(buf));
    close(fd);
    return 0;
}

编译应用:

arm-linux-gnueabihf-gcc app.c -o app.armelf

复制到开发板上去运行。

./app.armelf

跑完上面的代码后更加深刻理解下面这个图。设备节点就是应用层和内核层的沟通的桥梁。

在这里插入图片描述

2、假如驱动层的file_operations里面没有实现read之类的操作函数,会发生什么?

什么也不会发生,也不会报错。

3、应用层和内核层室不能直接进行数据传输的

函数声明的位置:include/asm-generic/uaccess.h

static inline long copy_from_user(void *to, const void __user *from, unsigned long n);

static inline long copy_to user(void __user *to, const void *from, unsigned long n);

照着上面改一下:
增加头文件:

#include <linux/uaccess.h>
ssize_t misc_read(struct file *file, char __user *ubuf, \
                        size_t size, loff_t *loff_t)
{
        char kbuf[64] = "liefyuan1994";
        if(copy_to_user(ubuf, kbuf, strlen(kbuf)) != 0)
        {
                printk("copy_to_user error!\n");
                return -1;
        }
        printk("misc_read\n");
        return 0;
}

ssize_t misc_write(struct file *file, char __user *ubuf, \
                        size_t size, loff_t *loff_t)
{
        char kbuf[64] = {0};
        if(copy_from_user(kbuf, ubuf, size) != 0)
        {
                printk("copy_from_user error!\n");
                return -1;
        }
        printk("kbuf is :%s\n", kbuf);
        printk("misc_write\n");
        return 0;
}

测试应用:

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


int main(int argc, char** argv)
{
    int fd;
    char buf[64] = "12345";

    fd = open("/dev/hello_misc", O_RDWR);
    if(fd < 0)
    {
        perror("open error\n");
        return fd;
    }

    // read(fd, buf, sizeof(buf));
    // printf("buf is %s\n", buf);

    write(fd, buf, sizeof(buf));
    close(fd);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言面试题--基础语法(27)

文章目录 1.下面这段代码输出什么&#xff1f;2.下面这段代码输出什么&#xff1f;3.下面这段代码输出什么&#xff1f; 1.下面这段代码输出什么&#xff1f; func main() {var a [5]int{1, 2, 3, 4, 5}var r [5]intfor i, v : range a {if i 0 {a[1] 12a[2] 13}r[i] v}f…

ROS学习第五节——话题通信之发布

首先补充一个命令ROS计算图 rosrun rqt_graph rqt_graph 1.原理讲解 话题通信实现模型是比较复杂的&#xff0c;该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (发布者)Listener (订阅者) ROS Master 负责保管 Talker 和 Listener 注册的信息&…

数字孪生(1)

目前接触的客户群体是做大屏展示&#xff0c;闲鱼上5元包邮的那种科技感前端&#xff08;不好意思我买了&#xff09;各路模型大整合 实景GISiOT&#xff0c;如果再来点动画就好&#xff0c;然满屏动起来&#xff0c;火灾烧起来&#xff0c;水面荡漾起来&#xff0c;工程车开起…

关于GeoServer发布的wfs服务的精度问题

本周基于arcgis/core组件&#xff0c;利用arcgis api for js 4.22版本加载GeoServer发布的同一数据源的wms和wfs服务&#xff0c;出现了偏移的问题。 分析&#xff1a;同一数据源不同的访问方式&#xff0c;出现了偏移&#xff0c;这是很严重的问题。初步判断为js api加载方式的…

2023年4月北京/江苏/深圳CDGA/CDGP数据治理专家认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【社区图书馆】Go语言程序设计感想

随着 Go 语言的越来越流行&#xff0c;越来越多的人对其设计和语法进行了评价。以下是一些关于 Go 技术的感想&#xff1a; Go语言的特色&#xff1a; 没有继承多态的面向对象强一致类型interface不需要显式声明(Duck Typing)没有异常处理(Error is value)基于首字母的可访问…

大学计划《数字化转型赋能教育创新发展高峰论坛》成功举办

2023年4月8日&#xff0c;由航天科技控股集团股份有限公司&#xff08;简称“航天科技”&#xff09;主办&#xff0c;CFF上海与上海电子信息职业技术学院承办、智慧树网支持的《数字化转型赋能教育创新发展高峰论坛》线上会议顺利召开。此次会议邀请到了众多教育界专家、教学名…

Linux 文件描述符

Linux 文件描述符 Linux 中一切皆文件&#xff0c;比如 C 源文件、视频文件、Shell脚本、可执行文件等&#xff0c;就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上千个文件&#xff0c;为了表示和区分已经打开的文件&#xff0c;Linux 会给每个…

基于AT89C51单片机的电子万年历系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87708258 源码获取 主要内容&#xff1a; 电子万年历系统以实时时钟芯片DS1302和AT89C52单片机为主要研究对象&#xff0c;着重进行51单片机控制系统的设计研究和如…

天梯赛 L3-025 那就别担心了

原题链接&#xff1a; PTA | 程序设计类实验辅助教学平台 题目描述&#xff1a; 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题&#xff0c;其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”&#xff0c;即从某个命题出发的所有推理路径都会将结…

DHCP的原理和配置

DHCP在一个广播域里动态修改IP地址 背景 DHCP (Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议)由Internet工作任务小组设计开发专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议 使用DHCP的好处 减少管理员的工作量避免输入错误的可能避免IP地…

Java每日一练(20230421)

目录 1. 整数排列 &#x1f31f; 2. 数组排序 &#x1f31f; 3. 单词搜索 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 整数排列 十位数的所有排列…

jmeter的界面介绍

前言 jmeter是一款进行接口自动化&#xff0c;性能测试的开源的工具 界面 jmeter菜单里面有个文件--模板&#xff0c;这个主要是一些请求不知道怎么设置时可以选择预制的一些模板 选择对应的模板点击创建&#xff0c;就可以生成一个对应的记录&#xff0c;我们选择jdbc&…

2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究

作品介绍 一、作品背景 鄱阳湖是中国第一大淡水湖&#xff0c;也是中国第二大湖&#xff0c;它在调节长江水位、涵养水源、改善当地气候等方面起着重大的作用。但近年来受围垦、环境污染等人类活动影响&#xff0c;鄱阳湖湿地退化严重&#xff0c;同时使鄱阳湖的容量减少&…

C语言中static的作用

在 C语言 中&#xff0c;static 通常用来修饰变量和函数。 static 修饰变量 变量按照作用域不同&#xff0c;分为全局变量和局部变量。 当static修饰全局变量时&#xff0c;该变量仍然可以在该文件的全局区域内引用&#xff0c;并且在编译阶段时为该变量分配内存&#xff0c;…

Ubuntu 安装 Samba 服务器

1. Ubuntu 安装 Samba 服务器 确认安装: dpkg -l | grep samba 安装&#xff1a; sudo apt-get install samba samba-common 卸载&#xff1a; sudo apt-get autoremove samba2. Samba 服务器配置 sudo vi /etc/samba/smb.conf在文件最后添加 [Share] commentThis is samba …

Leetcode-day3【215】数组中的第K个最大元素

文章目录 215. 数组中的第K个最大元素题目解题思路解题思路【学习】基于快速排序的选择方法 215. 数组中的第K个最大元素 题目 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#…

osg实现地球并在指定经纬度放置一个飞机模型(非osgEarth方式)

代码如下&#xff1a; #include<osgViewer/Viewer> #include<osgGA/TrackBallManipulator> #include<osg/Shape> #include<osg/ShapeDrawable> #include<osg/Texture2D> #include<osgDB/readFile> #include<osg/MatrixTransform> #…

Linux环境对Nginx开源版源码下载、编译、安装、开机自启

一、准备内容Centos8安装yum源https://blog.csdn.net/xiaochenXIHUA/article/details/127251704?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168197299116800211534092%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%

网络安全与攻防-同源策略

目录 同源策略&#xff08;浏览器控制&#xff09; 定义 思考&#xff1a; 跨域的N种方法 Jsonp 跨域资源共用&#xff08;CORS&#xff09; 预检&#xff08;OPTIONS请求&#xff09; 代理服务&#xff08;优先考虑&#xff09; 实战CORS&#xff08;Fetchnode.js&…