Linux字元驅動程式的基本結構與函式

Quartz010發表於2016-10-16

基本的函式與結構

函式

//驅動註冊,登出函式
module_init(void (*func));
module_exit(void (*func));

這兩個函式,將會在執行insmod和rmmod時對傳入的函式進行回撥。

intregister_chrdev(unsignedintmajor,constchar*name,
struct file_operations*fops);

其中引數major如果等於0,則表示採用系統動態分配的主裝置號;不為0,則表示靜態註冊。

int unregister_chrdev(unsignedintmajor,constchar*name);

登出字元裝置可以使用unregister_chrdev函式。

//開啟檔案
int open(const char *pathname, int flags, mode_t mode);

//讀取檔案到buf
int read(int fd, const void *buf, size_t length);

//寫buf到檔案
int write(int fd, const void *buf, size_t length);

//ioctl是裝置驅動程式中對裝置的I/O通道進行管理的函式
//用於應用函式到驅動程式的傳參
int ioctl(int fd, ind cmd, …); 

結構

struct file_operations {
    struct module *owner;

    ssize_t (*read)(struct file *,charchar *, size_t, 
    loff_t *);
    //從裝置同步讀取資料  

    ssize_t (*write)(struct file *,const charchar *, 
    size_t, loff_t *);  
    //向裝置同步寫入資料

    int (*ioctl) (struct  inode *,  struct file *, 
    unsigned int,  unsigned long);
    //執行裝置IO控制命令  

    int (*open) (struct inode *, struct file *);
    //開啟  
    ...
}

應用程式函式與驅動程式函式的關係

當在應用程式中用open開啟某個裝置時,在file_operations 結構體的open指向的成員函式,將會被回撥;相應的,read,write,ioctl等函式都會如此的呼叫。

相關文章