1. 程式人生 > >嵌入式Linux驅動開發(一)一個簡單的Linux核心模組框架

嵌入式Linux驅動開發(一)一個簡單的Linux核心模組框架

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int __init mod_init(void)
{
    return 0;
}

static void __exit mod_exit(void)
{
    printk("cleanup module\n");
}
module_init(mod_init);
module_exit(mod_exit);
  • 二、函式

    1. static int __init mod_init(void)
      這個函式是函式的入口,也就是說核心在載入這個模組的時候會去呼叫這個函式。
    2. static void __exit mod_exit(void)
      模組被解除安裝的時候會呼叫這個函式
    3. module_init(mod_init);
      這個函式的作用是為核心模組指定一個入口,在載入核心模組的時候就會呼叫這個函式的引數對應的函式,也就說第一個函式並不是預設的函式入口,它是我們自己定義的函式的入口,使用 module_init() 這個函式來指定我們自定義的核心模組載入入口
    4. module_exit
      作用同上,指定核心模組被解除安裝的時候呼叫的函式
  • 三、關鍵字
    1. static
      在核心中的函式非常多,我們為我們自己的函式命名很可能就會和Linux其他牛人的重名,這就會導致在編譯的時候會報重定義,所以我們就在這加上 staitc 關鍵字來修飾,來避免和其他函式重名的情況,從ANSI C的角度出發,這就會導致這個函式不能被外部檔案呼叫,而我們知道,Linux 其實是一個巨集核心,也就是說核心中的所有函式之間都是直接呼叫的,而我們這裡這樣定義會導致其他檔案不能呼叫這個函式,那怎麼辦呢?其實不用擔心,因為版本比較新一點的編譯器已經為我們解決了這個問題,編譯器在編譯的時候就會幫我們處理這個問題,使得被 static 關鍵字修飾的函式能被外部檔案呼叫。
    2. __init
      這個修飾詞是兩個下劃線加上init( _ _ init),Linux效率非常高,其中一個原因就來與它對記憶體的管理可以說是十分”吝嗇”,static int __init mod_init(void)這個函式其實只是在載入的時候需要,在載入完成之後就沒有必要讓它繼續佔用記憶體了,我們可以使用 __init來修飾它,使得它在完成自己的使命後不再佔用記憶體