河北省建设厅网站登陆设置网站建设技术部奖惩制度
河北省建设厅网站登陆设置,网站建设技术部奖惩制度,枣庄网页制作公司,wordpress 128m内存驱动编译可以划分为两种方式#xff1a;Integrated Build 和 Out-of-Tree Build
首先需要了解这两种编译方式的区别#xff1a;
Integrated Build (树内编译)
定义#xff1a;将驱动代码直接集成到Linux内核源码树中#xff0c;作为内核的一部分进行编译特点#xff1a…驱动编译可以划分为两种方式Integrated Build 和 Out-of-Tree Build首先需要了解这两种编译方式的区别Integrated Build (树内编译)定义将驱动代码直接集成到Linux内核源码树中作为内核的一部分进行编译特点需要将驱动代码(.h和.c文件)拷贝到内核目录(如kernel/drivers/bluetooth)需要修改内核的Kconfig和Makefile文件增加对新驱动的支持通过内核配置系统(如make menuconfig)启用驱动选项驱动会随着内核一起编译成为内核的一部分Out-of-Tree Build (树外编译/外部模块编译)定义在内核源码树之外单独编译驱动模块生成独立的.ko文件特点不需要修改内核源码在驱动代码目录直接执行make命令生成.ko文件通过insmod命令动态加载到系统中独立于内核版本更灵活易于维护从上面的对比我们就能知道标准的树外编译需要满足以下几个特点编译位置独立即编译操作在内核源码树之外的独立目录中进行无需将代码拷贝到kernel/drivers/...独立构建流程直接在下载好的驱动目录执行make依赖驱动自带的Makefile通常包含 make -C $(KERNEL_DIR M$(PWD) modules这类Kbuild语法而非通过 make menuconfig make modules整合进内核构建流程需规避内核冲突一般明确要求“注释掉内核中的CONFIG_XXX”,说明该驱动不参与内核原生构建而是作为外部模块动态加载编译生成的.ko文件可单独管理、替换与内核版本解耦接下来我们以在x86架构上的Ubuntu电脑交叉编译移远FCS866R蓝牙驱动为例带大家一步一步走完这个过程相信大家对树外交叉编译能有更深的理解。1. 安装交叉编译工具链由于是在Ubuntu电脑上我们就可以直接通过 apt install的方式下载交叉编译工具链sudo apt update sudo apt install gcc-aarch64-linux-gnu安装后可以使用交叉编译工具链中的aarch64-linux-gnu-gcc来编译ARM64的程序。验证安装aarch64-linux-gnu-gcc --version2. 准备内核源码或内核构建树内核模块的编译需要依赖目标设备所使用的内核源码或者至少是构建好的内核头文件编译信息。所以需要找到与目标设备内核版本完全一致的内核源码。常用的获取方式有下面两种从目标设备的内核仓库下载这是最常见也是最推荐的方式如果你有目标设备的Linux内核源码仓库例如设备厂商提供的可以直接从仓库克隆并切换到对应版本。从 kernel.org 下载主线内核适用于目标设备使用的是标准主线内核可以直接从kernel.org官网下载对应版本的源码并拷贝到Ubuntu主机上。https://www.kernel.org/或者通过命令行的方式拉取内核源码压缩包使用tar解压到当前目录下。wget https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.6.78.tar.xz tar -xf linux-6.6.78.tar.xz cd linux-6.6.783. 生成配置文件内核模块.ko文件并不是独立编译的它必须依赖完整的内核构建树。因为内核的许多功能是通过宏定义开关的。同一个内核源码如果配置不同编译出来的头文件中某些宏定义的值也会不同。比如我们这里用的蓝牙驱动可能会用到某些内核宏如果这些宏在目标内核中没有被定义驱动自然就会编译失败。简单来说我们需要一套与目标设备上运行的内核完全一致的源码和配置才能编译出能在该设备上正常工作的模块。那么如何获取目标设备的.config文件许多开发板或嵌入式设备厂商会提供完整的内核源码并且一般在内核源码的arch/arm64/configs/目录下会包含针对此设备的默认配置文件选择开发板对应的defconfig并在源码目录下执行make ARCHarm64 厂商提供的defconfig名称这样就会生成一个.config文件它用于描述厂商为该设备预定义的配置。但是要注意的是这个默认配置可能与设备实际运行的内核配置有细微差异可能需要进行进一步手动调整配置。使用目标版本相同的主线内核默认配置不推荐我们这里只是测试编译过程并不打算使用这个生成的模块所以我们为了省时省力就用发行版默认的defconfig同样也是直接在源码目录下执行make ARCHarm64 defconfig生成了.config文件后我们还需要生成一些必要的文件如头文件、脚本、符号信息等。这一步也被叫做生成内核构建树。make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- prepare make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- scriptsmake prepare会生成基本的头文件和内核版本信息。make scripts会编译一些捏和构建时需要用到的工具至此内核源码目录已经完全准备好可供外部模块编译了。4. 克隆驱动仓库这里以移远通信 FCS866R驱动仓库为例执行git clone https://git-master.quectel.com/wifi.bt/fcs866r.git查看蓝牙驱动仓库内的文件通常会有Makfefile、Kconfig和.c文件5. 编译内核模块为了让make使用交叉编译工具链和目标内核源码我们需要向make传递参数。最直接的方式就是在命令行中直接传递例如export KERNEL_SRC内核路径 make -C $KERNEL_SRC M$(pwd) ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- modules正常来说编译是不会报错的通过ls可以看到驱动编译产物编译出来的.ko文件即可通过insmod插入对应内核版本、架构的嵌入式开发板上使用。