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

歡迎訪問 生活随笔!

生活随笔

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

linux

[linux驱动]linux驱动模块

發(fā)布時間:2023/12/13 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [linux驱动]linux驱动模块 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一,內(nèi)核模塊的概念

經(jīng)常在內(nèi)核驅(qū)動代碼看到類似fs_init()等驅(qū)動初始化函數(shù),那么這個和module_init()函數(shù)的差別在哪里,宏定義__define_initcall(level,fn)對于內(nèi)核的初始化很重要,他指示編譯器在編譯的時候,將一系列初始化函數(shù)的起始地址值按照一定的順序放在一個section中。在內(nèi)核初始化段,do_initcalls() 將按順序從該section中以函數(shù)指針的形式取出這些函數(shù)的起始地址,來依次完成相應(yīng)的初始化。于內(nèi)核某些部分的初始化需要依賴于其他某些部分的初始化的完成,因此這個順序排列常常很重要

點擊打開鏈接

其中module_init()對應(yīng)的是如下的device_initcall(fn)

[cpp]?view plaincopy
  • 189?#define?core_initcall(fn)???????????????__define_initcall("1",fn,1)??
  • 190?#define?core_initcall_sync(fn)??????????__define_initcall("1s",fn,1s)??
  • 191?#define?postcore_initcall(fn)???????????__define_initcall("2",fn,2)??
  • 192?#define?postcore_initcall_sync(fn)??????__define_initcall("2s",fn,2s)??
  • 193?#define?arch_initcall(fn)???????????????__define_initcall("3",fn,3)??
  • 194?#define?arch_initcall_sync(fn)??????????__define_initcall("3s",fn,3s)??
  • 195?#define?subsys_initcall(fn)?????????????__define_initcall("4",fn,4)??
  • 196?#define?subsys_initcall_sync(fn)????????__define_initcall("4s",fn,4s)??
  • 197?#define?fs_initcall(fn)?????????????????__define_initcall("5",fn,5)??
  • 198?#define?fs_initcall_sync(fn)????????????__define_initcall("5s",fn,5s)??
  • 199?#define?rootfs_initcall(fn)?????????????__define_initcall("rootfs",fn,rootfs)??
  • 200?#define?device_initcall(fn)?????????????__define_initcall("6",fn,6)??
  • 201?#define?device_initcall_sync(fn)????????__define_initcall("6s",fn,6s)??
  • 202?#define?late_initcall(fn)???????????????__define_initcall("7",fn,7)??
  • 203?#define?late_initcall_sync(fn)??????????__define_initcall("7s",fn,7s)??
  • ??
  • 170?#define?__define_initcall(level,fn,id)?\??
  • 171?????????static?initcall_t?__initcall_##fn##id?__used?\??
  • 172?????????__attribute__((__section__(".initcall"?level?".init")))?=?fn??

  • ?二,內(nèi)核模塊和應(yīng)用程序之間的差別
    1,應(yīng)用程序可以使用一些庫函數(shù),而內(nèi)核模塊只能使用內(nèi)核其它模塊導(dǎo)出的一些函數(shù)
    2,處理錯誤的方式不一樣。
    3,應(yīng)用程序是從頭到尾執(zhí)行單個任務(wù),而模塊是預(yù)先注冊自己以便服務(wù)于將來某個請求。

    三,構(gòu)建內(nèi)核模塊
    構(gòu)建hello.ko模塊 obj-m := hello.o
    構(gòu)建module.ko模塊,并由兩個源文件生成(file1.c和file2.c)

    [cpp]?view plaincopy
  • obj-m?:=?module.o??
  • module-objs?:=?file1.o?file2.o??
  • ?
    四,模塊操作相關(guān)的命令
    insmod:裝載一個模塊
    modprobe:裝載一個模塊,同時檢查模塊是否引用了一些當前內(nèi)核不存在的符合,如果有,modprobe會在當前模塊搜索路徑中查找定義了這些符合的其它模塊并加載
    rmmod,卸載一個模塊。

    五,模塊之間的引用
    將一個模塊的函數(shù)或者變量導(dǎo)出讓其它模塊可以使用

    [cpp]?view plaincopy
  • EXPORT_SYMBOL(name);??
  • EXPORT_SYMBOL_GPL(name);??//導(dǎo)出的模塊只能被GPL許可證下的模塊使用??

  • 六,模塊參數(shù)
    insmod hello howmany=10 whom="Mom"
    在hello.c的驅(qū)動程序中

    ?

    ?

    [cpp]?view plaincopy
  • static?char*whom="world"??
  • static?int?howmany=1;??
  • module_param(howmany,int,S_IRUGO);??
  • module_param(whom,charp,S_IRUGO)
  • 轉(zhuǎn)載于:https://www.cnblogs.com/zhiliao112/p/4237209.html

    總結(jié)

    以上是生活随笔為你收集整理的[linux驱动]linux驱动模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。