国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux驅(qū)動(dòng)1:入口與出口、頭文件路徑、makefile編譯

這篇具有很好參考價(jià)值的文章主要介紹了Linux驅(qū)動(dòng)1:入口與出口、頭文件路徑、makefile編譯。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

Linux 驅(qū)動(dòng)兩種運(yùn)行方式

字符設(shè)備驅(qū)動(dòng)框架

1、創(chuàng)建目錄和編寫文件

2、添加頭文件路徑

3、Makefile編寫和解釋

4、編譯測(cè)試


Linux 驅(qū)動(dòng)兩種運(yùn)行方式

第一種就是將驅(qū)動(dòng)編譯進(jìn) Linux 內(nèi)核中,這樣當(dāng) Linux 內(nèi)核啟動(dòng)的時(shí)候就會(huì)自動(dòng)運(yùn)行驅(qū)動(dòng)程序;

第二種就是將驅(qū)動(dòng)編譯成模塊(Linux 下模塊擴(kuò)展名為.ko),在Linux 內(nèi)核啟動(dòng)以后使用“insmod”命令加載驅(qū)動(dòng)模塊。

在調(diào)試驅(qū)動(dòng)的時(shí)候一般都選擇將其編譯為模塊,這樣修改驅(qū)動(dòng)以后只需要編譯一下驅(qū)動(dòng)代碼即可,不需要編譯整個(gè) Linux 代碼,而且在調(diào)試的時(shí)候只需要加載或者卸載驅(qū)動(dòng)模塊即可,不需要重啟整個(gè)系統(tǒng)。

將驅(qū)動(dòng)編譯為模塊最大的好處就是方便開發(fā),當(dāng)驅(qū)動(dòng)開發(fā)完成,確定沒(méi)有問(wèn)題以后就可以將驅(qū)動(dòng)編譯進(jìn)Linux 內(nèi)核中,當(dāng)然也可以不編譯進(jìn) Linux 內(nèi)核中,具體看自己的需求。

模塊有加載和卸載兩種操作,在編寫驅(qū)動(dòng)的時(shí)候需要注冊(cè)這兩種操作函數(shù),模塊的加載和卸載注冊(cè)函數(shù),如下

module_init(xxx_init);
module_exit(xxx_exit);
//注冊(cè)模塊加載函數(shù)
//注冊(cè)模塊卸載函數(shù)

module_init 函數(shù)用來(lái)向 Linux 內(nèi)核注冊(cè)一個(gè)模塊加載函數(shù),參數(shù) xxx_init 就是需要注冊(cè)的具體函數(shù),當(dāng)使用“insmod”命令加載驅(qū)動(dòng)的時(shí)候, xxx_init 這個(gè)函數(shù)就會(huì)被調(diào)用。 module_exit()函數(shù)用來(lái)向 Linux 內(nèi)核注冊(cè)一個(gè)模塊卸載函數(shù),參數(shù) xxx_exit 就是需要注冊(cè)的具體函數(shù),當(dāng)使用“rmmod”命令卸載具體驅(qū)動(dòng)的時(shí)候 xxx_exit 函數(shù)就會(huì)被調(diào)用。

下面開始創(chuàng)建字符設(shè)備驅(qū)動(dòng)框架

字符設(shè)備驅(qū)動(dòng)框架

1、創(chuàng)建目錄和編寫文件

在IMX6ULL/Linux_Drivers創(chuàng)建目錄1_chrdevbase

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)
在vscode打開目錄并并創(chuàng)建chrdevbase.c文件,在chrdevbase.c文件輸入下面的代碼

#include <linux/module.h>

static int __int chrdevbase_init(void)
{
? ? return 0;
}

static void __exit chrdevbase_exit(void)
{
? ??
}

module_init(chrdevbase_init);
module_exit(chrdevbase_exit);

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

