色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在Petalinux創建Linux內核模塊?

YCqV_FPGA_EETre ? 來源:賽靈思中文社區論壇 ? 作者:付漢杰 ? 2021-03-02 11:10 ? 次閱讀

創建內核模塊

Petalinux可以幫助工程師簡化內核模塊的創建工作。在petalinux工程目錄下,使用命令“ petalinux-create -t modules --name --enable”,能創建Linux內核模塊,包括c源代碼文件,Makefile,Yocto的bb文件。相關文件放在目錄“ project-spec / meta-user / recipes-modules”中,目錄結構如下。

hankf@XSZGS4:~/proj/vcu-trd-2020.2-peta-qt/project-spec/meta-user/recipes-modules$ tree

.

└── linux-test-module

├── files

│ ├── COPYING

│ ├── linux-test-module.c

│ └── Makefile

├── linux-test-module.bb

└── README

2 directories, 5 files

Makefile

原始Makefile

原始的Makefile只支持一個源文件,內容如下:

obj-m := linux-module-module.o

MY_CFLAGS += -g -DDEBUG

ccflags-y += ${MY_CFLAGS}

SRC := $(shell pwd)

all:

$(MAKE) -C $(KERNEL_SRC) M=$(SRC)

modules_install:

$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install

clean:

rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c

rm -f Module.markers Module.symvers modules.order

rm -rf .tmp_versions Modules.symvers

原始的Makefile,支持模塊在內核源碼目錄外編譯。編譯的命令是“$(MAKE) -C $(KERNEL_SRC) M=$(SRC)”。其中-C選項將當前工作目錄轉移到指定的位置;KERNEL_SRC是Yocto/PetaLinux在文件components/yocto/layers/core/meta/classes/module.bbclass里定義的變量,指定了Linux內核源代碼目錄,一般是Petalinux工程目錄下的子目錄“build/tmp/work-shared/zynqmp-generic/kernel-source”。這樣編譯時先進入內核源代碼目錄,先執行其中的頂層Makefile。M是內核根目錄下的Makefile中使用的變量,讓make在構造modules目標之前返回到內核模塊源的代碼目錄。

Linux內核頂層Makefile關于M變量的代碼:

# Use make M=dir or set the environment variable KBUILD_EXTMOD to specify the

# directory of external module to build. Setting M= takes precedence.

ifeq ("$(origin M)", "command line")

KBUILD_EXTMOD := $(M)

endif

module.bbclass里定義的變量KERNEL_SRC的代碼:

python do_devshell_prepend () {

os.environ['CFLAGS'] = ''

os.environ['CPPFLAGS'] = ''

os.environ['CXXFLAGS'] = ''

os.environ['LDFLAGS'] = ''

os.environ['KERNEL_PATH'] = d.getVar('STAGING_KERNEL_DIR')

os.environ['KERNEL_SRC'] = d.getVar('STAGING_KERNEL_DIR')

os.environ['KERNEL_VERSION'] = d.getVar('KERNEL_VERSION')

os.environ['CC'] = d.getVar('KERNEL_CC')

os.environ['LD'] = d.getVar('KERNEL_LD')

os.environ['AR'] = d.getVar('KERNEL_AR')

os.environ['O'] = d.getVar('STAGING_KERNEL_BUILDDIR')

kbuild_extra_symbols = d.getVar('KBUILD_EXTRA_SYMBOLS')

if kbuild_extra_symbols:

os.environ['KBUILD_EXTRA_SYMBOLS'] = kbuild_extra_symbols

else:

os.environ['KBUILD_EXTRA_SYMBOLS'] = ''

}

語句“obj-m := linux-test-module.o”指示Kbuild將模塊編譯成Linux內核模塊文件linux-test-module.ko。

更多信息可以參考相關文檔,比如深入理解 Linux 配置/構建系統是如何工作的,LINUX內核編譯學習筆記, Linux 內核模塊編譯 Makefile, Linux 2.6內核Makefile淺析。

多源文件Makefile

如果有多個源文件,也可以學習Linux內核模塊的Makefile寫法,使Petalinux的內核模塊也支持多個源文件。Linux內核通過$(-objs)包含多個目標文件,使Kbuild編譯多個源文件。因此在支持新Makefile里,增加了objs語句。首先通過TEST_FILES列出所有C文件,再將C文件替換成Obj文件賦值給$(TEST_MODULE_NAME)-objs 。

export TEST_MODULE_NAME = linux-test-module

export TEST_FILES = linux-test-module.c linux-test-module-internal.c

$(TEST_MODULE_NAME)-objs = $(patsubst %.c,%.o,$(filter %.c,$(TEST_FILES)))

obj-m += $(TEST_MODULE_NAME).o

MY_CFLAGS += -g -DDEBUG

ccflags-y += ${MY_CFLAGS}

SRC := $(shell pwd)

all:

$(MAKE) -C $(KERNEL_SRC) M=$(SRC)

