不希望编译全部内核,只编译内核相应驱动模块,操作如下:
下文以系统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
网友评论