linux内核模块编译 两种编译

linux内核模块的编译方法有两种:

1.放入linux内核源码中编译。

2.独立编译模块。

(1)放入linux内核源码中编译

这里先了解Kconfig和Makefile的作用

Kconfig:对应内核模块的配置菜单。

Makefile:对应内核模块的编译选项。

linux内核编译过程:是根据配置裁剪的结果配合Makefile完成内核编译。

以ARM平台为例,具体配置过程:

1.当执行make menuconfig 时,系统首先读取arch/arm/Kconfig生成整个配置界面

2.在读取配置界面的同时,系统会读取顶层目录下的.config文件,生成所有配置选项的默认值

3.当修改玩配置并保存后,系统会更新顶层目录下的.config

4.当执行make时,各层的Makefile会根据.config文件中的编译选项来决定哪些文件会被编译到内核中,或者编译成模块。

下面进入正题怎么把自己的内核代码添加到内核中,

1.把自己的内核代码放入到内核合适的位置   // 字符驱动  driver/char/

2.把自己开发的功能添加到linux内核的配置选项中,使用户能够选中这项功能并编译。// vi /driver/char/Kconfig

在Kconfig文件结尾,endmenu的前面加入一个config选项 

config 2018_HELLO

        bool "This is my first drive "

        default y

        help

            The driver hh.     

3.构建或修改Makefile。// vi dreiver/char/Makefile  obj-$(CONFIG_2018_HELLO)        += hello.c

4.执行make

(2)独立编译

topdir := $(shell cd $(src)/.. && pwd)

TARGET_MODULE:=xdma

EXTRA_CFLAGS := -I$(topdir)/include $(XVC_FLAGS)

ifneq ($(KERNELRELEASE),)
	$(TARGET_MODULE)-objs := libxdma.o xdma_cdev.o cdev_ctrl.o cdev_events.o cdev_sgdma.o cdev_xvc.o cdev_bypass.o xdma_mod.o xdma_thread.o
	obj-m := $(TARGET_MODULE).o
else
	BUILDSYSTEM_DIR:=/home/allen/share_allen/Zodiac_linux/board-support/linux-4.14.79
	PWD:=$(shell pwd)
all :
	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) clean

install: all
	$(MAKE) -C $(BUILDSYSTEM_DIR) M=$(PWD) modules_install

endif

KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义, 所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(BUILDSYSTEM_DIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。$(TARGET_MODULE)-objs :=表示目标模块由后面的.o文件连接生成。obj-m := $(TARGET_MODULE).o表示编译连接后将生成$(TARGET_MODULE).o模块。

补充一点,"$(MAKE) -C $(KDIR) M=$(PWD)"与"$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)"的作用是等效的,后者是较老的使用方法。推荐使用M而不是SUBDIRS,前者更明确。

两者的区别就是独立编译比较省时间,方便添加 移除,重启后消失。

 


原文链接:https://blog.csdn.net/lyw13522476337/article/details/79869066

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值