内核态下进行read/write系统调用的问题

VanillaSky 2004-04-29 09:40:18
写了一个模块,想在模块初始化时调用本地文件中的一些配置信息
但不知内核态下能不能调用open(),read()这些文件操作函数
写了一个小程序想验证,编译没有问题,但插入设备时报错:

[root@Vanillasky temp]# /sbin/insmod temp.o
temp.o: unresolved symbol errno
[root@Vanillasky temp]#

问题就出在这个errno,先看看我的程序吧(很简单的):

#if defined(CONFIG_SMP)
#define __SMP__
#endif

#if defined(CONFIG_MODVERSIONS)
#define MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/stat.h>
#include <linux/fcntl.h>

#define BUFLEN 50

MODULE_LICENSE("GPL");

#define __KERNEL_SYSCALLS__
#include <linux/unistd.h>


int init_module(void)
{
int fd,n;
char* buffer=NULL;
fd=open("/home/sophia/module/Hello",O_RDWR,S_IRWXU);
if((n=read(fd,buffer,BUFLEN))<0) printk(KERN_DEBUG "Sophia: Read file error!\n");
printk(KERN_DEBUG "Sophia: Hello, kernel!\n");
printk(KERN_DEBUG "%s",buffer);
return 0;
}
void cleanup_module(void)
{
printk(KERN_DEBUG "Sophia: Good-bye, kernel!\n");
}

编译:
gcc -D__KERNEL__ -I/usr/src/linux-2.4.20-8/include/ -DMODULE -Wall -O2 -c temp.c -o temp.o
没有错误

我的程序本来是没有定义errno的。后来查了查,在linux/unistd.h里面有定义
extern int errno;但我include了这个文件的呀!
真搞不懂,怎么定义了的变量都会被系统认为是unresolved symbol?

后来看了一下/proc/ksyms,发现跟errno有关的只有这一行:
c88143d0 journal_errno_R1f65a45f [jbd]
不知道跟我出现的问题有没有关系。
请大家不吝赐教,多谢!!
...全文
282 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
VanillaSky 2004-04-30
  • 打赏
  • 举报
回复
搞定了,呵呵,果然要定义一个int errno
多谢各位!!
caohuay 2004-04-30
  • 打赏
  • 举报
回复
open read write是用户态的函数,在内核中是没有的,
标准的程序应该是这样的:
struct file *file = NULL;
mm_segment_t old_fs;
file = filp_open("/tmp/tmpfile", O_RDWR|O_CREAT, 0666);

old_fs = get_fs();
set_fs(get_ds());
if(file->f_op->write)
file->f_op->write(file,"12345",5, &file->f_pos);
set_fs(old_fs);


OK..上面没有判断一些指针是否有效!!!
pepp 2004-04-30
  • 打赏
  • 举报
回复
在unistd.h中只是申明不是定义
而内核又没有输出errno,所以需要自己定义一个
在include <unistd.h> 前定义一个int errno;就应该可以了
tianxiangyuan 2004-04-30
  • 打赏
  • 举报
回复
在内核中可以读写文件,但是不能直接调用open,read等函数。可以参考内核代码自己整理。
VanillaSky 2004-04-30
  • 打赏
  • 举报
回复
To caohuay(影子) :
使用flip_open需要加入哪个头文件?在linux下我man不到这个函数
另外,这个函数能打开某个设备么,比如一个字符设备?
VanillaSky 2004-04-30
  • 打赏
  • 举报
回复
To caohuay(影子) :
使用flip_open需要加入哪个头文件?在linux下我man不到这个函数
另外,这个函数能打开某个设备么,比如一个字符设备?
wxywh 2004-04-29
  • 打赏
  • 举报
回复
加上:
#ifndef __KERNEL__
#define __KERNEL__
#endif

#ifndef MODULE
#define MODULE
#endif
试试看.

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