日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译

發布時間:2024/3/24 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要講解什么是Linux內核,以及通過多張圖片展示Linux內核的作用、功能及基本編程方法,以便于讀者能快速理解什么是Linux內核,能看懂Linux內核。

擁有超過1300萬行的代碼,Linux內核是世界上最大的開源項目之一,但是內核是什么,它用于什么?

一、什么是linux內核模塊?

內核是與計算機硬件接口的易替換軟件的最低級別。它負責將所有以“用戶模式”運行的應用程序連接到物理硬件,并允許稱為服務器的進程使用進程間通信(IPC)彼此獲取信息。

Linux內核與硬件的關系

內核可以通過所謂的中斷來管理系統的硬件。?當硬件要與系統接口時,會發出一個中斷,中斷處理器,從而對內核執行相同的操作。?為了提供同步,內核可以禁用中斷,無論是單個中斷還是全部中斷。?但是,在Linux中,中斷處理程序不是在進程上下文中運行,而是在不與任何進程相關聯的中斷上下文中運行,這種特殊的中斷上下文僅是為了讓中斷處理程序快速響應單個中斷然后最終退出而存在 。

linux內核整體非常龐大,包含組件特別多,當我們把需要的部分包含到內核中,直接把需要的所有功能都編譯到內核中會導致內核很大,而且當需要新增或者刪除功能,又要重新編譯,非常麻煩,因此linux提供了模塊(Modele)的機制。

可以把內核比喻成一個很長的火車,每個車廂就是一個內核模塊,內核在運行這個火車就會一直在開動,但是我們想在火車開動的情況下增加新的車廂,這個時候就需要insmod,意思就是往這個長長的火車車廂增加一個內核模塊。

模塊的特點:不編譯入內核鏡像;一旦加載和內核其他部分完全一樣。

為了使讀者對模塊有個感性認知,先看一下簡單的HelloWorld模塊,代碼如下:

二、Linux內核模塊組成結構

一個Linux內核模塊主要由以下幾個部分組成。

1)模塊加載函數(必須)

當通過 insmod 或 modprobe命令加載內核模塊時,模塊的加載函數會自動被內核執行,完成本模塊的相關初始化工作。模塊加載函數一般以__init標識聲明

static int __init FuntionA(void)

{

}

module_init( FuntionA);

2)模塊卸載函數(必須)

當通過 rmmod 命令卸載某模塊時,模塊的卸載函數會自動被內核執行,完成與模塊加載函數相反的功能。 模塊卸載函數一般以__exit標識聲明:

static void __exit ?FuntionB(void)

{

}

module_exit( FuntionB );

通常來說,模塊卸載函數要完成與模塊加載函數相反的功能,如下所示。

a)若模塊加載函數注冊了XXX,則模塊卸載函數應該注銷XXX。

b)若模塊加載函數動態申請了內存,則模塊卸載函數應釋放該內存。

c)若模塊加載函數申請了硬件資源(中斷,DMA通道,I/O端口和I/O內存等)的占用,則模塊卸載函數應釋 ??放這些硬件資源。

d)若模塊加載函數開啟了硬件,則卸載函數中一般要關閉硬件。

3)模塊許可證聲明(必須)

模塊許可證(LICENSE)聲明描述內核模塊的許可權限,如果不聲明 LICENSE,模塊被加載時,將收到內核被污染的警告。大多數情況下,內核模塊應遵循GPL 兼容許可權。

Linux2.6 內核模塊最常見的是以MODULE_LICENSE(“Dual BSD/GPL”)語句聲明模塊采用BSD/GPL 雙LICENSE

4)模塊參數(可選)是模塊被加載的時候可以被傳遞給它的值,它本身對應模塊內部的全局變量

用“module_param(參數名,參數類型,參數讀/寫權限)”為模塊定義一個參數

例如: module_param(num,int,S_IRUGO);

5)模塊導出符號(可選)可以導出符號(symbol,對應于函數或變量),這樣其它模塊可以使用本模塊中的變量或函數

可以使用如下宏導出符號到內核符號表:

EXPORT_SYMBOL(符號名);

EXPORT_SYMBOL_GPL(符號名);

6)模塊作者等信息聲明(可選)

我們可以使用MODULE_AUTHOR,MODULE_DESCRIPTION,MODULE_VERSION,MODULE_DEVICE_TABLE,MODULE_ALLAS

分別聲明模塊的作者,描述,版本,設備表和別名

例如:

MODULE_AUTHOR(author);

MODULE_DESCRIPTION(description);

三、Linux內核模塊的編譯

首先為HelloWorld模塊編寫MakeFile文件

該MakeFile文件應該與源碼位于同一目錄

在Makefile中,在obj-m := helloworld.o這句中,.o的文件名要與編譯的.c文件名一致。

如果一個模塊包含多個.c文件(如file1.c、file2.c)則應該使用如下方式編寫MakeFile:

Obj -m :=modulename.o

Modulename -obj :-file1.o file2.o

KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)指示當前linux系統內核的源碼位置。

1.在Makefile及helloworld.c所在目錄下,直接make,成功后查看當前目錄下有無helloworld.ko文件產生,有則內核模塊生成成功。

2.使用insmod命令,把此內核模塊程序加載到內核中運行。結合lsmod及管道命令,查看內核模塊程序在內核中是否正確運行。

四、總結

本文主要講解了linux內核模塊的概念和基本編程方法、內核模塊組成結構,由于linux設備驅動以內核模塊的形式存在,因此了解本文內容是編寫任何設備驅動的必需。

總結

以上是生活随笔為你收集整理的LINUX内核模块上下文,飞凌嵌入式知识分享-Linux内核模块编译的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。