modules_install:

$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install

clean:

rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c

rm -f Module.markers Module.symvers modules.order

rm -rf .tmp_versions Modules.symvers

內核源碼目錄內Makefile

有時內核模塊也需要在Linux內核源碼目錄內編譯,不需要指定編譯命令。KERNELRELEASE是Linux內核源碼的頂層Makefile定義的一個變量。如果在內核源碼目錄內編譯,先執行Linux內核源碼的頂層Makefile,會定義KERNELRELEASE的具體值。如果加上對KERNELRELEASE的檢查,前面的Makefile可以改造成既可以在在內核源碼目錄內編譯,也可以在在內核源碼目錄外編譯。下面的Makefile,增加了檢查KERNELRELEASE的語句“ifeq ($(KERNELRELEASE),)”。

export TEST_MODULE_NAME = linux-test-module

export TEST_FILES = linux-test-module.c linux-test-module-internal.c

$(TEST_MODULE_NAME)-objs = $(patsubst %.c,%.o,$(filter %.c,$(TEST_FILES)))

obj-m += $(TEST_MODULE_NAME).o

MY_CFLAGS += -g -DDEBUG

ccflags-y += ${MY_CFLAGS}

ifeq ($(KERNELRELEASE),)

SRC := $(shell pwd)

# KERNEL_src=/proj/hankf/zcu106/rdf0428-zcu106-vcu-trd-2020.2/source/linux-kernel

all:

$(MAKE) -C $(KERNEL_SRC) M=$(SRC)

modules_install:

$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install

clean:

rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c

rm -f Module.markers Module.symvers modules.order

rm -rf .tmp_versions Modules.symvers

endif

實際測試中,不加KERNELRELEASE相關語句,也不影響在Linux內核源碼目錄內編譯。據說舊版本Kbuild才需要的KERNELRELEASE相關語句。


上面的Makefile文件也可以作為一個模板。只需要更改TEST_MODULE_NAME的值“linux-test-module”,和更改TEST_FILES后的文件列表,可以用于編譯其它模塊。


如果既不在PetaLinux環境里編譯,也不再Linux內核源碼目錄內編譯,請再在上面的Makefile文件里定義內核源碼目錄。

Yocto recipe文件

Yocto recipe文件的擴展名是.bb,它定義recipe需要的文件。

原始bb文件

原始的recipe的bb文件的只含有一個C文件。

SUMMARY = "Recipe for build an external linux-test-module Linux kernel module"

SECTION = "PETALINUX/modules"

LICENSE = "GPLv2"

LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"

inherit module

INHIBIT_PACKAGE_STRIP = "1"

SRC_URI = "file://Makefile

file://linux-test-module.c

file://COPYING

"

S = "${WORKDIR}"

# The inherit of module.bbclass will automatically name module packages with

# "kernel-module-" prefix as required by the oe-core build environment.

新bb文件

由于要支持多個源文件,需要在recipe的bb文件的添加所有C文件。修改其實也很簡單。下面的bb文件添加了行“file://linux-test-module-internal.c”以為Yocto/PetaLinux增加文件linux-test-module-internal.c。

SUMMARY = "Recipe for build an external linux-test-module Linux kernel module"

SECTION = "PETALINUX/modules"

LICENSE = "GPLv2"

LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"

inherit module

INHIBIT_PACKAGE_STRIP = "1"

SRC_URI = "file://Makefile

file://linux-test-module.c

file://linux-test-module-internal.c

file://COPYING

"

S = "${WORKDIR}"

# The inherit of module.bbclass will automatically name module packages with

# "kernel-module-" prefix as required by the oe-core build environment.

測試環境UBuntu 18.04
PetaLinux 2020.2

原文標題:【工程師分享】在Petalinux編譯多個源文件的Linux內核模塊,以及擴展Makefile功能

文章出處:【微信公眾號:FPGA開發圈】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1376

    瀏覽量

    40319
  • Linux
    +關注

    關注

    87

    文章

    11320

    瀏覽量

    209845

原文標題:【工程師分享】在Petalinux編譯多個源文件的Linux內核模塊,以及擴展Makefile功能