第 4 行,定義了個(gè)名為chrdevbase_init 的驅(qū)動(dòng)入口函數(shù),并且使用了“__init”來(lái)修飾
第 11?行,定義了個(gè)名為chrdevbase_exit 的驅(qū)動(dòng)出口函數(shù),并且使用了“__exit”來(lái)修飾
第 17?行,調(diào)用函數(shù) module_init 來(lái)聲明chrdevbase_init 為驅(qū)動(dòng)入口函數(shù)

????????????????當(dāng)加載驅(qū)動(dòng)的時(shí)候 chrdevbase_init函數(shù)就會(huì)被調(diào)用
第18行,調(diào)用函數(shù)module_exit來(lái)聲明chrdevbase_exit為驅(qū)動(dòng)出口函數(shù)

????????????????當(dāng)卸載驅(qū)動(dòng)的時(shí)候chrdevbase_exit函數(shù)就會(huì)被調(diào)用

2、添加頭文件路徑

這里需要給vscode頭文件添加路徑,因?yàn)槭蔷帉?Linux 驅(qū)動(dòng),因此會(huì)用到 移植在開發(fā)板上面的Linux 源碼中的函數(shù)。需要在 VSCode 中添加 Linux源碼中的頭文件路徑。打開 VSCode,按下“Crtl+Shift+P”打開 VSCode 的控制臺(tái),然后輸入“C/C++: Edit configurations(JSON) ”,打開 C/C++編輯配置文件,如下圖?所示
makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

?打開如下圖

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

需要將 Linux 源碼里面的頭文件路徑添加進(jìn)來(lái),也就是移植的 Linux 源碼中的頭文件路徑,分別是開發(fā)板所使用的 Linux 源碼下的 include、arch/arm/include 和 arch/arm/include/generated 這三個(gè)目錄的路徑,注意這里使用絕對(duì)路徑

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

添加頭文件路徑(7-8-9行)以后的 c_cpp_properties.json的文件內(nèi)容如下所示:

?"${workspaceFolder}/**",
? ? ? ? ? ? ? ? "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/include",
? ? ? ? ? ? ? ? "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/arch/arm/include",
? ? ? ? ? ? ? ? "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/arch/arm/include/generated/"

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

3、Makefile編寫和解釋

設(shè)置好路徑之后需要編譯測(cè)試,也就是將chrdevbase.c 這個(gè)文件編譯為.ko 模塊
創(chuàng)建Makefile,代碼如下:

KERNELDIR := /home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my

CURRENT_PATH := $(shell pwd)

obj-m := chrdevbase.o

build : kernel_modules

kernel_modules:
?? ?$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
?? ?$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)?第 1 行, KERNELDIR 表示開發(fā)板所用的 Linux 內(nèi)核源碼目錄,使用絕對(duì)路徑

????????????????根據(jù)自己的實(shí)際情況填寫

第 3?行, CURRENT_PATH 表示當(dāng)前路徑,直接通過(guò)運(yùn)行“pwd”命令來(lái)獲取當(dāng)前所處路徑

第 5?行, obj-m 表示chrdevbase.c 這個(gè)文件編譯為 chrdevbase.ko 外部可加載模塊

????????????????chrdevbase.c會(huì)先編譯成chrdevbase.o文件,再編譯成chrdevbase.ko文件

第 7 行,表示要編譯構(gòu)建的是模塊

第 9?行,編譯構(gòu)建模塊目標(biāo)

第 10?行,編譯構(gòu)建模塊目標(biāo)的具體編譯命令

????????????????$(MAKE),表示"make"命令,輸入make就執(zhí)行

????????????????-C 表示將當(dāng)前的工作目錄切換到指定目錄中,就是 KERNERLDIR 目錄,即第1行目錄

????????????????M 表示模塊源碼目錄,這是CURRENT_PATH,即編譯到第3行目錄

????????????????以后程序會(huì)自動(dòng)到指定的CURRENT_PATH目錄中讀取模塊的源碼并將其編譯為.ko 文件

????????????????“ modules ”與前面的“make”搭配,使用"make"命令即表示編譯成模塊

