日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

如何在linux内核中读写文件

發布時間:2025/3/17 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在linux内核中读写文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在VFS的支持下,用戶態進程讀寫任何類型的文件系統都可以使用read和write著兩個系統調用,但是在linux內核中沒有這樣的系統調用我們如何操作文件呢?我們知道read和write在進入內核態之后,實際執行的是sys_read 和sys_write,但是查看內核源代碼,發現這些操作文件的函數都沒有導出(使用EXPORT_SYMBOL導出),也就是說在內核模塊中是不能使用的,那如何是好?

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

功能
函數原型

打開文件
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)

關閉文件
int filp_close(struct file *filp, fl_owner_t id)

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

  • mm_segment_t fs = get_fs();
  • set_fs(KERNEL_FS);
  • //vfs_write();
  • vfs_read();
  • set_fs(fs);
  • 下面為一個在內核中對文件操作的例子:

  • #include
  • #include
  • #include
  • #include
  • static char buf[] = "你好";
  • static char buf1[10];
  • int __init hello_init(void)
  • {
  • struct file *fp;
  • mm_segment_t fs;
  • loff_t pos;
  • printk("hello enter/n");
  • fp = filp_open("/home/niutao/kernel_file", O_RDWR | O_CREAT, 0644);
  • if (IS_ERR(fp)) {
  • printk("create file error/n");
  • return -1;
  • }
  • fs = get_fs();
  • set_fs(KERNEL_DS);
  • pos = 0;
  • vfs_write(fp, buf, sizeof(buf), &pos);
  • pos = 0;
  • vfs_read(fp, buf1, sizeof(buf), &pos);
  • printk("read: %s/n", buf1);
  • filp_close(fp, NULL);
  • set_fs(fs);
  • return 0;
  • }
  • void __exit hello_exit(void)
  • {
  • printk("hello exit/n");
  • }
  • module_init(hello_init);
  • module_exit(hello_exit);
  • MODULE_LICENSE("GPL");
  • 轉載于:https://www.cnblogs.com/shaoguangleo/archive/2010/10/03/2805855.html

    總結

    以上是生活随笔為你收集整理的如何在linux内核中读写文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。