虽然为了策略安全的问题不建议在内核中读写应用层的文件,但是有时候我们要debug时候会用到,这时候我们应该怎么写呢?

包含头文件

#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/param.h>

CHAR ucFileName[128];
mm_segment_t oldfs;
struct file *filep;
size_t ret;
UINT8 index = 0;
UINT32 Addr;
void *pVirAddr = NULL;
//static int dump_frame_cnt = 0;
UINT32 u4DumpSize = 3840*2160*4;

index = u1Scpip_GFX_GetCurrentFrameIdx();
Addr = (vScpipGfxGetAddrBase(index)<<4);
pVirAddr = (VOID *)VIRTUAL(Addr);

LOG(0, "kaosine get: Index=%d Addr=0x%x, pVirAddr=0x%x\n",index, Addr,

if(pVirAddr != NULL)
{
#if 1
oldfs = get_fs ();
set_fs (KERNEL_DS);
snprintf(ucFileName, sizeof(ucFileName), "/mnt/usb/vss_dump_%03d.bin", dump_frame_cnt);
//snprintf(ucFileName, sizeof(ucFileName), "/storage/128C-40D7/venc_dump_%03d.bin", dump_frame_cnt);

filep = filp_open ((const char *)ucFileName, (O_CREAT | O_WRONLY), 0644);  //如果这个权限设成0,有可能导致open fail打不开文件

if (IS_ERR (filep))
{
set_fs (oldfs); //如果跑到这里,fliep指针是NULL的,不能调用filp_close (filep, 0);,否则可能回到导致kernel死掉
printk("unable to open file: %s\n", ucFileName);

//vScpipClearISRstatus(ISR_DRAM_GFX_WRITE);
//return;
}
else
{
LOG(0,"file Num: %s\n",ucFileName);
//ret = filep->f_op->write (filep, (char __user *)buf, u4YSize, &filep->f_pos);
if((filep != NULL) )
ret = vfs_write(filep, (char __user *)pVirAddr, u4DumpSize, &filep->f_pos);
else
LOG(0, " filep=0x%x \n", filep);

filp_close (filep, 0);
set_fs(oldfs);
}

//filp_close (filep, 0);
//set_fs(oldfs);
#endif
//LOG(0,"Frame %d: size=%d %s\n",dump_frame_cnt,sizeof(buf),buf);
dump_frame_cnt ++;

//x_crit_end(csState);
//kfree(buf);
}