国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

    關注

    4

    文章

    1466

    瀏覽量

    42760
  • Linux
    +關注

    關注

    88

    文章

    11746

    瀏覽量

    218845

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核伙伴系統內存申請函數詳解:從原理到實戰

    Linux 內核中,內存管理是整個系統穩定運行的基石,而伙伴系統(Buddy System) 作為內核物理內存分配的核心機制,更是驅動開發、內核模塊開發的必備知識點。它通過 "2
    的頭像 發表于 02-10 16:58 ?3598次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>伙伴系統內存申請函數詳解:從原理到實戰

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    單位分配內存。Slab分配器是建立在頁分配器的基礎上,從中獲取頁并將它們拆分為較小的內存實體。kmalloc分配器依賴于Slab分配器。再者內核模塊也可以直接與Slab分配器通信以便從緩存中請求內存
    發表于 01-16 20:05

    Linux-RT特點及簡單應用

    上下文切換延遲和提供硬實時保證來確保任務的低延遲和確定性。 Linux-RT上創建和管理實時任務 在Linux實時內核Linux-
    發表于 12-05 07:37

    Linux驅動開發的必備知識

    內核基礎知識: 1、熟悉 Linux 內核的架構、模塊系統、進程管理、內存管理等。 了解內核的編譯和加載過程。 2、C編程技能: 精
    發表于 12-04 07:58

    Linux內核模塊的加載機制

    Linux內核模塊通常是.ko文件,也就是Kernel Object的縮寫。這些文件是ELF格式的,但和用戶空間的程序不同,它們包含的是特定于內核的信息。比如,模塊的元數據,像作者
    發表于 11-25 06:59

    【迅為工業RK3568穩定可靠】itop-3568開發板Linux驅動開發實戰:RK3568內核模塊符號導出詳解

    【迅為工業RK3568穩定可靠】itop-3568開發板Linux驅動開發實戰:RK3568內核模塊符號導出詳解
    的頭像 發表于 11-21 13:25 ?1060次閱讀
    【迅為工業RK3568穩定可靠】itop-3568開發板<b class='flag-5'>Linux</b>驅動開發實戰:RK3568<b class='flag-5'>內核模塊</b>符號導出詳解

    【OK3506-S12Mini試用評測】編譯你的第一個內核模塊

    OK3506 開發板內核模塊編譯與加載 一、前言 在嵌入式 Linux 系統開發中,內核模塊(Kernel Module) 是一種可動態加載到內核中的驅動或功能擴展,不需要重新編譯整個
    發表于 10-24 21:00

    何在裸機環境中運行KleidiAI微內核

    ,對 KleidiAI 進行了簡要概述,并附有相關指南鏈接,其中詳細說明了在 Linux 環境中運行 KleidiAI 矩陣乘法 (matmul) 微內核的分步操作,這份指南內容詳實且極易上手。而本篇內容則將
    的頭像 發表于 08-08 15:16 ?3794次閱讀
    如<b class='flag-5'>何在</b>裸機環境中運行KleidiAI微<b class='flag-5'>內核</b>

    迅為RK3568開發板內核模塊實現-查看模塊信息

    在驅動模塊加載之后,使用“modinfo helloworld.ko”命令可以獲得模塊的信息,包括模塊作者,模塊說明,模塊支持的參數等等。
    發表于 05-16 11:18

    迅為RK3568開發板內核模塊實現-模塊加載與卸載

    有了內核模塊以后,我們要如何使用呢?編譯驅動有倆種方式,那 Linux 驅動的運行方式也肯定有倆種。一種就是將驅動編譯進內核,這樣 Linux 系統啟動后會自動運行程序。第二種就是將驅
    發表于 05-14 10:56

    迅為RK3568開發板內核模塊實現-編譯模塊

    有了 Makefile 以后,輸入“make”命令就可以編譯 helloworld 驅動模塊,如下圖(圖 4-7)所示: 編譯完生成 helloworld.ko 目標文件就是我們需要的內核模塊
    發表于 05-12 11:09

    迅為RK3568開發板內核模塊實現-編寫 Makefile

    ;lt;文件>:將指定的文件(需要是以.o 結尾)設為編譯時以模塊形式編譯 第 4 行是設備樹內核的源碼路徑,請大家根據實際內核路徑進行修改。 第 5 行是獲取當前目錄的變量 第 7 行
    發表于 04-24 13:36

    在任何平臺上使用PetaLinux的先決條件

    本篇文章介紹了在任何平臺上使用 PetaLinux 的先決條件。PetaLinux 是一種嵌入式 Linux 軟件開發套件 (SDK),主要用于基于 FPGA 的系統級芯片 (SoC) 設計或 FPGA 設計。
    的頭像 發表于 04-24 10:40 ?1494次閱讀
    在任何平臺上使用<b class='flag-5'>PetaLinux</b>的先決條件

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內核的延遲測試

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內核,以及應用了RT補丁的相似內核版本。對于實時版,我
    的頭像 發表于 03-25 09:39 ?793次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內核</b>的延遲測試

    從零開始馴服Linux(一):ZYNQ-Linux啟動文件構建全解析

    /atk-zynq-linux-xlnx),可看到Linux內核源碼目錄結構,如下圖所示: 圖 1.2.7 Linux內核源碼目錄結構 拷貝
    發表于 03-20 16:48