1. 程式人生 > >Linux核心模組程式設計-proc檔案系統

Linux核心模組程式設計-proc檔案系統

什麼是proc

proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊,如程序,是動態改變的,所以使用者或應用程式讀取proc檔案時,proc檔案系統是動態從系統核心讀出所需資訊並提交的。

來自於百度百科

使用proc在核心態和使用者態傳遞資料

建立proc的條目

通過核心提供的API,可以很方便的在proc目錄下建立一個檔案

create_proc_entry
通過這個函式就可以建立一條proc檔案或者目錄,返回的是一個struct proc_dir_entry結構
這個函式有三個引數:
1.
proc條目的名稱 2.proc條目的許可權 3.要建立的proc條目的根目錄,如果為NULL,那麼就是相對於/proc這個目錄來建立

核心模組的初始化,建立proc entry

struct proc_dir_entry *Our_Proc_File;
int init_module(void)
{
    int rv = 0;
    //建立了一個形如/proc/test1 許可權是0644
    Our_Proc_File = create_proc_entry("test1",0644,NULL);
    //設定對proc條目讀取的方法和許可權,uid,gid size等資訊。
    Our_Proc_File->
read_proc = procfile_read; Our_Proc_File->mode = S_IFREG | S_IRUGO; Our_Proc_File->uid = 0; Our_Proc_File->gid = 0; Our_Proc_File->size = 37; //大小可以隨便設定,proc檔案是不佔用大小的 printk(KERN_INFO "Trying to craete /proc/test1:\n"); if(Our_Proc_File == NULL) { rv = -ENOMEM; remove_proc_entry("test1"
,NULL);//移除proc條目 printk(KERN_INFO "Error: Could not initialize /proc/test1\n"); } else { printk(KERN_INFO "Success!\n"); } return rv; }

登出核心模組,移除proc entry

void cleanup_module(void)
{
    remove_proc_entry("test1",NULL);
    printk(KERN_INFO "/proc/test1 removed\n");
}

操作proc

在建立proc entry的時候,指定了讀proc的方法,其實現如下:

//proc檔案讀,函式原型是固定的,參考proc_dir_entry這個結構體即可
int procfile_read(char *buffer,char** buffer_location,off_t offset,
                int buffer_length,int *eof,void *data)
{
    int len = 0;
    static int count = 1;
    printk(KERN_INFO "inside /proc/test1 :procfile_read\n");

    if(offset > 0) {
        printk(KERN_INFO "offset %d: /proc/test1: profile_read,\
            wrote %d Bytes\n",(int)(offset),len);
        *eof = 1;
        return len;
    }
    //填充buffer並獲取其長度
    len = sprintf(buffer,
             "For the %d %s time,go away!\n",count,
              (count % 100 > 10 && count % 100 < 14)?"th":
              (count % 10 == 1)?"st":
              (count % 10 == 2)?"nd":
              (count % 10 == 3)?"rd":"th");
    count++;
    printk(KERN_INFO "leasving /proc/test1: profile_read,wrote %d Bytes\n",len);
    return len;
}

測試proc

insmod procfs.ko //插入核心模組
[root@localhost kernel_module]# ls -al /proc/test1 
-r--r--r--. 1 root root 37 Apr 26 10:37 /proc/test1
[root@localhost kernel_module]# cat /proc/test1 
For the 1 st time,go away!

相關推薦

Linux核心模組程式設計-proc檔案系統

什麼是proc proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊,如程序,是動態改變的,所以使用

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

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

Linux核心模組程式設計(列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID)

(1) 設計一個模組,要求列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID。 1.首先,我們開始編寫模組程式碼,這是Linux核心程式設計的核心程式碼,程式碼如下: #include <linux/init.h&

Linux核心模組程式設計

Linux核心模組程式設計 (作者:Baron_wu 禁止轉載) 首先,建立一個核心模組並插入Linux核心中。這是實驗第一部分 首先檢視當前核心模組使用情概況:lsmod Module:模組名 Size:模組大小 Used by:這些模組在哪被使用 接下來編寫一個simple.c

linux 核心模組程式設計之LED驅動程式(六)

我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下   LED1 LED2 LED3 LED4

linux 核心模組程式設計核心符號匯出(五)

/proc/kallsyms 記錄了核心中所有匯出的符號的名字與地址 我們需要編譯2個核心模組,然後其中一個核心模組去呼叫另一個核心模組中的函式 hello.c程式碼如下 #include <linux/module.h> #include <linux/in

