当前位置:  技术问答>linux和unix

问下关于put_user问题

    来源: 互联网  发布时间:2016-09-25

    本文导语:  我想从GPIO寄存器读数据到用户空间,在驱动中用了put_user 问下用户态怎样调用这个,还有我想把读出的数据先放到内核的buf中然后再传到用户态,怎样做 谁有简单的事例程序帮忙写下 | 早就...

我想从GPIO寄存器读数据到用户空间,在驱动中用了put_user
问下用户态怎样调用这个,还有我想把读出的数据先放到内核的buf中然后再传到用户态,怎样做
谁有简单的事例程序帮忙写下

|
早就知道你这100分不好拿
不管是put_user ,还包括IOCTL 的头文件的写法,而一般涉及到ioctl的问题我都不太想答,细节量还是蛮大的,需要几百字才能说清,网上没好资料,我也是从《Linux设备驱动开发技术及应用》这本书上学到的,其他的书几乎就是一笔带过

int at_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
看得出来是一个只需要读取返回值的函数,这个命令需要自己定义头文件,且驱动和应用程序都要包含这个头文件
假设这个命令为第一个,所以基数为0,参数为long型
所以头文件 test_ioctl.h 写为:

#ifndef _TEST_IOCTL__
#define _TEST_IOCTL__ 1

#define IOCTLTEST_MAGIC 'x'

#define IOCTLTEST_AT  _IOR(IOCTLTEST_MAGIC,0,long)

#endif


在看你的问题:比如put_user(val,(long *)arg);这个(long *)arg是不是要在内核态定义一个long型的指针或数组,还有在应用层&i是什么?应该在应用层怎样来对应驱动层的程序?
--------------------------------------------------------------
这个arg就是用户传递的参数i :ioctl(fd,IOCTLTEST_AT,&i); 
你要在用户程序里定义 long i;

通过这个cmd - IOCTLTEST_AT ,内核和应用程序就对上了嘛

|
小伙, 从你你能看到的 /dev/***  设备名称说起
user 部分, 就是你的应用程序调用, FILE * : open read write ...
Kernel部分, 系统调用层, 这个是系统的事情了: vfs, vfs_read ...
Kernel部分, Driver 层, 如果你写驱动, 这个又是你的事情了: 对应的 ***_open(struct inode *inode, struct file *file) write
 ..

当你在read 的时候, 一直调用到***_open ,***_read , 如果没数据可能就阻塞或者直接返回, 取决于FOPEN 的属性, ***_read 的时候, 数据来源就是 put_user 了. 

一个很典型的例子: linuxdriverscharcs5535_gpio.c   cs5535_gpio_read  就完全这么做的

如果你能坚持从vfs -> inode -> cdev 一路看下来, 那么你会开阔很多了.

|
驱动:
/*
 * char-read.c
 *
 * Character driver with read operation
 *
 * Copyright (C) 2005 Farsight
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */


#include 
#include 
#include 
#include 
#include 
#include 

MODULE_LICENSE ("GPL");

int hello_major = 253;
int hello_minor = 0;
int number_of_devices = 1;
char data[50]="foobar not equal to barfoo";

struct cdev cdev;
dev_t dev = 0;


static int hello_open (struct inode *inode, struct file *file)
{
  printk (KERN_INFO "Hey! device openedn");
  return 0;
}

static int hello_release (struct inode *inode, struct file *file)
{
  printk (KERN_INFO "Hmmm... device closedn");
  return 0;
}
ssize_t hello_read (struct file *filp, char *buff, size_t count, loff_t *offp)
{
  ssize_t result = 0;
/*这里的buff仅是演示如把内核空间的变量传递给用户空间*/
  if (copy_to_user (buff, data, sizeof(data)-1)) 
    result = -EFAULT;
  else 
    printk (KERN_INFO "wrote %d bytesn", count);
   return result;
}

ssize_t hello_write (struct file *filp, const char  *buf, size_t count, loff_t *f_pos)
{
  ssize_t ret = 0;
  printk (KERN_INFO "Writing %d bytesn", count);
  if (count>127) return -ENOMEM;
  if (count

    
 
 

您可能感兴趣的文章:

  • 求救啊 高分求救 UNIX下关于进程通讯的问题~
  • redhat下关于在本机与板子连接的问题
  • HP unix 下关于显示出错信息的问题。解决就给分!
  • Linux下关于用脚本启动进程的问题
  • 关于linux下关闭socket的问题
  • 请教下关于嵌入式linux电源管理的问题。
  • Linux下关于路由表操作的问题
  • 请教各位:Linux下关于路由设置的一个问题!
  • Linux下关于使用3G无线网卡的问题
  • 请教下关于alsa-lib的问题。
  • solaris9 下关于gunzip和cpio的问题(在线等)
  • 在Redhat8.0下关于nv显卡驱动的安装问题
  • linux下关于char *p字符指针的问题
  • 求教: linux下关于捕获网络数据包的问题
  • linux下关于进程通信的问题,大家一定要看啊!
  • 问下关于用虚拟机LINUX与WIN7ping网的问题。。高手帮我下谢谢了
  • 问几个linux下关于动态库的问题
  • 问下关于定时器的问题
  • 问下关于elf文件的问题
  • 高分求教redhat7.3下关于mysql的问题!(急)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在linux8.0下关闭防火墙
  • 请推荐一下linux下关于 汇编编程的好书?
  • Linux下关于shell程序的源代码如何获取?50分求救!
  • Linux下关于fork()的函数
  • 请问: Linux下关机的函数调用
  • linux下关于IP,DNS,GATEWAY的配置文件在哪里?谢谢!
  • 各位大侠,求助Linux下关机
  • 请我下关于安防行业中网络摄像机的市场
  • 问下关于进程通讯
  • linux和uclinux下关于select标准输入
  • 麻烦推荐下关于linux下的网络帮助API相关书籍
  • 请教下关于root密码忘记了怎么修改(除了去现场单用户修改)
  • 请问如何在MS-DOS下关闭本机上多余的端口?
  • 多线程编程下关于gdb程序调试的一个疑问。
  • 请问在linux7.1字符界面下关机用什么命令?如果有的话。还是直接关电源就行了?
  • 请问如何在linux下关闭一个正在监听的端口?
  • redhat linux7.2/7.3,SHELL下,reboot是重启,那么要在SHELL下关机是什么命令???
  • 请介绍两本LINUX下关于多进程,网络编程的书籍
  • 求教下关于ubuntu和fedora的使用?
  • Linux下关于垃圾邮件的处理


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3