当前位置:  技术问答>linux和unix

内核空间和用户空间通信

    来源: 互联网  发布时间:2015-11-12

    本文导语:  我编写了一个模块 在netfilter得钩子NF_IP_PRE_ROUTING上注册了一个函数 这个函数要读一个磁盘文件 也就是说问题是:在linux内核空间如何读取磁盘文件?文件得内容是一个16bits得数字 最好能给出具体得程序 因为网上...

我编写了一个模块 在netfilter得钩子NF_IP_PRE_ROUTING上注册了一个函数 这个函数要读一个磁盘文件 也就是说问题是:在linux内核空间如何读取磁盘文件?文件得内容是一个16bits得数字

最好能给出具体得程序 因为网上有很多关于内核与用户空间通信得 但是都很泛 针对性不强
比如 我觉得netlink好像并不适合我遇到得这种情况 
这是我得想法 请高手指点

|
我是在论坛上找到的,很好用的,希望对你有帮助 

/* 

file I/O in kernel module 
by flyduck 2001/03/21 

*/ 



#define __KERNEL__ 
#define MODULE 

#include  
#include  
#include  
#include  
#include  
#include  
#include  

#define EOF (-1) 
#define SEEK_SET 0 
#define SEEK_CUR 1 
#define SEEK_END 2 

// 
// Function Prototypes 
// 

struct file *klib_fopen(const char *filename, int flags, int mode); 
void klib_fclose(struct file *filp); 
int klib_fseek(struct file *filp, int offset, int whence); 
int klib_fread(char *buf, int len, struct file *filp); 
int klib_fgetc(struct file *filp); 
char *klib_fgets(char *str, int size, struct file *filp); 
int klib_fwrite(char *buf, int len, struct file *filp); 
int klib_fputc(int ch, struct file *filp); 
int klib_fputs(char *str, struct file *filp); 
int klib_fprintf(struct file *filp, const char *fmt, ...); 

// 
// Library Functions 
// 


// Context : User 
// Parameter : 
// filename : filename to open 
// flags : 
// O_RDONLY, O_WRONLY, O_RDWR 
// O_CREAT, O_EXCL, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC, ... 
// mode : file creation permission. 
// S_IRxxx S_IWxxx S_IXxxx (xxx = USR, GRP, OTH), S_IRWXx (x = U, G, O) 
// Return : 
// file pointer. if error, return NULL 

struct file *klib_fopen(const char *filename, int flags, int mode) 

struct file *filp = filp_open(filename, flags, mode); 
return (IS_ERR(filp)) ? NULL : filp; 


// Context : User 
// Parameter : 
// filp : file pointer 
// Return : 

void klib_fclose(struct file *filp) 

if (filp) 
fput(filp); 



// Context : User 
// Parameter : 
// filp : file pointer 
// offset : 
// whence : SEEK_SET, SEEK_CUR 
// Comment : 
// do not support SEEK_END 
// no boundary check (file position may exceed file size) 

int klib_fseek(struct file *filp, int offset, int whence) 

int pos = filp->f_pos; 
if (filp) { 
if (whence == SEEK_SET) 
pos = offset; 
else if (whence == SEEK_CUR) 
pos += offset; 
if (pos f_pos = pos); 
} else 
return -ENOENT; 


// Context : User 
// Parameter : 
// buf : buffer to read into 
// len : number of bytes to read 
// filp : file pointer 
// Return : 
// actually read number. 0 = EOF, negative = error 

int klib_fread(char *buf, int len, struct file *filp) 

int readlen; 
mm_segment_t oldfs; 
if (filp == NULL) 
return -ENOENT; 
if (filp->f_op->read == NULL) 
return -ENOSYS; 
if (((filp->f_flags & O_ACCMODE) & O_RDONLY) != 0) 
return -EACCES; 
oldfs = get_fs(); 
set_fs(KERNEL_DS); 
readlen = filp->f_op->read(filp, buf, len, &filp->f_pos); 
set_fs(oldfs); 
return readlen; 


// Context : User 
// Parameter : 
// filp : file pointer 
// Return : 
// read character, EOF if end of file 

int klib_fgetc(struct file *filp) 

int len; 
unsigned char buf[4]; 
len = klib_fread((char *) buf, 1, filp); 
if (len > 0) 
return buf[0]; 
else if (len == 0) 
return EOF; 
else 
return len; 


// Context : User 
// Parameter : 
// str : string 
// size : size of str buffer 
// filp : file pointer 
// Return : 
// read string. NULL if end of file 
// Comment : 
// Always append trailing null character 

char *klib_fgets(char *str, int size, struct file *filp) 

char *cp; 
int len, readlen; 
mm_segment_t oldfs; 
if (filp && filp->f_op->read && ((filp->f_flags & O_ACCMODE) & O_WRONLY) == 0) { 
oldfs = get_fs(); 
set_fs(KERNEL_DS); 
for (cp = str, len = -1, readlen = 0; readlen f_op->read(filp, cp, 1, &filp->f_pos)) write == NULL) 
return -ENOSYS; 
if (((filp->f_flags & O_ACCMODE) & (O_WRONLY | O_RDWR)) == 0) 
return -EACCES; 
oldfs = get_fs(); 
set_fs(KERNEL_DS); 
writelen = filp->f_op->write(filp, buf, len, &filp->f_pos); 
set_fs(oldfs); 
return writelen; 


// Context : User 
// Parameter : 
// filp : file pointer 
// Return : 
// written character, EOF if error 

int klib_fputc(int ch, struct file *filp) 

