C:从内核模块写入文件,这样正确吗?

C:从内核模块写入文件,这样正确吗?,c,file,kernel-module,fwrite,C,File,Kernel Module,Fwrite,我尝试将pcm字节(从ALSA缓冲区)从内核空间复制/写入内核模块(LKM)内的文件 文件已经写入,大小对我来说还可以,但是因为它是PCM数据,我看不出它是否正确(原始音频数据,不可读) 我的音频播放器(MPlayer=“无效搜索到负位置FFFFFFFFFFFFFF!”,VLC,Foobar2000)无法播放我编写的文件,因此我认为我的代码中有错误 当我通过SCITE打开文件时,我看到了许多“NUL”和其他水晶材料(字节;) 也许你们中有人发现了一只虫子 我有这个剧本: unsigned cha

我尝试将pcm字节(从ALSA缓冲区)从内核空间复制/写入内核模块(LKM)内的文件

文件已经写入,大小对我来说还可以,但是因为它是PCM数据,我看不出它是否正确(原始音频数据,不可读)

我的音频播放器(MPlayer=“无效搜索到负位置FFFFFFFFFFFFFF!”,VLC,Foobar2000)无法播放我编写的文件,因此我认为我的代码中有错误

当我通过SCITE打开文件时,我看到了许多“NUL”和其他水晶材料(字节;)

也许你们中有人发现了一只虫子

我有这个剧本:

unsigned char *dma_area; // this is the source, an mmapped-area
int pcm_offset_bytes; // the actual offset in the dma_area
int size_bytes; // the amount of bytes to copy
struct file *target_file; // the target-file


int ret; // used in write-process below
int wrote = 0; // used in write-process below
mm_segment_t fs;
void *data; // dma_area + pcm_offset_bytes

// (..) calculate offset and size

// open the target file
target_file = filp_open("/dev/snd/pcmC0D0p_output", (O_CREAT | O_TRUNC | O_WRONLY), (S_IRWXU | S_IRWXG | S_IRWXO));

data = dma_area + pcm_offset_bytes


fs = get_fs();
set_fs (get_ds ());

if (!target_file || !target_file->f_op || !target_file->f_op->write) {
    LOGI("something's missing\n");
    return -EIO;
}

// loop until every byte is written
while (size_bytes > 0) {

    ret = target_file->f_op->write(target_file, (char *)data, size_bytes, &target_file->f_pos);

    LOGI ("wrote %d bytes to target_file@%p, return %d\n", size_bytes, target_file, ret);
    if (ret <= 0)
        goto done;

    size_bytes -= ret;
    data += ret;
    wrote += ret;
}

ret = wrote;

done:
    set_fs(fs);
    LOGI("result %d\n", ret);
无符号字符*dma_区域;//这是源,一个MMAP区域
整数pcm_偏移量_字节;//dma_区域中的实际偏移量
int size_字节;//要复制的字节数
结构文件*目标文件;//目标文件
int ret;//在下面的写过程中使用
int=0;//在下面的写过程中使用
mm_段_tfs;
void*数据;//dma\U区域+pcm\U偏移量\U字节
//(..)计算偏移量和尺寸
//打开目标文件
target_file=filp_open(“/dev/snd/pcmC0D0p_output”,(O_create | O|u TRUNC | O|WRONLY),(S_IRWXU | S|u IRWXG | S|u IRWXO));
数据=dma\U区域+pcm\U偏移量\U字节
fs=get_fs();
set_fs(get_ds());
如果(!target_file | |!target_file->f_op | |!target_file->f_op->write){
LOGI(“缺少某些内容\n”);
返回-EIO;
}
//循环,直到写入每个字节
而(大小_字节>0){
ret=target\u file->f\u op->write(target\u file,(char*)数据、大小字节和target\u file->f\u pos);
LOGI(“已将%d字节写入目标\u文件@%p,返回%d\n”,大小\u字节,目标\u文件,ret);
如果(ret首先,您不“应该”写入内核中的文件

有关如何播放无头原始pcm的更恰当问题,可以使用audacity的导入功能

或者使用aplay

aplay some_file -t raw -f S16_LE -c 2 -r 44100

使用任何合适的参数。

这看起来是正确的。我猜媒体播放器只是不理解该文件,因为它是原始PCM。尝试从现有wav文件中窃取RIFF头并将其预编到该文件中,然后重试。嘿,是的,我知道在内核空间中写入文件不好。这只是为了测试currenct功能。我将尝试aplay技巧,但它不是那么容易,因为模块在android上(没有aplay)。但可能在我的虚拟机上。