【Linux】【驅動】應用層和驅動層傳輸數據
- 緒論
- 1.如果我在應用層使用系統0 對設備節點進行打開,關閉,讀寫等操作會發生什么呢?
- 2 我們的應用層和內核層是不能直接進行數據傳輸的
- 3 驅動部分的代碼
- 4 應用代碼
- 5 編譯以及運行代碼
緒論
Linux一切皆文件!
文件對應的操作有打開,關閉,讀寫設備節點對應的操作有打開,關閉,讀寫
1.如果我在應用層使用系統0 對設備節點進行打開,關閉,讀寫等操作會發生什么呢?
當我們在應用層 read 設備節點的時候,就會觸發我們驅動里面read 這個函數
ssize t (*read) (struct file *, char user *, size t, loff t *);
當我們在應用層 write 設備節點的時候,就會觸發我們驅動里面 write 這個函數
ssize t (*write) (struct file *, const char user *, size t, loff t *);
unsigned int (*poll) (struct file *, struct poll table struct *);
long (*unlocked ioctl) (struct file *, unsigned int, unsigned long);
int (*open) (struct inode *, struct file *);
int (*release) (struct inode *, struct file *);
2 我們的應用層和內核層是不能直接進行數據傳輸的
如下兩個代碼實現了數據的交互
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 驅動部分的代碼
#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的功能
#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代碼
arm-buildroot-linux-gnueabihf-gcc -o miscApp miscApp.c
掛載nfs盤
mount -t nfs -o nolock,vers=3 192.168.5.15:/home/book/nfs_rootfs /mnt
移動到mnt目錄
cd /mnt
刪除文件
rm -f + chrdevbase.ko
移動代碼
cp miscApp /home/book/nfs_rootfs/
允許printk輸出
echo "7 4 1 7"> /proc/sys/kernel/printk
安裝驅動
insmod chrdevbase.ko
列出驅動
lsmod
刪除驅動
remmod
運行代碼
./miscApp