linux 核心模組程式設計模組引數(四)

通過巨集module_param指定模組引數,模組引數用於在載入模組時傳遞給模組。 module_param(name, type, perm) name是模組引數的名字 type是這個引數的型別,常見值:bool、int、charp(字串型) perm是模組

linux 核心模組程式設計之編譯多個原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

linux 核心模組程式設計之hello word(二)

我們的目的是要編譯個hello.ko的檔案,然後安裝到核心中。 先來看下需要的程式碼,hello.c檔案如下 #include <linux/module.h> #include <linux/init.h> static int hello_init(vo

linux 核心模組程式設計之環境搭建(一)

這裡介紹些關於Tiny6410開發板核心的編譯,為後期驅動開發做前期的準備。 開發環境:64位的Ubuntu 14.01虛擬機器 目標機:友善之臂Tiny6410開發板 核心:linux-2.6.38-20110325.tar.gz 核心原始碼下載地址 htt

Linux核心模組程式設計——Hello World

一、實驗環境: 環境配置:VMware® Workstation 15 Pro、ubuntu Desktop 18.10、記憶體 2GB、處理器數量2、每個處理器核心數量1、硬碟大小30GB……還有一個就是用的咱Xidian的源(因為校內不需要流量啊,而且還很快!) 二、知識儲備

Linux核心模組程式設計系列1

1.準備工作 使用如下命令檢視自己Linux的核心版本 uname -a 結果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Lin

Linux核心中的Proc檔案系統(一)

(1)/proc檔案系統的特點和/proc檔案的說明/proc檔案系統是一種特殊的、由軟體建立的檔案系統,核心使用它向外界匯出資訊,/proc系統只存在記憶體當中,而不佔用外存空間。/proc下面的每個

Linux核心移植和根檔案系統製作(詳細步驟精講)

start_kernel是所有 Linux 平臺進入系統核心初始化後的入口函式,它主要完成剩餘的與硬體平臺相關的初始化工作,在進行一系列與核心相關的初始化後,呼叫第一個使用者程序-init 程序並等待使用者程序的執行,這樣整個 Linux 核心便啟動完畢。該函式所做的具體工作有:呼叫 setup_arch

linux 核心模組程式設計

一個linux核心模組主要由以下幾個部分組成。 1、模組載入函式"用module_init()來指定"(必須)    當通過insmod和modprobe命令載入核心模組時,模組的載入函式會自動被核心執行,完成本模組的相關初始化工作。 linux模組載入函式一般以 __init表示宣告。典型宣告如下:: s

關於UBOOT,LINUX核心編譯,根檔案系統的15個弱智問題(轉)

(1)核心預設執行地址和載入地址在哪裡設定? (2)從FLASH什麼地址找核心和根檔案系統,UBOOT在哪裡設定? (3)啟動時UBOOT將根檔案系統和核心拷貝到RAM中何處在哪裡設定? (4)UBOOT 如何知道核心與根檔案系統的格式和大小? (5)核心啟動引數在編譯UBOOT時候哪裡指定? (6)核心

Linux核心模組程式設計——hello,world

檔案hello.c(放在目錄/root/lnq/modules/hello下): #include<linux/kernel.h> #include<linux/module.h

Linux核心模組程式設計核心模組LICENSE -《詳解(第3版)》預讀

Linux核心模組簡介Linux核心的整體結構已經非常龐大,而其包含的元件也非常多。我們怎樣把需要的部分都包含在核心中呢?一種方法是把所有需要的功能都編譯到Linux核心。這會導致兩個問題,一是生成的核心會很大,二是如果我們要在現有的核心中新增或刪除功能,將不得不重新編譯核心

Linux核心映象及根檔案系統製作

一、系統開發平臺介紹    本次試驗是基於九鼎創展公司嵌入式開發板x210v3, 核心處理器是ARM Cortex–A8架構的S5PV210,主頻1GHz。  PC機Linux版本:Ubuntu Kylin 14.04  核心版本:3.13 二、Linux核心配置和編譯 2

Linux核心模組程式設計-字元裝置驅動

裝置驅動簡介 裝置被大概的分為兩類: 字元裝置和塊裝置。 字元裝置 提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,鍵盤、串列埠、調變解調器都是典型的字元裝置。 塊裝置 應用程式可以隨機