int len; 
unsigned char buf[4]; 
buf[0] = (unsigned char) ch; 
len = klib_fwrite(buf, 1, filp); 
if (len > 0) 
return buf[0]; 
else 
return EOF; 


// Context : User 
// Parameter : 
// str : string 
// filp : file pointer 
// Return : 
// count of written characters. 0 = retry, negative = error 

int klib_fputs(char *str, struct file *filp) 

return klib_fwrite(str, strlen(str), filp); 


// Context : User 
// Parameter : 
// filp : file pointer 
// fmt : printf() style formatting string 
// Return : 
// same as klib_fputs() 

int klib_fprintf(struct file *filp, const char *fmt, ...) 

static char s_buf[1024]; 
va_list args; 
va_start(args, fmt); 
vsprintf(s_buf, fmt, args); 
va_end(args); 
return klib_fputs(s_buf, filp); 


// 
// Test Functions 
// 

#define MAXLINELEN 1024 

int init_module(void) 

char str[MAXLINELEN]; 
struct file *filp; 
int i, ch, line; 
printk("# Loading klib_filen"); 
printk("# klib_file : open for readn"); 
if ((filp = klib_fopen("./fileio.c", O_RDONLY, 0)) == NULL) { 
printk("Can't open filen"); 
return 1; 

printk("# klib_file : fgetcn"); 
for (i = 0; ; ++i) { 
ch = klib_fgetc(filp); 
printk("%c", ch); 
if (ch == 'n') 
break; 

printk("# klib_file : fgetsn"); 
klib_fseek(filp, 4450, SEEK_SET); 
klib_fgets(str, MAXLINELEN, filp); 
printk("%s", str); 
printk("# klib_file : fgets #2n"); 
klib_fseek(filp, 0, SEEK_SET); 
for (line = 0; klib_fgets(str, MAXLINELEN, filp) != NULL; ++line) 
printk("%04d : %s", line, str); 
klib_fclose(filp); 
printk("# klib_file : open for writen"); 
if ((filp = klib_fopen("./tmpfile", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR)) == NULL) { 
printk("Can't open filen"); 
return 1; 

printk("# klib_file : fputcn"); 
klib_fputc('*', filp); 
klib_fputc('n', filp); 
printk("# klib_file : fputsn"); 
klib_fputs("Hello, Worldn", filp); 
printk("# klib_file : fprintfn"); 
klib_fprintf(filp, "Write %d, %d, %dn", 1, 2, 3); 
klib_fclose(filp); 
printk("Unloading klib_filen"); 
return 1; 


void cleanup_module(void) 


return; 



    
 
 

您可能感兴趣的文章:

  • 求助关于内核空间和用户空间通信的问题
  • 内核空间和用户空间怎么通信?
  • 关于内核空间和用户空间之间的实时通信?
  • 讨论,用户空间和内核空间如何通信,有什么方式,如何实现的?
  • 内核空间能否调用用户空间程序?
  • 请问内核空间和用户空间有什么区别,是怎么划分的.谢谢
  • 用户进程有自己独立的地址空间,内核线程没有自己的地址空间 该怎样理解: ?
  • linux用户空间到内核空间数据传递
  • 关于在内核空间和用户空间引用一个空指针的后果很原因
  • Linux中内核线程不访问内核态地址空间?
  • 如何将数据包sk_buff从内核空间提交给用户空间呢?
  • 内核空间与用户空间通讯
  • 驱动中如何将用户空间内存映射到内核空间使用?
  • (来拿分了)谁提供一个简单的netlink的程序? 要求是内核空间发往用户空间的。
  • 有人做过内核空间和用户空间的内存映射吗 内核空间和用户空间交换数据用内存映射的方法,结果做的驱动可以工作,但经常会引起死机
  • 划分内核空间大小?
  • Linux 内核空间与用户空间批量数据传输问题!
  • 在内核的某个函数中,如何能知道是哪个用户空间的函数调用了它,以及这个用户空间函数所在的文件?
  • 用户空间/内核空间
  • 为什么内核空间与用户空间得数据交换消耗如此巨大?
  • 用netlink从内核空间向用户空间传送数据为何失败!
  • 内核访问用户空间
  • 用户空间的程序如何改成运行于内核的?
  • 用户空间如何访问内核变量。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux驱动程序是怎样通过内核和应用程序通信,还有是怎样和硬件通信,跪求求解,谢谢高手留言。
  • 初学内核编程,在内核态下怎么用socket通信?
  • 求内核和用户态简单易行的通信方法,用户态只需得到一个内核模块参数
  • netlink怎么与内核通信?
  • linux内核态UDP通信的问题
  • 内核模块如何与用户进程进行通信??
  • 内核进程与用户进程间的通信
  • Linux内核进程与应用进程的通信方式有哪些?
  • linux 里有哪些内核与用户进程的通信方法? 请高手指点一下!谢谢!
  • 在LINUX下的一段内核与用启进程通信的程序。出现下的错误
  • 高分求助:内核模块编程中如何实现网络通信
  • 用netlink进行用户态和内核态通信,想传两个整数进去,该如何操作,我只会发个字符串进去,求关键部位代码
  • 自己写的内核模块与用户模块通信(交互)
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • 2.6内核下编译2.4内核
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 谁能提供kgdb内核补丁内核模块的下载
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 编译新内核后怎么进入原来内核
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 内核模块跟内核版本不匹配????????
  • docker使用的技术之Container内核原理介绍
  • 请教:如何安装新内核(rpm包)而不同原来得内核冲突?? 在线等待!!
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3