1. 程式人生 > >關於字元驅動中的變數,巨集,標頭檔案等的簡介 module_init module_exit

關於字元驅動中的變數,巨集,標頭檔案等的簡介 module_init module_exit

 

ssize_t second_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) { }

這是一個檔案讀函式 

ssize_t是signed size_t,
size_t是標準C庫中定義的,應為unsigned int。
我們很容易看出輸入引數中 
file 是檔案 
buf 是檔案要讀到什麼地方去,使用者buf 
count是要讀多少東西 

那麼ppos是什麼東東,是當前檔案的偏移量嘛?? 
但是當前檔案的偏移量在filp中有定義呀。struct file { 
struct list_head f_list; 
struct dentry *f_dentry; 
struct vfsmount *f_vfsmnt; 
struct file_operations *f_op; 
atomic_t f_count; 
unsigned int f_flags; 
mode_t f_mode; 
loff_t

 f_pos;//這個就是當前檔案的偏移量,

struct file 中的f_pos是最後一次檔案操作以後的當前讀寫位置。而ppos是這次對檔案進行操作的起始位置,這兩個值不一定相等

 

 

module_init module_exit

像你寫C程式需要包含C庫的標頭檔案那樣,Linux核心程式設計也需要包含Kernel標頭檔案,大多的Linux驅動程式需要包含下面三個標頭檔案:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
    其中,init.h 定義了驅動的初始化和退出相關的函式,kernel.h 定義了經常用到的函式原型及巨集定義,module.h 定義了核心模組相關的函式、變數及巨集。

幾乎每個linux驅動都有個module_init(與module_exit的定義在Init.h (\include\linux) 中)。驅動的載入就靠它。

module_init除了初始化載入之外,還有後期釋放記憶體的作用。linux kernel中有很大一部分程式碼是裝置驅動程式碼,這些驅動程式碼都有初始化和反初始化函式,這些程式碼     linux就是這樣做的,對只需要初始化執行一次的函式都加上__init屬性,__init 巨集告訴編譯器如果這個模組被編譯到核心則把這個函式放到(.init.text)段,module_exit的引數解除安裝時同__init類似,如果驅動被編譯進核心,則__exit巨集會忽略清理函式,因為編譯進核心的模組不需要做清理工作,顯然__init和__exit對動態載入的模組是無效的,只支援完全編譯進核心。

像你寫C程式需要包含C庫的標頭檔案那樣,Linux核心程式設計也需要包含Kernel標頭檔案,大多的Linux驅動程式需要包含下面三個標頭檔案:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
    其中,init.h 定義了驅動的初始化和退出相關的函式,kernel.h 定義了經常用到的函式原型及巨集定義,module.h 定義了核心模組相關的函式、變數及巨集。

幾乎每個linux驅動都有個module_init(與module_exit的定義在Init.h (\include\linux) 中)。驅動的載入就靠它。

module_init除了初始化載入之外,還有後期釋放記憶體的作用。linux kernel中有很大一部分程式碼是裝置驅動程式碼,這些驅動程式碼都有初始化和反初始化函式,這些程式碼     linux就是這樣做的,對只需要初始化執行一次的函式都加上__init屬性,__init 巨集告訴編譯器如果這個模組被編譯到核心則把這個函式放到(.init.text)段,module_exit的引數解除安裝時同__init類似,如果驅動被編譯進核心,則__exit巨集會忽略清理函式,因為編譯進核心的模組不需要做清理工作,顯然__init和__exit對動態載入的模組是無效的,只支援完全編譯進核心。