LoveUnix » 编程开发 & Rational » 如何在内核模式下操作文件?
让LU留住您的每

一天 让LU博客留住您的每一天
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.