亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

Linux內核模塊和驅動的編寫

添加時間:2016-5-4 17:35:15  添加: 思海網絡 
  Linux內核是一個整體是結構,因此向內核添加任何東西,或者刪除某些功能,都十分困難。為了解決這個問題引入了內核機制。從而可以動態的想內核中添加或者刪除模塊。 
  模塊不被編譯在內核中,因而控制了內核的大小.然而模塊一旦被插入內核,他就和內核其他部分一樣.這樣一來就會曾家一部分系統開銷。同時,如果模塊出現問題,也許會帶來系統的崩潰。
  模塊的實現機制:
  啟動時,由函數 void inti_modules() 來初始化模塊,因為啟動事很多時候沒有模塊.這個函數往往把內核自身當作一個虛模塊。
  如由系統需要,則調用一系列以sys 開頭的函數,對模塊進行操作. 如:
  sys_creat_modules(),sys_inti_modules() , 
  sys_deldte_modules()等等.
  這里會用到一些模塊的數據就結構,在/usr/scr/Linux/include/Linux/module.h 中,有興趣的朋友可以找出來一看塊的加入有兩種方法:一是手動加入:如:insmod modulename.另一種是根據需要,動態的加載模塊:如你執行命令:
  $mount -t msdos /dev/hdd /mnt/d 時.系統便自動加載 FAT模塊,以支持MSDOS的文件系統。
  1.模塊編程
  寫一個模塊,必須有一定的多進程編程基礎,因為你變得程序不是以一個獨立的程序的來運行的。另外,因為,模塊需要在內核模式下運行,會遇到在內和空間和用戶空間數據交換的問題.一般的數據復制函數無法完成這一個過程。因此系統已入了一些特殊的函數以用來完成內核空間和用戶空間數據的交換/
  這些函數有:void put _user (type valude,type *u_addr)
  memcpy_tofs()
  等等,有興趣的朋友可以仔細的看看所有的函數,以及他們的用法.需要說明的是.模塊編程河內核的版本有很大的關系。如果版本不通可能造成,內核模塊不能編譯,或者.在運行這個模塊時,出現不可測結果。如:系統崩潰等。
  明白了這些以后,你就可以嘗試著編寫內核模塊了。對于每一個內核模塊來說,必定包含兩個函數int init_module() 這個函數在插入內核時啟動,在內核中注冊一定的功能函數,或者用他的代碼代替內和中某些函數的內容(估計這些函數是空的)。因此,內和可以安全的卸載。
  int cleanup_module() 當內核模塊謝載時,調用.將模塊從內核中清除.
  同其他的程序設計教程一樣 ,我們給出一個hello world 的例子
/*hello.c a module programm*/
/* the program runing under kernel mod and it is a module*/
#include" Linux/kernerl.h"
#include"lLinux/module.h"
/* pross the CONFIG_MODVERSIONS*/
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include""Linux/modversions.h"
#end if
/* the init function*/
int init_module()
{
printk(" hello world !\n');
printd(" I have runing in a kerner mod@!!\n");
return 1;
}
/* the distory function*/
int cleanup_module()
{
printk(" I will shut down myself in kernerl mod /n)";
retutn 0;
 
  這樣一個例子就完成了.我們也寫一個makefile 的例子,以適于我們在大程序重的應用。一下是makfile 文件的內容 。
# a makefile for a module
CC=gcc
MODCFLAGS:= -Wall _DMODULE -D_KERNEL_ -DLinux
hello.o hello.c /usr/inculde?Linux/version.h
CC $(MODCFLAGS) 0c hello.c
echo the module is complie completely 
 
  然后你運行make 命令 得到hello.o 這個模塊,運行
$insmod hello.o
hello world!
I will shut down myself in kernerl mod
$lsmod
hello (unused)
….
$remmod
I will shut down myself in kernerl mod 
 
  這樣你的模塊就可以隨意的插入和刪除了。
  Linux中的大部分驅動程序,是以模塊的形式編寫的,這些驅動程序源碼可以修改到內核中,也可以把他們編譯成模塊形勢,在需要的時候動態加載。
  一個典型的驅動程序,大體上可以分為這么幾個部分:
  1.注冊設備
  在系統初啟,或者模塊加載時候,必須將設備登記到相應的設備數組,并返回設備的主驅動號,例如:對快設備來說調用 refister_blkdec()將設備添加到數組blkdev中,并且獲得該設備號,并利用這些設備號對此數組進行索引。對于字符驅動設備來說,要使用 module_register_chrdev()來獲得祝設備的驅動號,然后對這個設備的所有調用都用這個設備號來實現。
  2.定義功能函數
  對于每一個驅動函數來說,都有一些和此設備密切相關的功能函數,那最常用的塊設備或者字符設備來說,都存在著諸如 open() read() write() ioctrol()這一類的操作。當系統社用這些調用時,將自動的使用驅動函數中特定的模塊,來實現具體的操作。而對于特定的設備,上面的系統調用對應的函數是一定的。
  如:在塊驅動設備中.當系統試圖讀取這個設備(即調用read()時),就會運行驅動程序中的block_read() 這個函數。
  打開新設備時會調用這個設備驅動程序的device_open() 這個函數.



  3.謝載模塊
  在不用這個設備時,可以將他卸載,主要是從/proc 中取消這個設備的特殊文件,可用特定的函數實現。
  下面我們列舉一個字符設備驅動程序的框架.來說明這個過程.
/* a module of a character device */
/* some include files*/
#include"param.h"
#include"user.h"
#include"tty.h"
#include"dir.h"
#include”fs.h"
/* the include files modules need*/
#include"Linux/kernel.h"
#include"Linux/module.h"
#if CONFIG_MODBERSIONS==1
degine MODBERSIONS
#include" Linux.modversions.h"
#endif
#difine devicename mydevice
/* the init funcion*/
int init_module()
{
int tag=module_register_chrdev(0,mydevice,&Fops);
if (tag<0)
{
printk("the device init is erro!\n");
return 1;
}
return 0;
}
/*the funcion which the device will be used */
int device_open ()
{
…….
}
int device_read ()
{
…….
}
int device_write ()
{
…….
}
int device_ioctl ()
{
…….
}
……
/* the deltter function of this module*/
int cleanup_module()
{
int re=module_unregister_chrdev(tag,mydevice);
if( re<0)
{
printk("erro unregister the module !!\n");
return 1;
}
return 0;
 
關鍵字:Linux、內核模塊、驅動
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站