免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1917 | 回复: 3
打印 上一主题 下一主题

求助:关于内核和用户程序通信的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-11 12:10 |只看该作者 |倒序浏览
我现在遇到一个这样的问题,我在内核(linux 2.4)里有个驱动,它负责从DSP读数据包,这个数据包中有一个这样的信息:DSP向用户层请求数据的大小(size),我尝试过在内核打开文件系统的文件,想把DSP要的数据送给它,发现打开文件后一读这个文件,内核就崩溃。这个操作的代码如下。但人人都说在内核读文件系统的文件不好,万不得已不要这样做。我想问一下有没有其他好的机制可以实现我的需求。我看了一下netlink好像可以,但是不是很确定。麻烦高手指点,谢谢!
1. 看看下面的代码有什么问题。
2. 有没有其他更好的机制实现这个需求。
  1.      struct file                     *tdm_filp = NULL;
  2.      unsigned char                   *buffer;     
  3.      int                             read_size = 100, count = 0;
  4.      int                             orgfsuid, orgfsgid, retval = 0;
  5.      mm_segment_t                    orgfs;

  6.      orgfsuid = current->fsuid;
  7.      orgfsgid = current->fsgid;
  8.      current->fsuid = current->fsgid = 0;
  9.      orgfs = get_fs();
  10.      set_fs(KERNEL_DS);

  11.      tdm_filp = filp_open("/home/test.mp3", O_RDONLY, 0);

  12.      if(IS_ERR(tdm_filp))
  13.      {
  14.          printk("file is not open yet\n");
  15.          return;
  16.      }


  17.      buffer = kmalloc(MAX_PACKET_BUFFER_SIZE, GFP_KERNEL);
  18.      if(buffer == NULL)
  19.      {
  20.          printk("unable to allocate memory\n");
  21.          goto exit;
  22.      }


  23.      if(tdm_filp->f_op && tdm_filp->f_op->read)
  24.      {
  25.          memset(buffer, 0x00, MAX_PACKET_BUFFER_SIZE);
  26.          read_size = (size > MAX_PACKET_BUFFER_SIZE) ? MAX_PACKET_BUFFER_SIZE : size;
  27.          count = tdm_filp->f_op->read(tdm_filp, buffer, read_size, NULL);
  28.          if(count < 0)
  29.          {
  30.              printk("read file error\n");
  31.              goto exit;
  32.          }
  33.           //...... do something
  34.      }

  35.     filp_close(tdm_filp, NULL);
  36.      kfree(buffer);
  37. exit:
  38.      set_fs(orgfs);
  39.      current->fsuid = orgfsuid;
  40.      current->fsgid = orgfsgid;
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-05-11 16:29 |只看该作者
netlink, proc文件都可以

论坛徽章:
0
3 [报告]
发表于 2010-05-13 19:04 |只看该作者
命令或者小量数据ioctl可以
大量数据,netlink很稳定,不过要设计好通讯协议

论坛徽章:
0
4 [报告]
发表于 2010-05-13 21:44 |只看该作者
我看到内核的netlink.h里有下面这些protocol,而我通信用的数据是一般的数据。不知道该用哪个。

  4 #define NETLINK_ROUTE       0   /* Routing/device hook              */
  5 #define NETLINK_SKIP        1   /* Reserved for ENskip              */
  6 #define NETLINK_USERSOCK    2   /* Reserved for user mode socket protocols  */
  7 #define NETLINK_FIREWALL    3   /* Firewalling hook             */
  8 #define NETLINK_TCPDIAG     4   /* TCP socket monitoring            */
  9 #define NETLINK_NFLOG       5   /* netfilter/iptables ULOG */
10 #define NETLINK_ARPD        8
11 #define NETLINK_ROUTE6      11  /* af_inet6 route comm channel */
12 #define NETLINK_IP6_FW      13
13 #define NETLINK_DNRTMSG     14  /* DECnet routing messages */
14 #define NETLINK_TAPBASE     16  /* 16 to 31 are ethertap */
15
16 #define NETLINK_ISIL            32      /* Intersil specific netlink channel */
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP