最近项目中遇到一个问题,需要在驱动ko文件中写文件记录log,网上google了半天,要么不能用,要么直接编译不通过,最后参考内核源码linux-2.6.38/drivers/staging/spectra/lld_emu.c才搞定,主要如下: 1.我内核版本为2.6.38,编译器gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67); 2.使用网上说的sys_open编译没问题,加载时会提示unknown symbol错误,估计是没有EXPORT_SYMBOL,所以不能在ko文件中使用; 3.使用网上一个filp_open例子,里面还调用了ioctl相关,直接编译错误,去除相关错误后,又加载错误; 4.用cscope搜索调用filp_open相关地方,找到drivers/staging/spectra/lld_emu.c里面有一个int emu_write_mem_to_file(void),copy出来,几乎不用修改直接可以使用,源码如下: 点击(此处)折叠或打开 #include #include #include #include #include #include #include #include #include #include #include static int write_log_file(char *filename, char *data_w) { mm_segment_t fs; struct file *nef_filp = NULL; struct inode *inode = NULL; loff_t nef_size = 0; loff_t tmp_file_offset; ssize_t nwritten; int rc = -EINVAL; int str_len; fs = get_fs(); set_fs(get_ds()); nef_filp = filp_open(filename, O_CREAT | O_RDWR, 0); if (IS_ERR(nef_filp)) { printk(KERN_ERR "filp_open error: " "Unable to open nand emu file!\n"); return PTR_ERR(nef_filp); } if (nef_filp->f_path.dentry) { inode = nef_filp->f_path.dentry->d_inode; } else { printk(KERN_ERR "Invalid " "nef_filp->f_path.dentry value!\n"); goto out; } nef_size = i_size_read(inode->i_mapping->host); if (nef_size < 0) { printk(KERN_ERR "Invalid " "nand emu file size: 0x%llx\n", nef_size); goto out; } else { printk(KERN_ERR "nand emu file size: ""%lld\n", nef_size); } str_len = strlen(data_w) + 1; tmp_file_offset = nef_size; nwritten = vfs_write(nef_filp, (char __user *)data_w, str_len, &tmp_file_offset); if (nwritten < str_len) { printk(KERN_ERR "%s, Line %d - " "nand emu file partial write: " "%d bytes\n", __FILE__, __LINE__, (int)nwritten); goto out; } rc = 0; out: filp_close(nef_filp, current->files); set_fs(fs); return rc; } 在合适处调用如write_log_file("/root/kernel_reboot.txt", "rebooting…\n\n")即可。 |