• Linux内核开发最简单的Makefile


    Linux内核开发-最简单的Makefile

    时间:20220418,版本:V0.1

    作者:robotech_erx

    最简单的linux驱动程序代码至少需要一个makefile,一份源代码,本文简单解释makefile中的各个make target的意义。这里只是介绍一个简单的基础的makefile,生产环境需要更好的Makefile模板和构建工具。

    简单的驱动Makefile

    示例:

    obj-m += helloword.o
    
    PWD := $(shell pwd)
    
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build/
    
    all:
    make -C $(KERNELDIR) M=$(PWD) modules
    
    install:
    make -C $(KERNELDIR) M=$(PWD) modules_install
    
    clean:
    make -C $(KERNELDIR) M=$(PWD) clean 

    一个target的基本语法是:

    target: [dependent-source-file(s)]

    rule(s)

    The rule(s) instances are always prefixed with a [Tab] character, not white space.

    obj-m:以内核模块的形式单独编译。

    以all为例,展开后的编译规则是:

    make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules

    -C 参数告诉make把工作目录切换到 /lib/modules/$(shell uname -r)/build/目录,然后首先解析该目录下的makefile。这保证了当前编译的模块与内核是适配的——使用相同的编译连接参数。然后是M参数M=$(PWD),内核使用这个变量来确定要构建的外部模块的目录,完成内核的编译配置的读取后,在这个目录里完成模块的编译。

    预编译的内核头文件

    头文件的路径要提供给makefile,让make知道去哪里找到他们。所以得先准备头文件。Linux发行版一般都会准备好头文件。查看当前已安装的内核头文件:

    $ dpkg -l | grep linux-headers | awk '{print $1, $2}'
    
    ii linux-headers-5.13.0-37-generic
    ii linux-headers-5.13.0-39-generic
    ii linux-headers-5.4.0-107
    ii linux-headers-5.4.0-107-generic
    ii linux-headers-generic    (这是个啥)
    ii linux-headers-generic-hwe-20.04
    
    
    $ apt search linux-header #a long list
    $ sudo apt install linux-headers-generic
    $ sudo apt install linux-headers-$(uname -r) #安装当前内核版本的头文件

    安装完成的内核文件可以在/lib/modules/$(uname -r)/build

    $ ls -l /lib/modules/$(uname -r)/
    
    total 5552
    lrwxrwxrwx 1 root root 39 Nov 12 16:16 build -> /usr/src/linux-headers-
    5.0.0-36-generic/
    [...]

    可见是一个符号链接,真正的安装地址是/usr/src/

    如果是自己编译的内核,编译完成后,在源代码目录:

    $ make headers_install

    或者直接引用源码目录。

    引用的内核文件能直接引用“原始状态”的源码包么?不能,因为编译驱动时需要根据具体的内核选项来决定一些代码如何编译,cpu架构,大端还是小端等,这些都要依赖内核的配置。编译前当然要配置一下内核,生成默认配置 .config ,这个文件是设置 cpu 架构,及很多其他驱动选项的,没有个这个文件无法编译的。

    参考

    Linux设备驱动开发

    http://fastbitlab.com/linux-device-driver-programming-lecture-24-how-to-create-makefile/

  • 相关阅读:
    存储过程与函数
    12个非常实用的JavaScript小技巧
    用JS获取地址栏参数的方法
    sql server split函数
    Matplotlib 保存图片、图画接口和显示中文的使用方法
    pandas 分组操作
    pandas 字符串相关操作以及数据间的合并与重塑
    pandas 分层索引
    pandas 轴索引的重命名,离散化,异常值的处理与随机方法
    pandas 缺失值、重复值的处理与值的替换
  • 原文地址:https://www.cnblogs.com/robotech/p/16172097.html
Copyright © 2020-2023  润新知