【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
相关推荐
码农101号32 分钟前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
powerfulzyh1 小时前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩1 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos
是小满满满满吗1 小时前
传输层:udp与tcp协议
linux·服务器·网络
爱学习的小道长1 小时前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
EelBarb1 小时前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu
Xam_d_LM1 小时前
【Latex】Windows/Ubuntu 绘制 eps 矢量图通用方法(drawio),支持插入 Latex 数学公式
linux·ubuntu·科研·矢量图·drawio
402 Payment Required1 小时前
serv00 ssh登录保活脚本-邮件通知版
运维·chrome·ssh
小柏ぁ2 小时前
calico/node is not ready: BIRD is not ready: BGP not established with xxx
运维·docker·kubernetes
Mintimate2 小时前
云服务器 Linux 手动 DD 安装第三方 Linux 发行版:原理与实战
linux·运维·服务器