- 论坛徽章:
- 0
|
我现在遇到一个这样的问题,我在内核(linux 2.4)里有个驱动,它负责从DSP读数据包,这个数据包中有一个这样的信息:DSP向用户层请求数据的大小(size),我尝试过在内核打开文件系统的文件,想把DSP要的数据送给它,发现打开文件后一读这个文件,内核就崩溃。这个操作的代码如下。但人人都说在内核读文件系统的文件不好,万不得已不要这样做。我想问一下有没有其他好的机制可以实现我的需求。我看了一下netlink好像可以,但是不是很确定。麻烦高手指点,谢谢!
1. 看看下面的代码有什么问题。
2. 有没有其他更好的机制实现这个需求。- struct file *tdm_filp = NULL;
- unsigned char *buffer;
- int read_size = 100, count = 0;
- int orgfsuid, orgfsgid, retval = 0;
- mm_segment_t orgfs;
- orgfsuid = current->fsuid;
- orgfsgid = current->fsgid;
- current->fsuid = current->fsgid = 0;
- orgfs = get_fs();
- set_fs(KERNEL_DS);
- tdm_filp = filp_open("/home/test.mp3", O_RDONLY, 0);
- if(IS_ERR(tdm_filp))
- {
- printk("file is not open yet\n");
- return;
- }
- buffer = kmalloc(MAX_PACKET_BUFFER_SIZE, GFP_KERNEL);
- if(buffer == NULL)
- {
- printk("unable to allocate memory\n");
- goto exit;
- }
- if(tdm_filp->f_op && tdm_filp->f_op->read)
- {
- memset(buffer, 0x00, MAX_PACKET_BUFFER_SIZE);
- read_size = (size > MAX_PACKET_BUFFER_SIZE) ? MAX_PACKET_BUFFER_SIZE : size;
- count = tdm_filp->f_op->read(tdm_filp, buffer, read_size, NULL);
- if(count < 0)
- {
- printk("read file error\n");
- goto exit;
- }
- //...... do something
- }
- filp_close(tdm_filp, NULL);
- kfree(buffer);
- exit:
- set_fs(orgfs);
- current->fsuid = orgfsuid;
- current->fsgid = orgfsgid;
复制代码 |
|