2006-3-16 12:44
honglun520
如何在内核模式下操作文件?
请问如何在内核模式下操作磁盘上的文件?可以用open,read吗?要用到哪些头文件呢?
谁能帮我贴些资料?谢谢!!
[[i] 本帖最后由 honglun520 于 2006-3-16 12:45 编辑 [/i]]
2006-3-16 23:37
sinister
什么内核?说清楚了。
2006-3-17 08:23
honglun520
不好意思,2.4或者2.6的内核都可以,不过我想这跟内核关系不大,我想知道在内核模式下可以使用哪些系统调用对磁盘文件操作
2006-3-17 12:00
sinister
看来我也没说清楚。我是指什么系统内核, AIX?SOLARIS?LINUX?
都已经在 LINUX 内核了,不见得非要再用系统调用,一般情况下 filp_open() 配合 struct file 里
的 read/write 即可。也可以在深入 VFS 或者实际文件系统来调用再底层的函数。如果非要用
系统调用的话 sys_open() 等也一样可以调用。
记得老版本 LINUX 内核需要先设置 FS,DS 选择字后才可以调用 filp_open() 。具体是哪个内核
记不清了。
2006-3-17 12:32
honglun520
多谢回复!
你说的filp_open()是可行的,但感觉使用起来全是指针,不太方便,我的确是想用sys_open(),但是有问题,以下是我从一篇资料里找到的,可以在2.4内核编译通过,但是insmod时会出现问题:Uknown symbol sys_open,不知道为什么??
#define __KERNEL_SYSCALLS__
#define MODULE
#define __KERNEL__
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
static void read_file(char *filename)
{
int fd;
char buf[1];
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
fd = sys_open(filename, O_RDONLY, 0);
if (fd >= 0) {
printk(KERN_DEBUG);
while (sys_read(fd, buf, 1) == 1)
printk("%c", buf[0]);
printk("\n");
sys_close(fd);
}
set_fs(old_fs);
}
static int __init testmod_init(void)
{
printk("begin to open file............................................\n");
read_file("/etc/shadow");
return 0;
}
static void __exit testmod_cleanup(void)
{
printk("module exit......................................................\n");
}
MODULE_LICENSE("GPL");
module_init(testmod_init);
module_exit(testmod_cleanup);
2006-3-17 19:29
sinister
sys_open 是导出的,不应该有这种问题。 再看看你其他配置吧。又看了下,原来新版 LINUX 内核
仍然需要设置FS 选择子。我还当新版内核会改进成自己设置。
2006-3-20 09:39
honglun520
我又把这段代码放到2.6内核下,问题依旧。Makefile为:
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m :=hello2.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
endif
clean:
rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
rm -rf .tmp_versions
出现一个warning!!
*** Warning: "sys_open" [/home/wasai/module/hello2.ko] undefined!
实在没办法了,我把fs/open.c中的sys_open()函数代码贴到我的模块里,然后就ok了。
在/proc/kallsyms里有sys_open的导出,可就是链接不上!
2006-3-31 23:49
liuguidong123
我也是这个问题
请问如何解决!
谢谢
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.