【Linux】【驱动】应用层和驱动层传输数据

【Linux】【驱动】应用层和驱动层传输数据

  • 绪论
    • [1.如果我在应用层使用系统0 对设备节点进行打开,关闭,读写等操作会发生什么呢?](#1.如果我在应用层使用系统0 对设备节点进行打开,关闭,读写等操作会发生什么呢?)
  • [2 我们的应用层和内核层是不能直接进行数据传输的](#2 我们的应用层和内核层是不能直接进行数据传输的)
  • [3 驱动部分的代码](#3 驱动部分的代码)
  • [4 应用代码](#4 应用代码)
  • [5 编译以及运行代码](#5 编译以及运行代码)

绪论

Linux一切皆文件!

文件对应的操作有打开,关闭,读写设备节点对应的操作有打开,关闭,读写

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

当我们在应用层 read 设备节点的时候,就会触发我们驱动里面read 这个函数

c 复制代码
ssize t (*read) (struct file *, char  user *, size t, loff t *);

当我们在应用层 write 设备节点的时候,就会触发我们驱动里面 write 这个函数

c 复制代码
ssize t (*write) (struct file *, const char  user *, size t, loff t *);
c 复制代码
unsigned int (*poll) (struct file *, struct poll table struct *);
c 复制代码
long (*unlocked ioctl) (struct file *, unsigned int, unsigned long);
c 复制代码
int (*open) (struct inode *, struct file *);
c 复制代码
int (*release) (struct inode *, struct file *);

2 我们的应用层和内核层是不能直接进行数据传输的

如下两个代码实现了数据的交互

c 复制代码
static inline long copy from user(void *to, const void user * from, unsigned long n)
static inline long copy to user(voiduser *to, const void *from, unsigned long n)

3 驱动部分的代码

c 复制代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>	
#include <linux/uaccess.h>


int misc_open(struct inode *inode, struct file *file)
{
	printk("misc_open\n");

	return 0;
}

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

}

ssize_t misc_read(struct file *file,char __user *ubuf,size_t size,loff_t *loff_t)
{
	char kbuf[512] = "haha";

	if(copy_to_user(ubuf,kbuf,strlen(kbuf))!=0)
	{
		printk("error copying\n");
		return -1;
	}

	return 0;

}

ssize_t misc_write(struct file *file,const char __user *ubuf,size_t size,loff_t *loff_t)
{

	char kbuf[512] = {0};	
	if(copy_from_user(kbuf,ubuf,size)!= 0)
	{
		printk("misc_write error\n");
		return -1;

	}
	printk("kbuf = %s\n",kbuf);
	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
};


//drivers for init
static int misc_init(void)
{
	int ret = 0;
	ret = misc_register(&misc_dev);
	if(ret<0) 
	{
		printk("misc_register is failed\n");
		return -1;
	}
	printk("misc registe is succeed \n");
	return 0;
}


//drivers for exit 
static void misc_exit(void)
{
//
	misc_deregister(&misc_dev);

	printk("misc exit \n");

}

module_init(misc_init);
module_exit(misc_exit);

MODULE_LICENSE("GPL");

4 应用代码

write就是实现了write的功能

read 函数就是实现了read的功能

c 复制代码
#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"


/*
 * @description		: main主程序
 * @param - argc 	: argv数组元素个数
 * @param - argv 	: 具体参数
 * @return 			: 0 成功;其他 失败
 */
int main(int argc, char *argv[])
{
	int fd;
	char buf[64] = "12345";

	//fd = open(argv[1], O_RDONLY);
	fd = open("/dev/hello_misc", O_RDWR);

	if(fd < 0)
	{
		perror("open error");
		return fd;

	}
	//write(fd,buf,sizeof(buf));
	//printf("buf is %s\n",buf);
	write(fd,buf,sizeof(buf));
	close(fd);
	return 0;
}

5 编译以及运行代码

编译app代码

Bash 复制代码
arm-buildroot-linux-gnueabihf-gcc -o miscApp miscApp.c

挂载nfs盘

bash 复制代码
mount -t nfs -o nolock,vers=3 192.168.5.15:/home/book/nfs_rootfs /mnt

移动到mnt目录

bash 复制代码
cd /mnt

删除文件

bash 复制代码
rm -f + chrdevbase.ko

移动代码

bash 复制代码
cp miscApp /home/book/nfs_rootfs/

允许printk输出

bash 复制代码
echo "7 4 1 7"> /proc/sys/kernel/printk

安装驱动

bash 复制代码
insmod chrdevbase.ko

列出驱动

bash 复制代码
lsmod

删除驱动

bash 复制代码
remmod

运行代码

bash 复制代码
./miscApp
相关推荐
黑牛先生16 分钟前
【Linux】动静态库
linux·运维·服务器
vortex517 分钟前
Shell基础:中括号的使用
linux·运维·bash·shell
基哥的奋斗历程26 分钟前
Docker 常用命令
运维·docker·容器
HEX9CF2 小时前
【Docker】快速部署 Nacos 注册中心
运维·docker·容器
从未止步..3 小时前
Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?
java·运维·jenkins
davenian3 小时前
< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)
运维·shell script·baidupcs-go·linux ubuntu
-VE-4 小时前
myshell
linux·c++
喝醉酒的小白4 小时前
几种K8s运维管理平台对比说明
运维·容器·kubernetes
明 庭5 小时前
通过 Docker 部署 pSQL 服务器的教程
服务器·docker·容器
身在江湖的郭大侠6 小时前
Linux内核
linux·服务器