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

求助,linux下写啦个字符驱动,写啦个测试代码,open失败,急急急,我实在不知道错哪啦,请大神帮忙给看下

    来源: 互联网  发布时间:2017-05-16

    本文导语:  下面是过程 globalvar.c代码: #include  #include  #include  #include   MODULE_LICENSE("GPL"); #define MAJOR_NUM 254 //主设备号 static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*); static ssize_t globalvar_write(struct file *, const ...

下面是过程
globalvar.c代码:
#include 
#include 
#include 
#include  
MODULE_LICENSE("GPL");

#define MAJOR_NUM 254 //主设备号

static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);

//初始化字符设备驱动的file_operations结构体
struct file_operations globalvar_fops =
{
 read: globalvar_read, write: globalvar_write,
};
static int global_var = 0; //"globalvar"设备的全局变量

static int __init globalvar_init(void)
{
 int ret;

 //注册设备驱动
 ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);
 if (ret)
 {
  printk("globalvar register failure");
 }
 else
 {
  printk("globalvar register success");
 }
 return ret;
}

static void __exit globalvar_exit(void)
{
 int ret;

 //注销设备驱动
 ret = unregister_chrdev(MAJOR_NUM, "globalvar");
 if (ret)
 {
  printk("globalvar unregister failure");
 }
 else
 {
  printk("globalvar unregister success");
 }
}

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
 //将global_var从内核空间复制到用户空间
 if (copy_to_user(buf, &global_var, sizeof(int)))
 {
  return - EFAULT;
 } 
 return sizeof(int);
}

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
 //将用户空间的数据复制到内核空间的global_var
 if (copy_from_user(&global_var, buf, sizeof(int)))
 {
  return - EFAULT;
 } 
 return sizeof(int);
}

module_init(globalvar_init);
module_exit(globalvar_exit);

Makefile:
  obj-m := globalvar.o
  KERNEL := /lib/modules/`uname -r`/build
   all:
  make -C $(KERNEL) M=`pwd` modules
  install:
  make -C $(KERNEL) M=`pwd` modules_install
  depmod -A
 clean:
  make -C $(KERNEL) M=`pwd` clean
  rm -f *.*~ Module.* modules.*
下面是测试文件:


#include 
#include 
#include 
#include 
main()
{
 int fd, num;
 //打开"/dev/globalvar"
 fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);
 if (fd != -1 )
 {
  //初次读globalvar
  read(fd, &num, sizeof(int));
  printf("The globalvar is %d/n", num);

  //写globalvar
  printf("Please input the num written to globalvar/n");
  scanf("%d", &num);
  write(fd, &num, sizeof(int));

  //再次读globalvar
  read(fd, &num, sizeof(int));
  printf("The globalvar is %d/n", num);

  //关闭"/dev/globalvar"
  close(fd);
 }
 else
 {
  printf("Device open failure/n");
 }
}
下面是编译的整个过程:

$:sudo make
$:sudo insmod globalvar.ko
$:sudo mknod /dev/globalvar c 50 0
$:gcc globalvartest.c
$:./a.out
后面就提示打开设备失败
请问到底问题出在哪啊?我实在不知道问题出哪啊?请大神给我看看,不胜感激。

|
可以不用在程序里创建,mknod也可以, 你注册设备的时候注册上了吗,不然内核没有你mknod也没用啊,你先网上找个可以跑的,然后抄一遍,学习下,在自己写。

|
不懂,好像没有 xxx_open  接口啊

|
有没有open不是关键,关键是你的驱动初始化之后在/dev下根本没有globalvar设备,你只是注册了设备,并没有创建设备
还要使用class_create创建类,然后device_create创建设备。之后/dev下就有了设备。就可以open了。

    
 
 

您可能感兴趣的文章:

  • 求助~~哪位大神晓得如何固定tuxedo客户端与通信端的端口呀?
  • 求助 crontab -l & crontab -e 报错,谢各位大神先~~
  • 关于bash 字符串操作(求助)
  • 求助:对批量文件中的指定字符串进行替换:(批量替换)
  • 新手求助,编译时说不能解析字符是怎么回事?
  • [求助]vi中想把所有的换成/,这种特殊字符如何搞?
  • 求助 简单测试字符驱动 Cannot allocate memory
  • 求助! telnet到远程服务器后,如何访问服务器端字符设备
  • 关于字符设备驱动读写的问题,求助
  • 求助:在Linux下的一个字符串转换
  • 求助,如何用换行符替换文本中的指定字符串
  • sed 脚本求助:变量中含有转义字符处理
  • 求助:有关串口发送字符串问题
  • socket通信中的中文字符问题(菜鸟求助)
  • 在笔记本上安装linux转换字符界面求助
  • 在c++中,是否用方法可以将使用cout输出到屏幕上的字符给清除掉?请高手指点(高分求助)
  • 菜鸟求助:在 JAVA APPLET 里如何旋转 90 度显示一个字符?
  • 求助!我怎样才能使得我的Linux的字符界面tty都是显示纯英文,而图形界面就显示成中文呢?
  • 求助,一个获取字符及输出问题
  • 高分求助gtk_text_buffer_set_text参数中字符编码问题
  • [求助] linux字符文件设备访问的阻塞与非阻塞
  • [求助] 字符设备驱动,写数据和读数据都有问题,望大家帮忙[已解决,来人接分结贴]。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 紧急求助,创建socket失败!!
  • 求助!fedora13 下安装软件总是失败
  • 求助:函数getpeername()返回的namelen很小,导致获得名字失败是为什么?谢谢!!!
  • 【求助】软件包安装失败
  • 求助:sendmail发信失败
  • ubuntu10.04通过U盘安装失败。求助一下。
  • 求助!centOs系统root用户连接ftp失败,别的用户连接ftp成功?
  • (求助)启动vsftpd失败
  • 求助:mount 执行失败!多谢!
  • 求助:请问怎么获得在个一个脚本中执行的另外个脚本的返回结果,如执行成功或失败
  • 向高手求助一个简单问题:为什么我在linux上的socket编程bind失败,告诉是权限不允许?
  • 崩溃了阿,tftp配置总是失败,求助!!
  • 【求助】system()命令执行失败,请高手帮忙解决,谢谢!
  • 【诚意求救】小弟一台Web服务器上ProFTP服务启动失败,现给出错误信息,求助于高手
  • insmod 失败,问题很奇怪,方法用尽,求助
  • 求助:为什么我我在MAC OS上 执行ioctl 函数SIOCGIFADDR的命令获取IP地址失败呢?
  • [急切求助]IPC消息队列写失败时,如何清空队列中的数据?
  • 求助:apue文件在make的时候提示timex.h有问题,make失败
  • 高分求助高分求助高分求助高分求助高分求助高分求助 iis7站长之家
  • s3c2410ARM学习板NFS挂载失败,主机不能发现目标板,求助!!
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题


  • 站内导航:


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

    ©2012-2021,