Linux驅動入門篇(一):Hello, world,入門篇hello

來源:互聯網
上載者:User

Linux驅動入門篇(一):Hello, world,入門篇hello

  學習Linux驅動有半年的時間了,但是臨近畢業,由於各種事務的耽誤,很多東西遺忘,現在寫此部落格以記錄重新學習的曆程。

 

  首先,自然是從最簡單的核心模組,Hello, world開始啦。

 1 #include <linux/init.h> 2 #include <linux/module.h> 3   4 static int __init hello_init(void) 5 { 6     printk(KERN_NOTICE "Hello, world."); 7     return 0; 8 } 9 10 static void __exit hello_exit(void)11 {12     printk(KERN_NOTICE "Goodbye, world.");13 }14 15 MODULE_LICENSE("GPL");16 module_init(hello_init);17 module_exit(hello_exit);
預備知識

  為了能理解這個核心模組,首先需要一些準備。

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

  所有的的核心模組代碼中都要包含這兩個標頭檔,它們是專門用於核心模組的。

  包含init.h檔案,可以指定初始化函數和清除函數;而module.h檔案內含有可裝載的模組需要的符號和函數定義。

初始化和清除
static int __init hello_init(void){    語句;}

  初始化函數不會被其他檔案引用,因此被聲明為static。但這不是強制的,因為一個模組函數要對核心其他部分可見,必須被顯式地匯出。

  __init標記表示該函數只在初始化時使用。在模組載入以後,模組裝載器會釋放初始化函數佔用的記憶體。

 

module_init(hello_init);

  此宏是強制使用的,用來說明初始化函數的位置。

 

static void __exit hello_exit(void){    語句;}

  清除函數和初始化函數一致,在模組移除的時候被調用,用來登出介面和向系統返回所有資源。

  若模組內嵌到核心,或核心不允許卸載此模組,被標記為 __exit 的函數將被丟棄。

 

module_exit(hello_exit);

  此宏是強制使用的,用來說明清除函數的位置。

 許可證
MODULE_LICENSE("GPL");

  指定該模組代碼使用的許可證。核心能識別"GPL"、"GPL v2"、"GPL and additional rights"、"Dual BSD/GPL"、 "Dual MPL/GPL"和"Proprietary"。若沒有指定,則核心假定它是"Proprietary"(專有)。

核心功能
 printk(KERN_NOTICE "Hello, world.");

  核心是不能依賴標準C庫的,自然核心相關的編程中也就不能使用 printf 函數。這時需要使用核心版本的列印函數 printk 。當模組串連到核心時,就可以訪問公用符號。

  KERN_NOTICE定義了這條核心訊息的優先順序。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.