第 12 行,清理目標(biāo)

第 13 行,清理目標(biāo)的具體命令,清理工作目錄和指定的目錄,命令為"make clean"

這里的makfile不用指定編譯器,因已進(jìn)入到linux內(nèi)核中,?移植linux的時(shí)候中已指定好編譯器

4、編譯測(cè)試

輸入 “ make ”命令開始編譯?

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)?編譯完成之后,查看可以看到有“.ko”文件,并測(cè)試清理命令“ make clean”并重新查看一下

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

?可以看到編譯出來(lái)的也被刪除了,測(cè)試一下用16核編譯,命令“ make -j16”

makefile中添加頭文件,# IMX6ULL驅(qū)動(dòng),linux,arm開發(fā),arm,ubuntu,驅(qū)動(dòng)開發(fā)

?測(cè)試到此,說(shuō)明框架是可以成功編譯的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692622.html

到了這里,關(guān)于Linux驅(qū)動(dòng)1:入口與出口、頭文件路徑、makefile編譯的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • cpp文件編譯過(guò)程 makefile cmake

    cpp文件編譯過(guò)程 makefile cmake

    直接 gcc 沒(méi)有-o 的話出來(lái)的輸出exe文件沒(méi)有調(diào)試信息,相比-o的大小會(huì)小一點(diǎn),只有包含了調(diào)試信息文件才可以執(zhí)行 頭文件在編譯器的include目錄中,編譯時(shí) -I 指定庫(kù) 函數(shù)庫(kù)默認(rèn)路徑在編譯器的lib目錄中,編譯時(shí) -L指定目錄,-l 小寫L 指定庫(kù) 函數(shù)或者是在別的c與cpp文件中 靜態(tài)

    2024年02月08日
    瀏覽(25)
  • MDK Keil查看map文件及編譯占用內(nèi)存信息、函數(shù)入口地址

    MDK Keil查看map文件及編譯占用內(nèi)存信息、函數(shù)入口地址

    一、在哪里打開map文件查看 (1)第一種,在keil軟件下,雙擊你的工程名,map就會(huì)彈出 (2)第二種,點(diǎn)擊魔術(shù)棒,查看 Lis文件輸出的位置入口 我的在output...文件下,那我們工程的文件夾下,找到output 二、查看map文件信息 (1)函數(shù)定義的位置信息 如圖,這些你定義函數(shù)的

    2024年02月05日
    瀏覽(134)
  • makefile 編譯動(dòng)態(tài)鏈接庫(kù)使用(.so庫(kù)文件)

    makefile 編譯動(dòng)態(tài)鏈接庫(kù)使用(.so庫(kù)文件)

    動(dòng)態(tài)鏈接庫(kù):不會(huì)把代碼編譯到二進(jìn)制文件中,而是在運(yùn)行時(shí)才去加載, 好處是程序可以和庫(kù)文件分離,可以分別發(fā)版,然后庫(kù)文件可以被多處共享 動(dòng)態(tài)鏈接庫(kù) 動(dòng)態(tài):動(dòng)態(tài)加載 鏈接:二進(jìn)制文件和庫(kù)文件分離。 庫(kù) 庫(kù)文件 .so 新建一個(gè)文件TestSo 編譯一下 main.cpp 寫好之后我們

    2024年01月23日
    瀏覽(29)
  • 嵌入式Linux驅(qū)動(dòng)開發(fā)系列六:Makefile

    嵌入式Linux驅(qū)動(dòng)開發(fā)系列六:Makefile

    Makefile是什么? gcc hello.c -o hello gcc aa.c bb.c cc.c dd.c ... make工具和Makefile make和Makefile是什么關(guān)系? make工具:找出修改過(guò)的文件,根據(jù)依賴關(guān)系,找出受影響的相關(guān)文件,最后按照規(guī)則單獨(dú)編譯這些文件。 Makefile文件:記錄依賴關(guān)系和編譯規(guī)則。 必須要學(xué)精Makefile嗎? 怎么學(xué)習(xí)Makefi

    2024年02月13日
    瀏覽(24)
  • Makefile——Linux下C/C++編譯方法

    Makefile——Linux下C/C++編譯方法

    linux下常見的C語(yǔ)言項(xiàng)目相關(guān)的文件如下圖所示。 通常使用GCC來(lái)編譯C文件。編譯過(guò)程為 源文件.c文件 - 預(yù)編譯成.i文件 - 編譯成匯編語(yǔ)言.s - 匯編成.o文件 - 鏈接成可執(zhí)行文件 。編譯命令為gcc -參數(shù) .c -o 輸出文件名稱 預(yù)處理:將頭文件拷貝進(jìn).c文件內(nèi)容中,執(zhí)行預(yù)編譯命令。采

    2024年02月03日
    瀏覽(15)
  • linux | vscode | makefile | c++編譯和調(diào)試

    linux | vscode | makefile | c++編譯和調(diào)試

    簡(jiǎn)單介紹環(huán)境: vscode 、centos、 gcc、g++、makefile 簡(jiǎn)單來(lái)說(shuō)就是,寫好項(xiàng)目然后再自己寫makefile腳本實(shí)現(xiàn)編譯。所以看這篇博客的用戶需要了解gcc編譯的一些常用命令以及makefile語(yǔ)法。在網(wǎng)上看了很多教程,以及官網(wǎng)也看了很多次,最后自己一點(diǎn)多一點(diǎn)摸索,有的些許收獲。 首

    2024年02月15日
    瀏覽(16)
  • 【Linux】編譯器gcc | make | Makefile | 模擬進(jìn)度條 | gitee

    【Linux】編譯器gcc | make | Makefile | 模擬進(jìn)度條 | gitee

    目錄 1. 編譯器 gcc 1.1 背景知識(shí) 1.2 gcc如何完成 2.1 Makefile背景 2.2 Makefile原理 2.3 Makefile常用符號(hào) 3. 模擬倒計(jì)時(shí) 4. 模擬進(jìn)度條 5. 使用 git 命令行 5.1 安裝 git 5.2 創(chuàng)建項(xiàng)目下載到本地 5.3 推送本地代碼到遠(yuǎn)端倉(cāng)庫(kù) 1. 編譯器 gcc 1.1 背景知識(shí) 預(yù)處理(進(jìn)行宏替換) 編譯(生成匯編) 匯編

    2024年03月12日
    瀏覽(32)
  • 【嵌入式Linux】編譯應(yīng)用和ko內(nèi)核模塊Makefile使用記錄

    【嵌入式Linux】編譯應(yīng)用和ko內(nèi)核模塊Makefile使用記錄

    在Makefile中,變量的賦值可以使用以下幾種方式: = :最基本的賦值符號(hào),表示簡(jiǎn)單的延遲展開(lazy expansion)方式。變量的值將會(huì)在使用變量的時(shí)候進(jìn)行展開。 := :立即展開(immediate expansion)的賦值方式。變量的值在賦值的時(shí)候立即展開,并且在后續(xù)的使用中不再改變。

    2024年02月08日
    瀏覽(24)
  • Linux下gcc編譯,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),makefile,gdb調(diào)試

    Linux下gcc編譯,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),makefile,gdb調(diào)試

    展開頭文件, 宏替換(變量宏、函數(shù)宏)、替換空格等 逐行檢查程序中出現(xiàn)的語(yǔ)法錯(cuò)誤,簡(jiǎn)單的邏輯錯(cuò)誤 將 .s 匯編文件中所有的匯編指令翻譯成二進(jìn)制機(jī)器碼(下面就是來(lái)了個(gè)截圖,二進(jìn)制顯示了亂碼) 將 .o 的目標(biāo)文件,鏈接庫(kù)文件、數(shù)據(jù)段合并,地址回填(把匯編里相

    2024年02月08日
    瀏覽(52)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包