精华内容
下载资源
问答
  • 在用户态,我们操作文件可以用C库函数:open()、read()、write()等,但是在内核态没有库函数可用,这时就需要用内核的一些函数:filp_openfilp_close、vfs_read、vfs_write、set_fs、get_fs等函数, 在下列文件中...

    内核态文件操作

    在用户态,我们操作文件可以用C库函数:open()、read()、write()等,但是在内核态没有库函数可用,这时就需要用内核的一些函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs等函数,

    在下列文件中声明:

    /usr/lib/modules/3.10.0-514.el7.x86_64/build/include/linux/fs.h

    /usr/lib/modules/3.10.0-514.el7.x86_64/build/include/asm-generic/uaccess.h

    /usr/src/kernels/3.10.0-514.el7.x86_64/include/linux/err.h

    extern struct file *filp_open(const char *, int, umode_t);

    参数说明:

    第一个参数表明要打开或创建文件的名称(包括路径部分)。

    第二个参数文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。

    第三个参数创建文件时使用,设置创建文件的读写权限,其它情况可以设为0

      该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。

     

    extern int filp_close(struct file *, fl_owner_t id);

    参数说明:

    第一个参数是filp_open返回的file结构体指针

    第二个参数基本上都是NULL

     

    extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
    extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);

    参数说明:

    第一个参数是filp_open返回的file结构体指针

    第二个参数是buf,注意,这个参数有用__user修饰,表明buf指向用户空间的地址,如果传入内核空间的地址,就会报错,并返回-EFAULT,

    但在kernel中,要使这两个读写函数使用kernel空间的buf指针也能正确工作,需要使用set_fs()

     

    static inline void set_fs(mm_segment_t fs)

    该函数的作用是改变kernel对内存地址检查的处理方式,

    其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,

    默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。

    那么要在这种对内存地址做检查变换的函数中使用内核空间地址,就需要使用set_fs(KERNEL_DS)进行设置,

    它的作用是取得当前的设置,这两个函数的一般用法为:

    filp_open()
    mm_segment_t old_fs;
    old_fs = get_fs();
    set_fs(KERNEL_DS);
    ...... //与内存有关的操作
    set_fs(old_fs);
    filp_close

    下图是在内核中找到的一个场景:

    第三个参数表明文件要读写的起始位置。

    几点说明:(从网上查找的资料)

    Linux Kernel组成员不赞成在kernel中独立的读写文件(这样做可能会影响到策略和安全问题),对内核需要操作的文件内容,最好由应用层配合完成。

    这些函数的正确运行需要依赖于进程环境,因此,有些函数不能在中断的handle或Kernel中不属于任何进程的代码中执行,否则可能出现崩溃,要避免这种情况发生,可以在kernel中创建内核线程,将这些函数放在线程环境下执行。

     

    #ifndef _LINUX_ERR_H
    #define _LINUX_ERR_H
    
    #include <linux/compiler.h>
    
    #include <asm/errno.h>
    
    /*
     * Kernel pointers have redundant information, so we can use a
     * scheme where we can return either an error code or a dentry
     * pointer with the same return value.
     *
     * This should be a per-architecture thing, to allow different
     * error and pointer decisions.
     */
    #define MAX_ERRNO       4095
    
    #ifndef __ASSEMBLY__
    
    #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
    
    static inline void * __must_check ERR_PTR(long error)
    {
            return (void *) error;
    }
    
    static inline long __must_check PTR_ERR(const void *ptr)
    {
            return (long) ptr;
    }
    
    static inline long __must_check IS_ERR(const void *ptr)
    {
            return IS_ERR_VALUE((unsigned long)ptr);
    }
    
    static inline long __must_check IS_ERR_OR_NULL(const void *ptr)
    {
            return !ptr || IS_ERR_VALUE((unsigned long)ptr);
    }
    

    内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。

    总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。

    在linux中有很多错误,内核错误可以参考include/asm-generic/errno-base.h。

    MAX_ERRNO定义了最大的错误号4095,刚好是4k-1,所以内核地址保留了0xfffffffffffff000~0xffffffffffffffff(64位系统)用来记录错误号,也就是说这段地址和Linux的错误号是一一对应的,可以用上面的内联函数相互转化。

    比如说我们上面的filp_open函数返回值,用IS_ERR函数去检查,如果地址落在0xfffffffffffff000~0xffffffffffffffff范围,

    表示filp_open函数失败,IS_ERR为1,同时filp_open返回的错误地址对应一个linux的错误号,

    如果想知道是哪个错误号,就用PTR_ERR函数来转化。

    错误的返回地址和错误号是可以使用 ERR_PTR、PTR_ERR 相互转化的。

     

     

     

     

     

     

    展开全文
  • 在用户态,我们操作文件可以用C库函数:open()、read()、write()等,但是在内核态没有库函数可用,这时就需要用内核的一些函数:filp_openfilp_close、vfs_read、vfs_write、 set_fs、get_fs等函数,在linux/fs.h...

    内核态文件操作

    在用户态,我们操作文件可以用C库函数:open()、read()、write()等,但是在内核态没有库函数可用,这时就需要用内核的一些函数:filp_open、filp_close、vfs_read、vfs_write、

    set_fs、get_fs等函数,在linux/fs.h和asm/uaccess.h中声明。

     

    参数说明:

    第一个参数表明要打开或创建文件的名称(包括路径部分)。

    第二个参数文件的打开方式,其取值与标准库中的open相应参数类似,可以取O_CREAT,O_RDWR,O_RDONLY等。

    第三个参数创建文件时使用,设置创建文件的读写权限,其它情况可以设为0

      该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。

     

    参数说明:

    第一个参数是filp_open返回的file结构体指针

    第二个参数基本上都是NULL

     

    参数说明:

    第一个参数是filp_open返回的file结构体指针

    第二个参数是buf,注意,这个参数有用__user修饰,表明buf指向用户空间的地址,如果传入内核空间的地址,就会报错,并返回-EFAULT,但在kernel中,要使这两个读写函数使用kernel空间的buf指针也能正确工作,需要使用set_fs()。该函数的作用是改变kernel对内存地址检查的处理方式,其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。那么要在这种对内存地址做检查变换的函数中使用内核空间地址,就需要使用set_fs(KERNEL_DS)进行设置,它的作用是取得当前的设置,这两个函数的一般用法为:

    filp_open()
    mm_segment_t old_fs;
    old_fs = get_fs();
    set_fs(KERNEL_DS);
    ...... //与内存有关的操作
    set_fs(old_fs);

    filp_close

    下图是在内核中找到的一个场景:

     

    第三个参数表明文件要读写的起始位置。

    几点说明:(从网上查找的资料)

    1. Linux Kernel组成员不赞成在kernel中独立的读写文件(这样做可能会影响到策略和安全问题),对内核需要操作的文件内容,最好由应用层配合完成。
    2. 这些函数的正确运行需要依赖于进程环境,因此,有些函数不能在中断的handle或Kernel中不属于任何进程的代码中执行,否则可能出现崩溃,要避免这种情况发生,可以在kernel中创建内核线程,将这些函数放在线程环境下执行。

     

    二.IS_ERR()、ERR_PTR()、PTR_ERR()小解

     

    内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。在linux中有很多错误,内核错误可以参考include/asm-generic/errno-base.h。MAX_ERRNO定义了最大的错误号4095,刚好是4k-1,所以内核地址保留了0xfffffffffffff000~0xffffffffffffffff(64位系统)用来记录错误号,也就是说这段地址和Linux的错误号是一一对应的,可以用上面的内敛函数相互转化。比如说我们上面的filp_open函数返回值,用IS_ERR函数去检查,如果地址落在0xfffffffffffff000~0xffffffffffffffff范围,表示filp_open函数失败,IS_ERR为1,同时filp_open返回的错误地址对应一个linux的错误号,如果想知道是哪个错误号,就用PTR_ERR函数来转化。错误的返回地址和错误号是可以根据截图中的ERR_PTR、PTR_ERR相互转化的。

    转自:https://blog.csdn.net/weixin_42343585/article/details/81205246 

     

    展开全文
  • 之前以为在内核中不能创建文件,其实不是这样子的,只要文件系统跑起来之后就可以像在用户空间一样操作文件.   ...open() sys_open(), filp_open() close() sys_close(), filp_close() rea
    之前以为在内核中不能创建文件,其实不是这样子的,只要文件系统跑起来之后就可以像在用户空间一样操作文件.
     
    用户空间                   内核
    open()                    sys_open(), filp_open()
    close()                   sys_close(), filp_close()
    read()                    sys_read(), filp_read()
    write()                   sys_write(), filp_write()
    ----------------------------------------------------
     
    在内核模块中有时会用不了 sys_xxxx, 这时用 filp_xxxx 对应的函数就行了, 在模块中使用 sys_xxxx 还有问题, 还没有找到原因.
     
    在 /tmp 中创建文件 aa
    struct file *filep;
    filep=filp_open("/tmp/aa",O_CREAT | O_RDWR,0);
    if(IS_ERR(filep))
      return -1;
    filp_close(filep,0);
    return 0;
     
    ========================================
    sys_open 的使用方法:
    #include <linux/fs.h>
     
    ......
     u8  Buff[50];
     int fd;
     memset(Buff, 0x00, sizeof(Buff));
     mm_segment_t old_fs = get_fs();
     set_fs(KERNEL_DS);
     fd = sys_open("/etc/Info", O_RDONLY, 0);
     if(fd>=0)
     {
      sys_read(fd, Buff, 50);
      printk("string: %s/n", Buff);
      sys_close(fd);
     }
     set_fs(old_fs);
     
     
    ========================================
    下面 open 使用的一些参数:
    O_ACCMODE <0003>;: 读写文件操作时,用于取出flag的低2位。
    O_RDONLY<00>;: 只读打开
    O_WRONLY<01>;: 只写打开
    O_RDWR<02>;: 读写打开
    O_CREAT<0100>;: 文件不存在则创建,需要mode_t,not fcntl
    O_EXCL<0200>;: 如果同时指定了O_CREAT,而文件已经存在,则出错, not fcntl
    O_NOCTTY<0400>;: 如果pathname指终端设备,则不将此设备分配作为此进程的控制终端。not fcntl O_TRUNC<01000>;: 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。not fcntl
    O_APPEND<02000>;: 每次写时都加到文件的尾端
    O_NONBLOCK<04000>;: 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
    O_NDELAY;;
    O_SYNC<010000>;: 使每次write都等到物理I/O操作完成。
    FASYNC<020000>;: 兼容BSD的fcntl同步操作
    O_DIRECT<040000>;: 直接磁盘操作标识
    O_LARGEFILE<0100000>;: 大文件标识
    O_DIRECTORY<0200000>;: 必须是目录
    O_NOFOLLOW<0400000>;: 不获取连接文件
    O_NOATIME<01000000>;: 暂无
    当新创建一个文件时,需要指定mode 参数,以下说明的格式如宏定义名称<实际常数值>;: 描述。
    S_IRWXU<00700>;:文件拥有者有读写执行权限
    S_IRUSR (S_IREAD)<00400>;:文件拥有者仅有读权限
    S_IWUSR (S_IWRITE)<00200>;:文件拥有者仅有写权限
    S_IXUSR (S_IEXEC)<00100>;:文件拥有者仅有执行权限
    S_IRWXG<00070>;:组用户有读写执行权限
    S_IRGRP<00040>;:组用户仅有读权限
    S_IWGRP<00020>;:组用户仅有写权限
    S_IXGRP<00010>;:组用户仅有执行权限
    S_IRWXO<00007>;:其他用户有读写执行权限
    S_IROTH<00004>;:其他用户仅有读权限
    S_IWOTH<00002>;:其他用户仅有写权限
    S_IXOTH<00001>;:其他用户仅有执行权限
       Linux驱动编程书籍大多数都是介绍怎样用户态下怎么访问硬件设备,由于项目的需要,本人做了内核态下访问设备文件的方法,现在把程序拿出来和大家分享一下,希望对刚入门的朋友有所帮助。
       在我的《内核模块调用驱动》中给出了简单的字符设备文件程序,可以作为本文的驱动对象,在此,我就不多介绍了。调用驱动程序的模块如下:
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/stat.h>
    #include <linux/fs.h>
    #include <asm/unistd.h>
    #include <asm/uaccess.h>
    #include <linux/types.h>
    #include <linux/ioctl.h>
    #include "chardev.h"
    MODULE_LICENSE("GPL");
    //#define __KERNEL_SYSCALLS__
    #define bao "/dev/baovar"
    static char buf1[20];
    static char buf2[20];
    static int __init testmod_init(void)
    {
    mm_segment_t old_fs;
    ssize_t result;
    ssize_t ret;
    sprintf(buf1,"%s","baoqunmin");
    struct file *file=NULL;
    file=filp_open(bao,O_RDWR,0);
    if(IS_ERR(file)) goto fail0;
    old_fs=get_fs();
    set_fs(get_ds());
    ret=file->f_op->write(file,buf1,sizeof(buf1),&file->f_pos);
    result=file->f_op->read(file,buf2,sizeof(buf2),&file->f_pos);
    if(result>=0){buf2[20]='/n';printk("buf2-->%s/n",buf2);}
    else printk("failed/n");
    result=file->f_op->ioctl(file,buf2,sizeof(buf2),&file->f_pos);
    result=file->f_op->read(file,buf2,sizeof(buf2),&file->f_pos);
    set_fs(old_fs);
       filp_close(file,NULL);
     printk("file loaded/n");
        return 0;
    fail0:{filp_close(file,NULL);printk("load failed/n");}
    return 1;
    }
    static void __exit testmod_cleanup(void)
    {
     
        printk("module exit....................................................../n");
    }
    module_init(testmod_init);
    module_exit(testmod_cleanup);
    以上是完整的程序,直接可以编译运行。
    #include "chardev.h"头文件定义如下,此头文件也必须在驱动中包含!
    #include <linux/ioctl.h>
    #define BAO_IOCTL 't'
    #define IOCTL_READ  _IOR(BAO_IOCTL, 0, int)
    #define IOCTL_WRITE  _IOW(BAO_IOCTL, 1, int)
    #define BAO_IOCTL_MAXNR 1
    以下给出了我的Makefile文件:
    CC=gcc
    MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include
    test.o :test.c
     $(CC) $(MODCFLAGS) -c test.c
     echo insmod test.o to turn it on
     echo rmmod test to turn it off
     echo
    1.先加载设备驱动,我的设备文件为bao,
    2.再make以上文件
    3./sbin/insmod test.o加载模块
    4.dmesg 查看运行结果
    5./sbin/rmmod test
    6.卸载加载的驱动
    我在Linux red hat 9.0下成功运行
    我实现的只是在模块间对驱动程序的调用,可以说是这是一个最简单的例子。
    希望大家能有所收获!
    展开全文
  • 之前以为在内核中不能创建文件,其实不是这样子的,只要文件系统跑起来之后就可以像在用户空间一样操作文件.   ...open() sys_open(), filp_open() close() sys_close(), filp_close() read()
    之前以为在内核中不能创建文件,其实不是这样子的,只要文件系统跑起来之后就可以像在用户空间一样操作文件.
     
    用户空间                   内核
    open()                    sys_open(), filp_open()
    close()                   sys_close(), filp_close()
    read()                    sys_read(), filp_read()
    write()                   sys_write(), filp_write()
    ----------------------------------------------------
     
    在内核模块中有时会用不了 sys_xxxx, 这时用 filp_xxxx 对应的函数就行了, 在模块中使用 sys_xxxx 还有问题, 还没有找到原因.
     
    在 /tmp 中创建文件 aa
    struct file *filep;
    filep=filp_open("/tmp/aa",O_CREAT | O_RDWR,0);
    if(IS_ERR(filep))
      return -1;
    filp_close(filep,0);
    return 0;
     
    ========================================
    sys_open 的使用方法:
    #include <linux/fs.h>
     
    ......
     u8  Buff[50];
     int fd;
     memset(Buff, 0x00, sizeof(Buff));
     mm_segment_t old_fs = get_fs();
     set_fs(KERNEL_DS);
     fd = sys_open("/etc/Info", O_RDONLY, 0);
     if(fd>=0)
     {
      sys_read(fd, Buff, 50);
      printk("string: %s/n", Buff);
      sys_close(fd);
     }
     set_fs(old_fs);
     
     
    ========================================
    下面 open 使用的一些参数:
    O_ACCMODE <0003>;: 读写文件操作时,用于取出flag的低2位。
    O_RDONLY<00>;: 只读打开
    O_WRONLY<01>;: 只写打开
    O_RDWR<02>;: 读写打开
    O_CREAT<0100>;: 文件不存在则创建,需要mode_t,not fcntl
    O_EXCL<0200>;: 如果同时指定了O_CREAT,而文件已经存在,则出错, not fcntl
    O_NOCTTY<0400>;: 如果pathname指终端设备,则不将此设备分配作为此进程的控制终端。not fcntl O_TRUNC<01000>;: 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。not fcntl
    O_APPEND<02000>;: 每次写时都加到文件的尾端
    O_NONBLOCK<04000>;: 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
    O_NDELAY;;
    O_SYNC<010000>;: 使每次write都等到物理I/O操作完成。
    FASYNC<020000>;: 兼容BSD的fcntl同步操作
    O_DIRECT<040000>;: 直接磁盘操作标识
    O_LARGEFILE<0100000>;: 大文件标识
    O_DIRECTORY<0200000>;: 必须是目录
    O_NOFOLLOW<0400000>;: 不获取连接文件
    O_NOATIME<01000000>;: 暂无
    当新创建一个文件时,需要指定mode 参数,以下说明的格式如宏定义名称<实际常数值>;: 描述。
    S_IRWXU<00700>;:文件拥有者有读写执行权限
    S_IRUSR (S_IREAD)<00400>;:文件拥有者仅有读权限
    S_IWUSR (S_IWRITE)<00200>;:文件拥有者仅有写权限
    S_IXUSR (S_IEXEC)<00100>;:文件拥有者仅有执行权限
    S_IRWXG<00070>;:组用户有读写执行权限
    S_IRGRP<00040>;:组用户仅有读权限
    S_IWGRP<00020>;:组用户仅有写权限
    S_IXGRP<00010>;:组用户仅有执行权限
    S_IRWXO<00007>;:其他用户有读写执行权限
    S_IROTH<00004>;:其他用户仅有读权限
    S_IWOTH<00002>;:其他用户仅有写权限
    S_IXOTH<00001>;:其他用户仅有执行权限
       Linux驱动编程书籍大多数都是介绍怎样用户态下怎么访问硬件设备,由于项目的需要,本人做了内核态下访问设备文件的方法,现在把程序拿出来和大家分享一下,希望对刚入门的朋友有所帮助。
       在我的《内核模块调用驱动》中给出了简单的字符设备文件程序,可以作为本文的驱动对象,在此,我就不多介绍了。调用驱动程序的模块如下:
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/stat.h>
    #include <linux/fs.h>
    #include <asm/unistd.h>
    #include <asm/uaccess.h>
    #include <linux/types.h>
    #include <linux/ioctl.h>
    #include "chardev.h"
    MODULE_LICENSE("GPL");
    //#define __KERNEL_SYSCALLS__
    #define bao "/dev/baovar"
    static char buf1[20];
    static char buf2[20];
    static int __init testmod_init(void)
    {
    mm_segment_t old_fs;
    ssize_t result;
    ssize_t ret;
    sprintf(buf1,"%s","baoqunmin");
    struct file *file=NULL;
    file=filp_open(bao,O_RDWR,0);
    if(IS_ERR(file)) goto fail0;
    old_fs=get_fs();
    set_fs(get_ds());
    ret=file->f_op->write(file,buf1,sizeof(buf1),&file->f_pos);
    result=file->f_op->read(file,buf2,sizeof(buf2),&file->f_pos);
    if(result>=0){buf2[20]='/n';printk("buf2-->%s/n",buf2);}
    else printk("failed/n");
    result=file->f_op->ioctl(file,buf2,sizeof(buf2),&file->f_pos);
    result=file->f_op->read(file,buf2,sizeof(buf2),&file->f_pos);
    set_fs(old_fs);
       filp_close(file,NULL);
     printk("file loaded/n");
        return 0;
    fail0:{filp_close(file,NULL);printk("load failed/n");}
    return 1;
    }
    static void __exit testmod_cleanup(void)
    {
     
        printk("module exit....................................................../n");
    }
    module_init(testmod_init);
    module_exit(testmod_cleanup);
    以上是完整的程序,直接可以编译运行。
    #include "chardev.h"头文件定义如下,此头文件也必须在驱动中包含!
    #include <linux/ioctl.h>
    #define BAO_IOCTL 't'
    #define IOCTL_READ  _IOR(BAO_IOCTL, 0, int)
    #define IOCTL_WRITE  _IOW(BAO_IOCTL, 1, int)
    #define BAO_IOCTL_MAXNR 1
    以下给出了我的Makefile文件:
    CC=gcc
    MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include
    test.o :test.c
     $(CC) $(MODCFLAGS) -c test.c
     echo insmod test.o to turn it on
     echo rmmod test to turn it off
     echo
    1.先加载设备驱动,我的设备文件为bao,
    2.再make以上文件
    3./sbin/insmod test.o加载模块
    4.dmesg 查看运行结果
    5./sbin/rmmod test
    6.卸载加载的驱动
    我在Linux red hat 9.0下成功运行
    我实现的只是在模块间对驱动程序的调用,可以说是这是一个最简单的例子。

     

    展开全文
  • 在开发板上测试的时候,通过串口打印出来的信息发现,内核一直停在了filp_open()函数这,之后的代码都不能执行,filp_open()函数的参数没有问题,急求各路大神解救!!!!!
  • 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写...在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),ge
  • 在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() filp_close(), vfs_read() vfs_write(),set_fs(),get_fs()等,这些函数在linux/fs.h和asm/uaccess.h头文件中声明。...
  • linux内核sys_open源代码分析

    千次阅读 2016-03-13 21:41:35
    打开一个文件,是通过内核提供的系统调用sys_open来实现的,在用户空间的open函数会被编译器编译成为int 80的汇编代码,进入内核空间执行打开操作,我们来顺着内核的代码来看一下具体的实现过程。 sys_open函数定义...
  • 详解sys_open

    千次阅读 2017-11-19 10:59:03
    系统调用sys_creat仅仅是对sys_open函数的简单封装。 只有当参数filename为相对路径时,参数dfd才有意义,表示文件filename存在于文件描述符dfd所表示的目录之下。当dfd的值为AT_FDCWD时,则表示该文件位于
  • 从应用程序的角度来看,这是通过标准库的open函数完成的,该函数返回一个文件描述符。内核中是由系统调用sys_open()函数完成。 [cpp] view plain copy  print? /*sys_open*/  SYSCALL_...
  • sys_open()代码分析

    千次阅读 2011-12-30 17:02:59
    sys_open()源代码分析 应用程序在操作任何一个文件之前,必须先调用open()来打开该文件,即通知内核新建一个代表该文件的结构,并且返回该文件的描述符(一个整数),该描述符在进程内唯一。open()的格式如下: int ...
  • 内核空间 访问 用户空间 flip_open

    千次阅读 2013-05-27 20:29:40
    内核空间 访问 用户空间 flip_open, 简单历程,可以作为调试手段。 本例程每隔一段时间往sdcard目录下的指定文件写入内容 #include #include #include #include #include #include #include #include ...
  • Author: sinister Email:  sinister@whitecell.org ...本笔记对 linux kernel 的文件系统操作以及设备操作进行了分析,主要是针对 ext3 文件系统的 open 流程的分析,目的是为了解答心中的几个疑问: 1、一个文
  • walk() -> walk_component() -> lookup_fast() -> __d_lookup_rcu() -> d_hash() 先计算‘home’的hash,从hash表中找到这个’home’对应的dentry: 对于路径上的每一个dentry指向的inode,要检查是否有可执行权限X,...
  • static struct file *do_filp_open(int dfd, const char *filename, int flags,  int mode) {  int namei_flags, error; // 注意这是结构而不是指针  struct nameidata nd;  namei_flags = flags;  if ((namei_...
  • filp_open()、 filp_close()、vfs_read() 、vfs_write()、set_fs(),get_fs()等,声明在linux/fs.h和asm/uaccess.h头文件中。 1. 打开文件 kernel中打开文件可以使用filp_open(): strcut file* filp_open(const ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,628
精华内容 1,051
关键字:

filp_open权限问题