1. 程式人生 > >linux 核心程式設計之proc虛擬檔案系統

linux 核心程式設計之proc虛擬檔案系統

在 Linux 系統中,/proc 檔案系統十分有用,它被用於核心向用戶匯出資訊。/proc 檔案系統是一個虛擬檔案系統,通過它可以使用一種新的方法在 Linux 核心空間和使用者空間之間進行通訊。在/proc 檔案系統中,我們可以將對虛擬檔案的讀寫作為與核心中實體進行通訊的一種手段,與普通檔案不同的是,這些虛擬檔案的內容都是動態建立的。Linux 系統的許多命令本身都是通過分析/proc 下的檔案來完成,如 ps、top、uptime 和 free等。
在 Linux 裝置驅動程式中,驅動工程師自定義/proc 節點以向外界傳遞資訊的方法還是比較常見的。

下列函式用於建立/proc 目錄:
struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);
下列函式建立/proc 節點:
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data);
結合 create_proc_entry()和 proc_mkdir(),可用於先在/proc 下建立一個目錄,而後在該目錄下建立一個檔案。
可用如下函式刪除/proc 節點:
void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
上述函式各返回值的 proc_dir_entry 結構體中包含了/proc 節點的讀函式指標(read_proc_t*read_proc)、寫函式指標(write_proc_t *write_proc)以及父節點、子節點資訊等。/proc 節點的讀寫函式的型別分別為:
typedef int (read_proc_t)(char *page, char **start, off_t off,int count, int *eof, void *data);
typedef int (write_proc_t)(struct file *file, const char __user *buffer,unsigned long count, void *data);
這兩函式需要我們來實現。
讀函式中 page 指標指向用於寫入資料的緩衝區,start 用於返回實際的資料寫到記憶體頁的位置,eof 是用於返回讀結束標誌,offset 是讀的偏移,count 是要讀的資料長度。start 引數比較複雜,對於/proc 只包含簡單資料的情況,通常不需要在讀函式中設定*start,意味著核心將認為資料儲存在記憶體頁偏移 0 的地方。如果將*start 設定為非 0 值,意味著核心將認為*start 指向的資料是 offset 偏移處的資料。寫函式與 file_operations 中的 write()成員類似,需要一次從使用者緩衝區到記憶體空間的複製過程。
下面給一個示例,該示例只是簡單的在/proc目錄下建立一個資料夾和檔案,使用者可以在使用者態向該檔案寫入檔案,並讀出檔案內容。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

#define USER_ROOT_DIR   "slndir"
#define USER_ENTRY      "slnfile"

struct proc_dir_entry    *root_dir, *entry;
char                    kbuff[1024];

static int proc_write(struct file *filep, const char __user *buffer,
        unsigned long len, void *data)
{
    if (copy_from_user(kbuff, buffer, len)) {
        return -1;
    }

    kbuff[len] = '\0';
    return len;
}

static int proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
    int     len;

    len = sprintf(page, "%s", kbuff);

    return len;
}

static int __init sln_init(void)
{
    printk("Hello, %s\n", __func__);

    root_dir = proc_mkdir(USER_ROOT_DIR, NULL);
    if (NULL == root_dir) {
        printk("proc_mkdir create dir %s failed!\n", USER_ROOT_DIR);
        return -1;
    }

    entry = create_proc_entry(USER_ENTRY, 0666, root_dir);
    if (NULL == entry) {
        printk("create_proc_entry create entry %s failed\n", USER_ENTRY);
        goto err;
    }

    entry->read_proc = proc_read;
    entry->write_proc = proc_write;
    return 0;

err:
    remove_proc_entry(USER_ROOT_DIR, NULL);
    return -1;
}

static void __exit sln_exit(void)
{
    printk("Bye, %s\n", __func__);

    remove_proc_entry(USER_ENTRY, root_dir);
    remove_proc_entry(USER_ROOT_DIR, NULL);
}

module_init(sln_init);
module_exit(sln_exit);

MODULE_LICENSE("GPL");


相關推薦

linux 核心程式設計proc虛擬檔案系統

在 Linux 系統中,/proc 檔案系統十分有用,它被用於核心向用戶匯出資訊。/proc 檔案系統是一個虛擬檔案系統,通過它可以使用一種新的方法在 Linux 核心空間和使用者空間之間進行通訊。在/proc 檔案系統中,我們可以將對虛擬檔案的讀寫作為與核心中實體進行

linux核心設計與實現——虛擬檔案系統

虛擬檔案系統 虛擬檔案系統(有時也稱作虛擬檔案交換,更常見的是簡稱VFS)作為核心子系統,為使用者空間程式提供了檔案和檔案系統相關的介面。 之所以可以使用這種通用介面對所有型別的檔案系統進行操作,是因為核心在它的底層檔案系統介面上建立了一個VFS抽象層,該抽

深入理解Linux核心個人小結12---虛擬檔案系統

一.  綜述:       虛擬檔案系統(VFS):是一個核心軟體層,用來處理與Unix檔案系統相關的所有系統呼叫;可看作是一個通用的檔案系統,必要時可以依賴某種具體的檔案系統呼叫其底層函式。      快取記憶體的種類:       1.  硬體快取記憶體: 一個快速的靜

Linux 核心程式設計檔案系統(二)

