美文网首页
ubuntu 环境下编译驱动模块 (minix为例)

ubuntu 环境下编译驱动模块 (minix为例)

作者: 那个人一定不是我 | 来源:发表于2018-07-10 15:13 被阅读0次

不希望编译全部内核,只编译内核相应驱动模块,操作如下:
下文以系统4.9.87-linuxkit-aufs为例,对应源码包linux-4.9.87.tar.xz

.官网下载与系统内核版本对应的源码包 https://www.kernel.org (注意版本号一致)

.解压内核源码包,注意为了减小压缩包大小,源码包使用了xz 压缩,先使用 xz 解压源码包 xz -d xxxx.tar.xz , 再使用 tar 解压 tar xvf xxx.tar .

ubuntu@one$ ls
linux-4.9.87.tar.xz
ubuntu@one$ sudo xz -d linux-4.9.87.tar.xz 
ubuntu@one$ tar xvf linux-4.9.87.tar 
ubuntu@one$ ls
linux-4.9.87  linux-4.9.87.tar

. 查看当前系统的内核版本信息uname -r , 注意Local信息,后面需要修改内核源码Makefile文件中的版本信息,已确保与当前的Local信息一致.

ubuntu@one$ uname -r
4.9.87-linuxkit-aufs
#-linuxkit-aufs 为Local描述

.进入源码目录,修改Makefile文件EXTRAVERSION = xxx为Local信息.

ubuntu@one$ cd linux-4.9.87
ubuntu@one$ pwd
/usr/src/linux-4.9.87
ubuntu@one$ sudo vim Makefile
#内核源码包根目录 Makefile 文件
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 87
EXTRAVERSION =-linuxkit-aufs #这里修改为Local信息
NAME = Roaring Lionus

.如需修改其他版本信息,进入include/linux/vermagic.h 查看,此文件记录的信息是通过 sudo make menuconfig 开关进行设置(也可手动修改-不推荐).

.开始编译前的准备工作,进入内核源码目录,加载默认配置参数sudo make defconfig, 处理.config文件中缺失的源码中的参数配置sudo make oldconfig,执行编译准备工作sudo make prepare, 生成需要的脚本文件sudo make scripts.

ubuntu@one$ pwd
/usr/src/linux-4.9.87
ubuntu@one$ sudo make defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#
ubuntu@one$
ubuntu@one$ sudo make oldconfig
scripts/kconfig/conf  --oldconfig Kconfig
#
# configuration written to .config
#
ubuntu@one$
ubuntu@one$ sudo make prepare
scripts/kconfig/conf  --silentoldconfig Kconfig
  HOSTCC  arch/x86/tools/relocs_32.o
  HOSTCC  arch/x86/tools/relocs_64.o
  HOSTCC  arch/x86/tools/relocs_common.o
  HOSTLD  arch/x86/tools/relocs
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CC      kernel/bounds.s
  CHK     include/generated/bounds.h
  CHK     include/generated/timeconst.h
  CC      arch/x86/kernel/asm-offsets.s
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
ubuntu@one$
ubuntu@one$ sudo make scripts
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/modpost.o
  CC      scripts/mod/devicetable-offsets.s
  GEN     scripts/mod/devicetable-offsets.h
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  HOSTCC  scripts/selinux/genheaders/genheaders
  HOSTCC  scripts/selinux/mdp/mdp
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/pnmtologo
  HOSTCC  scripts/conmakehash
  HOSTCC  scripts/sortextable

.开始编译驱动模块,进入需要编译的驱动模块源码目录(以minix文件系统驱动为例),修改 Makefile.

ubuntu@one$ cd fs/minix/
ubuntu@one$ pwd
/usr/src/linux-4.9.87/fs/minix
ubuntu@tinylab/linux-0.11-lab$ ls
bitmap.c  inode.c         itree_v2.c  Makefile_       namei.c
dir.c     itree_common.c  Kconfig     minix.h
file.c    itree_v1.c      Makefile    Module.symvers
ubuntu@one$ 
ubuntu@one$ sudo vim Makefile

编辑目录下的Makefile文件为:

#
# Makefile for the Linux minix filesystem routines.
# make minix fs as kernel module
obj-m += minix.o
minix-objs := bitmap.o itree_v1.o itree_v2.o namei.o inode.o file.o dir.o

KERNELDIR:=/usr/src/linux-4.9.87/

default:
    make -C $(KERNELDIR) M=$(PWD) modules
#注意有的系统 $(PWD) 为空  可以直接替换为当前目录,
#如:M=/usr/src/linux-4.9.87/fs/minix/
clean:
    rm -rf *.o *.mod.c *.ko *.symvers

. 执行编译命令sudo make生成驱动模块

ubuntu@one$ sudo make
make -C /usr/src/linux-4.9.87/ M=/usr/src/linux-4.9.87/fs/minix/ modules
make[1]: Entering directory `/usr/src/linux-4.9.87'
  CC [M]  /usr/src/linux-4.9.87/fs/minix/bitmap.o
  CC [M]  /usr/src/linux-4.9.87/fs/minix/itree_v1.o
  CC [M]  /usr/src/linux-4.9.87/fs/minix/itree_v2.o
  CC [M]  /usr/src/linux-4.9.87/fs/minix/namei.o
  CC [M]  /usr/src/linux-4.9.87/fs/minix/inode.o
  CC [M]  /usr/src/linux-4.9.87/fs/minix/file.o
  CC [M]  /usr/src/linux-4.9.87/fs/minix/dir.o
  LD [M]  /usr/src/linux-4.9.87/fs/minix/minix.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/src/linux-4.9.87/fs/minix/minix.mod.o
  LD [M]  /usr/src/linux-4.9.87/fs/minix/minix.ko
make[1]: Leaving directory `/usr/src/linux-4.9.87'
ubuntu@one$ 

.查看生成模块信息modinfo minix.ko.

ubuntu@one$ modinfo minix.ko 
filename:       /usr/src/linux-4.9.87/fs/minix/minix.ko
license:        GPL
alias:          fs-minix
depends:        
vermagic:       4.9.87-linuxkit-aufs SMP mod_unload  
##注意 vermagic 字符串

加载模块sudo insmod minix.ko,查看是否加载成功lsmod.

ubuntu@one$ sudo insmod minix.ko 
ubuntu@one$ lsmod 
Module                  Size  Used by
minix                  32768  0  

.查看加载信息dmesg | tail, 如果失败,并出现 Invalid module format 则需要修改相关版本信息.

###加载成功的消息:
ubuntu@one$ sudo dmesg | tail
[10770.402514] minix: loading out-of-tree module taints kernel.
ubuntu@one$
###加载失败的消息:
ubuntu@one$  sudo insmod minix.ko 
insmod: ERROR: could not insert module minix.ko: Invalid module format
ubuntu@one$  sudo dmesg | tail
[  921.312628] minix: version magic '4.9.87-linuxkit-aufs  SMP mod_unload ' 
should be '4.9.87-linuxkit-aufs SMP mod_unload '
ubuntu@one$ 
##-linuxkit-aufs 后面多出了一个空格(由于修改内核源码包根目录Makefile时,字符串后多出一个空格造成)

一些其他命令:

#查看内核编译版本信息
ubuntu@one$ sudo make kernelrelease
4.9.87-linuxkit-aufs

相关文章

网友评论

      本文标题:ubuntu 环境下编译驱动模块 (minix为例)

      本文链接:https://www.haomeiwen.com/subject/lbufpftx.html