文章出處:【微信號:FPGA-EETrend,微信公眾號:FPGA開發圈】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    所以每個模塊都有對應的維護人員。維護人員的工作就是審核人們提交的代碼是否正確,如果沒有問題,就會合并到主分支上。這樣就會使linux內核不斷完善和更新。接下來就是芯片原廠例如恩智浦,開發人員會不定期在
    發表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    所以每個模塊都有對應的維護人員。維護人員的工作就是審核人們提交的代碼是否正確,如果沒有問題,就會合并到主分支上。這樣就會使linux內核不斷完善和更新。接下來就是芯片原廠例如恩智浦,開發人員會不定期在
    發表于 12-13 09:03

    何在Petalinux下Patch u-boot源碼

    在軟件開發過程中我們經常遇到用 Patch 來傳遞和更新代碼的場景。本文以一個端到端的例子來演示在 Petalinux 使用過程中,如何給 u-boot 的源碼生成 Patch 并在 Petalinux 中編譯。
    的頭像 發表于 12-04 16:26 ?1080次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>Petalinux</b>下Patch u-boot源碼

    Multi-Scaler IP的Linux示例以及Debug(下)

    設置好 2022.2 Petalinux 環境。使用 2022.2 ZCU06 BSP,創建 Petalinux 工程:
    的頭像 發表于 09-18 10:05 ?351次閱讀
    Multi-Scaler IP的<b class='flag-5'>Linux</b>示例以及Debug(下)

    何在DRA821U上使用Linux實現快速引導

    電子發燒友網站提供《如何在DRA821U上使用Linux實現快速引導.pdf》資料免費下載
    發表于 09-03 10:11 ?0次下載
    如<b class='flag-5'>何在</b>DRA821U上使用<b class='flag-5'>Linux</b>實現快速引導

    linux驅動程序如何加載進內核

    ,需要了解Linux內核的基本概念和API。以下是一些關鍵概念: 1.1 內核模塊Linux內核模塊是一種動態加載和卸載的代碼,可以在不重
    的頭像 發表于 08-30 15:02 ?518次閱讀

    linux驅動程序的編譯方法是什么

    Linux驅動程序的編譯方法主要包括兩種: 與內核一起編譯 和 編譯成獨立的內核模塊 。以下是對這兩種方法的介紹: 一、與內核一起編譯 與內核
    的頭像 發表于 08-30 14:46 ?654次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?521次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發表于 08-07 15:51 ?311次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    NVIDIA全面轉向開源GPU內核模塊

    借助 R515 驅動程序,NVIDIA 于 2022 年 5 月發布了一套開源的 Linux GPU 內核模塊,該模塊采用雙許可證,即 GPL 和 MIT 許可。初始版本主要面向數據中心計算 GPU,而 GeForce 和工作站
    的頭像 發表于 07-25 09:56 ?456次閱讀
    NVIDIA全面轉向開源GPU<b class='flag-5'>內核模塊</b>

    英偉達將全面轉向開源GPU內核模塊

    英偉達公司近期宣布了一項重大決策,即全面轉向開源GPU內核模塊,并計劃最終以此取代閉源驅動程序。這一戰略轉變標志著英偉達在開源領域邁出了重要一步,旨在為用戶提供更強大、更全面的Linux支持。
    的頭像 發表于 07-19 15:26 ?578次閱讀

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?859次閱讀

    Linux添加磁盤創建分區、掛載

    Linux添加磁盤創建分區、掛載
    發表于 04-20 17:49 ?529次閱讀
    <b class='flag-5'>Linux</b>添加磁盤<b class='flag-5'>創建</b>分區、掛載

    使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核

    盟通技術干貨構建實時Linux內核簡介盟通技術干貨Motrotech如果需要在Linux中實現實時計算性能,進而有效地將Linux轉變為RTOS,那么大多數發行版都可以打上名為PREE
    的頭像 發表于 04-12 08:36 ?2603次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>

    微軟發布Linux內核Rust模塊優化補丁

    在此之前,Linux 內核中要想實現模塊初始化,必須先創建一個實例,再將其移至特定內存空間。然而,經過新補丁調整后,各模塊可直接在預設定好的
    的頭像 發表于 04-02 15:11 ?472次閱讀
    主站蜘蛛池模板: 人善交XUANWEN200喷水| 亚洲国产在线视频中文字| 在线观看免费视频播放视频| 久久国产av偷拍在线| 40岁东北老阿姨无码| 欧美兽交YOYO| 国产99九九久久无码熟妇| 亚洲高清在线视频| 久久免费黄色| 丁香成人网址| 野花韩国高清完整版在线| 暖暖日本在线手机免费完整版| 穿白丝袜边走边尿白丝袜| 亚洲精品无码国产爽快A片| 秘密教学93话恩爱久等了免费| 成人免费看片45分钟| 亚洲欧美偷拍视频一区| 女人一级毛片免费视频观看| 国产高清视频在线观看97| 在线欧美免费人成视频| 色狠狠色综合吹潮| 久久精品电影网| 啊…嗯啊好深男男高h文| 性绞姿始动作动态图| 美女被爆插| 国产在线观看91精品| ai换脸在线全集观看| 亚洲日本欧美天堂在线| 日本熟妇多毛XXXXX视频| 久久这里只有精品视频9| 成人免费视频在线| 欲乱艳荡少寡妇全文免费| 色色色久久久免费视频| 蜜桃无码AV视频在线观看| 国语自产拍在线视频普通话| AV无码九九久久| 欲香欲色天天天综合和网| 熟女人妻水多爽中文字幕| 免费看欧美xxx片| 精品欧美18videosex欧美| 国产精品AV色欲蜜臀在线|