1.為了方便查詢,VFS引入了 目錄 項,每個dentry代表路徑中的一個特定部分。目錄項也可包括安裝點。 2.目錄項物件由dentry結構體表示 ,定義在檔案linux/dcache.h 標頭檔案中。   89struct dentry {  90        atomic_t d_count;     

Linux核心通訊---proc檔案系統(詳解)

使用 /proc 檔案系統來訪問 Linux 核心的內容,這個虛擬檔案系統在核心空間和用戶空間之間打開了一個通訊視窗: /proc 檔案系統是一個虛擬檔案系統,通過它可以使用一種新的方法在 Linux核心空間和使用者間之間進行通訊。在 /proc 檔案系統中,我

例說linux核心與應用資料通訊(二):proc虛擬檔案系統

下面是一個簡單使用proc的示例,應用上面傳入資料,核心經過處理之後,應用再獲取經過處理的資料:#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <

Linux核心原始碼情景分析-特殊檔案系統/proc

    由於proc檔案系統並不物理地存在於任何裝置上,它的安裝過程是特殊的。對proc檔案系統不能直接通過mount()來安裝,而要先由系統核心在核心初始化時自動地通過一個函式kern_mount()安裝一次,然後再由處理系統初始化的程序通過mount()安裝,實際上是"重

Linux | proc虛擬檔案系統

在安裝新硬體到 Linux 系統之前,你會想要知道當前系統的資源配置狀況。 Linux 將這類資訊全集中在 /proc 檔案系統下。/proc 目錄下的檔案都是 Linux 核心虛擬出來的,當你讀取它們是,核心會實時提供檔案內容。藉由/proc,我們可得知

Linux套接字與虛擬檔案系統(1):初始化和建立

引言    在Unix的世界裡,萬物皆檔案,通過虛擬檔案系統VFS,程式可以用標準的Unix系統呼叫對不同的檔案系統,甚至不同介質上的檔案系統進行讀寫操作。對於網路套接字socket也是如此,除了專屬的Berkeley Sockets API,還支援一些標準的檔案IO系統呼叫如read(v)、w

Linux套接字與虛擬檔案系統(2):操作和銷燬

   接上篇初始化與建立,本篇闡述Socket操作和銷燬兩部分的實現。 Socket操作    系統呼叫read(v)、write(v)是使用者空間讀寫socket的一種方法,為了弄清楚它們是怎麼通過VFS將請求轉發到特定協議的實現,下面以read為例(write同理),並假定檔案描述

linux下使用kpartx掛載虛擬檔案系統

linux下使用kpartx掛載虛擬檔案系統在linux中,如果映像檔案(.img)含有分割槽表的話,那麼用losetup這個程式來載入檔案系統就有點力不從心了。因為losetup只能載入無分割槽的檔案

Linux C程式設計IO-檔案拷貝

Linux C程式設計:IO 1.1檔案拷貝 本次檔案拷貝需要使用到如下三個函式原型: 開啟檔案 FILE * fopen(const char * path,const char * mode); 相關函式:open,fclose,fopen_

linux核心程式設計核心定時器

如果我們需要在將來某個時間點排程執行某個動作,同時在該時間點到達之前不會阻塞當前程序,可以使用核心定時器。核心定時器可用來在未來的某個特定時間點排程執行某個函式,從而可用於完成許多工。 Linux 核心所提供的用於操作定時器的資料結構和函式(位於 <linux/ti

LINUX核心設計與實現虛擬檔案系統

VFS作為核心子系統,為使用者空間程式提供了檔案系統的操作介面.VFS是使用者空間到具體檔案系統(如EXT3)的一個介面中間層. 12.1 通用檔案系統介面 VFS最大的意義就是使用使用者空間可以直接使用open()、read()和write()等等函式而不需要考慮具體的

Linux核心設計與實現》讀書筆記(十三)- 虛擬檔案系統

虛擬檔案系統(VFS)是linux核心和具體I/O裝置之間的封裝的一層共通訪問介面,通過這層介面,linux核心可以以同一的方式訪問各種I/O裝置。 虛擬檔案系統本身是linux核心的一部分,是純軟體的東西,並不需要任何硬體的支援。 主要內容: 虛擬檔案系統的作用 虛擬檔案系統的4個主要物件

linux核心與使用者之間的通訊方式——虛擬檔案系統、ioctl以及netlink .

本文嘗試去闡述核心與使用者空間之間的通訊介面:虛擬檔案系統、ioctl以及netlink.文中所有的結構及程式碼全來自於Linux kernel 2.6.34. 一、虛擬檔案系統       proc檔案系統,通常是掛載在/proc,允許核心以檔案型別形式向用戶提供內部資

Linux虛擬檔案系統核心初始化)

這部分主要對linux虛擬檔案系統核心初始化部分做些補充。 關於shrinker,inode和dentry cache初始化階段都需要註冊自己的shrinker,用於縮減cache。兩個操作原理類似。 shrinker資料結構介紹 /* * A callback you

linux核心與使用者之間的通訊方式——虛擬檔案系統、ioctl以及netlink

    本文嘗試去闡述核心與使用者空間之間的通訊介面:虛擬檔案系統、ioctl以及netlink.文中所有的結構及程式碼全來自於Linux kernel 2.6.34. 一、虛擬檔案系統       proc檔案系統,通常是掛載在/proc,允許核心以檔案型別形式向用戶

Linux核心學習筆記(一) 虛擬檔案系統VFS

什麼是VFS Vritual Filesystem 是給使用者空間程式提供統一的檔案和檔案系統訪問介面的核心子系統。藉助VFS,即使檔案系統的型別不同(比如NTFS和ext3),也可以實現檔案系統之間互動(移動、複製檔案等), 從使用者空間程式的角度來看,

Linux虛擬檔案系統(強烈推薦)

1 引言 Linux 中允許眾多不同的檔案系統共存,如 ext2, ext3, vfat 等。通過使用同一套檔案 I/O 系統 呼叫即可對 Linux 中的任意檔案進行操作而無需考慮其所在的具體檔案系