久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      linux有內(nèi)核文件操作函數(shù)嗎

      linux有內(nèi)核文件操作函數(shù),例filp_open()函數(shù)可用于打開(kāi)文件、vfs_read()函數(shù)可用于讀取文件、vfs_write()函數(shù)可用于寫(xiě)文件、filp_close()函數(shù)可用于關(guān)閉文件。在vfs_read和vfs_write函數(shù)中,其第二個(gè)參數(shù)指向的用戶(hù)空間的內(nèi)存地址,如果直接使用內(nèi)核空間的指針,則會(huì)返回“-EFALUT”。

      linux有內(nèi)核文件操作函數(shù)嗎

      本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。

      1. 內(nèi)核空間文件操作

      功能 函數(shù)原型
      打開(kāi)文件 struct file *filp_open(const char *filename, int flags, int mode)
      讀文件 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
      寫(xiě)文件 ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
      關(guān)閉文件 int filp_close(struct file *filp, fl_owner_t id)

      2. 內(nèi)核空間與用戶(hù)空間

      在vfs_read和vfs_write函數(shù)中,其參數(shù)buf指向的用戶(hù)空間的內(nèi)存地址,如果我們直接使用內(nèi)核空間的指針,則會(huì)返回-EFALUT。這是因?yàn)槭褂玫木彌_區(qū)超過(guò)了用戶(hù)空間的地址范圍。一般系統(tǒng)調(diào)用會(huì)要求你使用的緩沖區(qū)不能在內(nèi)核區(qū)。這個(gè)可以用set_fs()、get_fs()來(lái)解決。

      include/asm/uaccess.h中,有如下定義:

      #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })  #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)  #define USER_DS MAKE_MM_SEG(PAGE_OFFSET)  #define get_ds() (KERNEL_DS)  #define get_fs() (current->addr_limit)  #define set_fs(x) (current->addr_limit = (x))
      登錄后復(fù)制

      如果使用,如下:

      mm_segment_t fs = get_fs();  set_fs(KERNEL_FS);  //vfs_write();  vfs_read();  set_fs(fs);
      登錄后復(fù)制

      詳盡解釋:系統(tǒng)調(diào)用本來(lái)是提供給用戶(hù)空間的程序訪問(wèn)的,所以,對(duì)傳遞給它的參數(shù)(比如上面的buf),它默認(rèn)會(huì)認(rèn)為來(lái)自用戶(hù)空間,在read或write()函數(shù)中,為了保護(hù)內(nèi)核空間,一般會(huì)用get_fs()得到的值來(lái)和USER_DS進(jìn)行比較,從而防止用戶(hù)空間程序“蓄意”破壞內(nèi)核空間;而現(xiàn)在要在內(nèi)核空間使用系統(tǒng)調(diào)用,此時(shí)傳遞給read或write()的參數(shù)地址就是內(nèi)核空間的地址了,在USER_DS之上(USER_DS ~ KERNEL_DS),如果不做任何其它處理,在write()函數(shù)中,會(huì)認(rèn)為該地址超過(guò)了USER_DS范圍,所以會(huì)認(rèn)為是用戶(hù)空間的“蓄意破壞”,從而不允許進(jìn)一步的執(zhí)行;為了解決這個(gè)問(wèn)題set_fs(KERNEL_DS)將其能訪問(wèn)的空間限制擴(kuò)大到KERNEL_DS,這樣就可以在內(nèi)核順利使用系統(tǒng)調(diào)用了!

      3.Linux struct inode結(jié)構(gòu)

      /*索引節(jié)點(diǎn)對(duì)象由inode結(jié)構(gòu)體表示,定義文件在linux/fs.h中 */ struct inode {         struct hlist_node       i_hash;              /* 哈希表 */         struct list_head        i_list;              /* 索引節(jié)點(diǎn)鏈表 */         struct list_head        i_dentry;            /* 目錄項(xiàng)鏈表 */         unsigned long           i_ino;               /* 節(jié)點(diǎn)號(hào) */         atomic_t                i_count;             /* 引用記數(shù) */         umode_t                 i_mode;              /* 訪問(wèn)權(quán)限控制 */         unsigned int            i_nlink;             /* 硬鏈接數(shù) */         uid_t                   i_uid;               /* 使用者id */         gid_t                   i_gid;               /* 使用者id組 */         kdev_t                  i_rdev;              /* 實(shí)設(shè)備標(biāo)識(shí)符 */         loff_t                  i_size;              /* 以字節(jié)為單位的文件大小 */         struct timespec         i_atime;             /* 最后訪問(wèn)時(shí)間 */         struct timespec         i_mtime;             /* 最后修改(modify)時(shí)間 */         struct timespec         i_ctime;             /* 最后改變(change)時(shí)間 */         unsigned int            i_blkbits;           /* 以位為單位的塊大小 */         unsigned long           i_blksize;           /* 以字節(jié)為單位的塊大小 */         unsigned long           i_version;           /* 版本號(hào) */         unsigned long           i_blocks;            /* 文件的塊數(shù) */         unsigned short          i_bytes;             /* 使用的字節(jié)數(shù) */         spinlock_t              i_lock;              /* 自旋鎖 */         struct rw_semaphore     i_alloc_sem;         /* 索引節(jié)點(diǎn)信號(hào)量 */         struct inode_operations *i_op;               /* 索引節(jié)點(diǎn)操作表 */         struct file_operations  *i_fop;              /* 默認(rèn)的索引節(jié)點(diǎn)操作 */         struct super_block      *i_sb;               /* 相關(guān)的超級(jí)塊 */         struct file_lock        *i_flock;            /* 文件鎖鏈表 */         struct address_space    *i_mapping;          /* 相關(guān)的地址映射 */         struct address_space    i_data;              /* 設(shè)備地址映射 */         struct dquot            *i_dquot[MAXQUOTAS]; /* 節(jié)點(diǎn)的磁盤(pán)限額 */         struct list_head        i_devices;           /* 塊設(shè)備鏈表 */         struct pipe_inode_info  *i_pipe;             /* 管道信息 */         struct block_device     *i_bdev;             /* 塊設(shè)備驅(qū)動(dòng) */         unsigned long           i_dnotify_mask;      /* 目錄通知掩碼 */         struct dnotify_struct   *i_dnotify;          /* 目錄通知 */         unsigned long           i_state;             /* 狀態(tài)標(biāo)志 */         unsigned long           dirtied_when;        /* 首次修改時(shí)間 */         unsigned int            i_flags;             /* 文件系統(tǒng)標(biāo)志 */         unsigned char           i_sock;              /* 可能是個(gè)套接字吧 */         atomic_t                i_writecount;        /* 寫(xiě)者記數(shù) */         void                    *i_security;         /* 安全模塊 */         __u32                   i_generation;        /* 索引節(jié)點(diǎn)版本號(hào) */         union {                 void            *generic_ip;         /* 文件特殊信息 */         } u; };  /* *索引節(jié)點(diǎn)的操作inode_operations定義在linux/fs.h中 */ struct inode_operations {         int (*create) (struct inode *, struct dentry *,int);         /*VFS通過(guò)系統(tǒng)調(diào)用create()和open()來(lái)調(diào)用該函數(shù),從而為dentry對(duì)象創(chuàng)建一個(gè)新的索引節(jié)點(diǎn)。在創(chuàng)建時(shí)使用mode制定初始模式*/         struct dentry * (*lookup) (struct inode *, struct dentry *);         /*該韓式在特定目錄中尋找索引節(jié)點(diǎn),該索引節(jié)點(diǎn)要對(duì)應(yīng)于dentry中給出的文件名*/         int (*link) (struct dentry *, struct inode *, struct dentry *);         /*該函數(shù)被系統(tǒng)調(diào)用link()電泳,用來(lái)創(chuàng)建硬連接。硬鏈接名稱(chēng)由dentry參數(shù)指定,連接對(duì)象是dir目錄中l(wèi)d_dentry目錄想所代表的文件*/         int (*unlink) (struct inode *, struct dentry *);         /*該函數(shù)被系統(tǒng)調(diào)用unlink()調(diào)用,從目錄dir中刪除由目錄項(xiàng)dentry制動(dòng)的索引節(jié)點(diǎn)對(duì)象*/         int (*symlink) (struct inode *, struct dentry *, const char *);         /*該函數(shù)被系統(tǒng)電泳symlik()調(diào)用,創(chuàng)建符號(hào)連接,該符號(hào)連接名稱(chēng)由symname指定,連接對(duì)象是dir目錄中的dentry目錄項(xiàng)*/         int (*mkdir) (struct inode *, struct dentry *, int);         /*該函數(shù)被mkdir()調(diào)用,創(chuàng)建一個(gè)新魯姆。創(chuàng)建時(shí)使用mode制定的初始模式*/         int (*rmdir) (struct inode *, struct dentry *);         /*該函數(shù)被系統(tǒng)調(diào)用rmdir()調(diào)用,刪除dir目錄中的dentry目錄項(xiàng)代表的文件*/         int (*mknod) (struct inode *, struct dentry *, int, dev_t);         /*該函數(shù)被系統(tǒng)調(diào)用mknod()調(diào)用,創(chuàng)建特殊文件(設(shè)備文件、命名管道或套接字)。要?jiǎng)?chuàng)建的文件放在dir目錄中,其目錄項(xiàng)問(wèn)dentry,關(guān)聯(lián)的設(shè)備為rdev,初始權(quán)限由mode指定*/         int (*rename) (struct inode *, struct dentry *,                        struct inode *, struct dentry *);         /*VFS調(diào)用該函數(shù)來(lái)移動(dòng)文件。文件源路徑在old_dir目錄中,源文件由old_dentry目錄項(xiàng)所指定,目標(biāo)路徑在new_dir目錄中,目標(biāo)文件由new_dentry指定*/         int (*readlink) (struct dentry *, char *, int);         /*該函數(shù)被系統(tǒng)調(diào)用readlink()調(diào)用,拷貝數(shù)據(jù)到特定的緩沖buffer中??截惖臄?shù)據(jù)來(lái)自dentry指定的符號(hào)鏈接,最大拷貝大小可達(dá)到buflen字節(jié)*/         int (*follow_link) (struct dentry *, struct nameidata *);         /*該函數(shù)由VFS調(diào)用,從一個(gè)符號(hào)連接查找他指向的索引節(jié)點(diǎn),由dentry指向的連接被解析*/         int (*put_link) (struct dentry *, struct nameidata *);         /*在follow_link()調(diào)用之后,該函數(shù)由vfs調(diào)用進(jìn)行清楚工作*/         void (*truncate) (struct inode *);         /*該函數(shù)由VFS調(diào)用,修改文件的大小,在調(diào)用之前,索引節(jié)點(diǎn)的i_size項(xiàng)必須被設(shè)置成預(yù)期的大小*/         int (*permission) (struct inode *, int);         /*該函數(shù)用來(lái)檢查給低昂的inode所代表的文件是否允許特定的訪問(wèn)模式,如果允許特定的訪問(wèn)模式,返回0,否則返回負(fù)值的錯(cuò)誤碼。多數(shù)文件系統(tǒng) 都將此區(qū)域設(shè)置為null,使用VFS提供的通用方法進(jìn)行檢查,這種檢查操作僅僅比較索引及誒但對(duì)象中的訪問(wèn)模式位是否和mask一致,比較復(fù)雜的系統(tǒng), 比如支持訪問(wèn)控制鏈(ACL)的文件系統(tǒng),需要使用特殊的permission()方法*/         int (*setattr) (struct dentry *, struct iattr *);         /*該函數(shù)被notify_change調(diào)用,在修改索引節(jié)點(diǎn)之后,通知發(fā)生了改變事件*/         int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *);         /*在通知索引節(jié)點(diǎn)需要從磁盤(pán)中更新時(shí),VFS會(huì)調(diào)用該函數(shù)*/         int (*setxattr) (struct dentry *, const char *,                          const void *, size_t, int);         /*該函數(shù)由VFS調(diào)用,向dentry指定的文件設(shè)置擴(kuò)展屬性,屬性名為name,值為value*/         ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);         /*該函數(shù)被VFS調(diào)用,向value中拷貝給定文件的擴(kuò)展屬性name對(duì)應(yīng)的數(shù)值*/         ssize_t (*listxattr) (struct dentry *, char *, size_t);         /*該函數(shù)將特定文件所有屬性別表拷貝到一個(gè)緩沖列表中*/         int (*removexattr) (struct dentry *, const char *);         /*該函數(shù)從給定文件中刪除指定的屬性*/ };
      登錄后復(fù)制

      4.Linux struct file結(jié)構(gòu)
      struct file結(jié)構(gòu)體定義在/linux/include/linux/fs.h(Linux 2.6.11內(nèi)核)中,其原型是:

      struct file {         /*          * fu_list becomes invalid after file_free is called and queued via          * fu_rcuhead for RCU freeing          */         union {                 struct list_head        fu_list;                 struct rcu_head         fu_rcuhead;         } f_u;         struct path             f_path; #define f_dentry        f_path.dentry #define f_vfsmnt        f_path.mnt         const struct file_operations    *f_op;         atomic_t                f_count;         unsigned int            f_flags;         mode_t                  f_mode;         loff_t                  f_pos;         struct fown_struct      f_owner;         unsigned int            f_uid, f_gid;         struct file_ra_state    f_ra;         unsigned long           f_version; #ifdef CONFIG_SECURITY         void                    *f_security; #endif         /* needed for tty driver, and maybe others */         void                    *private_data; #ifdef CONFIG_EPOLL         /* Used by fs/eventpoll.c to link all the hooks to this file */         struct list_head        f_ep_links;         spinlock_t              f_ep_lock; #endif /* #ifdef CONFIG_EPOLL */         struct address_space    *f_mapping; };
      登錄后復(fù)制

      文 件結(jié)構(gòu)體代表一個(gè)打開(kāi)的文件,系統(tǒng)中的每個(gè)打開(kāi)的文件在內(nèi)核空間都有一個(gè)關(guān)聯(lián)的struct file。它由內(nèi)核在打開(kāi)文件時(shí)創(chuàng)建,并傳遞給在文件上進(jìn)行操作的任何函數(shù)。在文件的所有實(shí)例都關(guān)閉后,內(nèi)核釋放這個(gè)數(shù)據(jù)結(jié)構(gòu)。在內(nèi)核創(chuàng)建和驅(qū)動(dòng)源碼 中,struct file的指針通常被命名為file或filp。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)