一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

在linux內(nèi)核中讀寫文件(轉(zhuǎn))

 埕絮妞 2013-03-29

在VFS的支持下,用戶態(tài)進(jìn)程讀寫任何類型的文件系統(tǒng)都可以使用read和write著兩個(gè)系統(tǒng)調(diào)用,但是在linux內(nèi)核中沒(méi)有這樣的系統(tǒng)調(diào)用我們?nèi)绾尾僮魑募??我們知道read和write在進(jìn)入內(nèi)核態(tài)之后,實(shí)際執(zhí)行的是sys_read和sys_write,但是查看內(nèi)核源代碼,發(fā)現(xiàn)這些操作文件的函數(shù)都沒(méi)有導(dǎo)出(使用EXPORT_SYMBOL導(dǎo)出),也就是說(shuō)在內(nèi)核模塊中是不能使用的,那如何是好?

通過(guò)查看sys_open的源碼我們發(fā)現(xiàn),其主要使用了do_filp_open()函數(shù),該函數(shù)在fs/namei.c中,而在改文件中,filp_open函數(shù)也是調(diào)用了do_filp_open函數(shù),并且接口和sys_open函數(shù)極為相似,調(diào)用參數(shù)也和sys_open一樣,并且使用EXPORT_SYMBOL導(dǎo)出了,所以我們猜想該函數(shù)可以打開(kāi)文件,功能和open一樣。使用同樣的查找方法,我們找出了一組在內(nèi)核中操作文件的函數(shù),如下:

功能 函數(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)
寫文件 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)

我們注意到在vfs_read和vfs_write函數(shù)中,其參數(shù)buf指向的用戶空間的內(nèi)存地址,如果我們直接使用內(nèi)核空間的指針,則會(huì)返回-EFALUT。所以我們需要使用
set_fs()和get_fs()宏來(lái)改變內(nèi)核對(duì)內(nèi)存地址檢查的處理方式,所以在內(nèi)核空間對(duì)文件的讀寫流程為:

  1. mm_segment_t fs = get_fs();
  2. set_fs(KERNEL_FS);
  3. //vfs_write();
  4. vfs_read();
  5. set_fs(fs);

下面為一個(gè)在內(nèi)核中對(duì)文件操作的例子:

  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/fs.h>
  4. #include <linux/uaccess.h>
  5. static char buf[] = "你好";
  6. static char buf1[10];
  7.  
  8. int __init hello_init(void)
  9. {
  10.     struct file *fp;
  11.     mm_segment_t fs;
  12.     loff_t pos;
  13.     printk("hello enter\n");
  14.     fp = filp_open("/home/niutao/kernel_file", O_RDWR | O_CREAT, 0644);
  15.     if (IS_ERR(fp)) {
  16.         printk("create file error\n");
  17.         return -1;
  18.     }
  19.     fs = get_fs();
  20.     set_fs(KERNEL_DS);
  21.     pos = 0;
  22.     vfs_write(fp, buf, sizeof(buf), &pos);
  23.     pos = 0;
  24.     vfs_read(fp, buf1, sizeof(buf), &pos);
  25.     printk("read: %s\n", buf1);
  26.     filp_close(fp, NULL);
  27.     set_fs(fs);
  28.     return 0;
  29. }
  30. void __exit hello_exit(void)
  31. {
  32.     printk("hello exit\n");
  33. }
  34.  
  35. module_init(hello_init);
  36. module_exit(hello_exit);
  37.  
  38. MODULE_LICENSE("GPL");

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    中文字幕日韩一区二区不卡| 欧洲自拍偷拍一区二区| 国产精品欧美一区二区三区| 办公室丝袜高跟秘书国产 | 欧美精品在线播放一区二区| 99免费人成看国产片| 99久久精品国产日本| 人妻亚洲一区二区三区| 国产一区一一一区麻豆| 免费高清欧美一区二区视频| 美女被草的视频在线观看| 亚洲一区在线观看蜜桃| 中文字幕日产乱码一区二区| 黑人巨大精品欧美一区二区区| 亚洲成人免费天堂诱惑| 少妇人妻一级片一区二区三区| 黄片三级免费在线观看| 国产精品色热综合在线| 日韩精品一区二区亚洲| 国产成人精品国产亚洲欧洲| 国产亚洲精品香蕉视频播放| 精品熟女少妇一区二区三区| 伊人天堂午夜精品草草网| 亚洲中文在线男人的天堂| 综合久综合久综合久久| 视频在线播放你懂的一区| 国产成人精品午夜福利av免费| 日韩精品亚洲精品国产精品| 欧美日韩国产精品自在自线| 精品欧美日韩一区二区三区| 青青操视频在线播放免费| 日韩精品人妻少妇一区二区| 日韩中文字幕狠狠人妻| 在线免费视频你懂的观看| 国产午夜精品福利免费不| 99香蕉精品视频国产版| 欧美日韩国产一级91| 日韩1区二区三区麻豆| 99免费人成看国产片| 国产不卡一区二区四区| 欧美日韩精品一区免费|