Ubuntu构建内核源码树

本文介绍了如何在Ubuntu环境下构建内核源码树,并通过下载特定版本的内核源码来编译本地模块。重点讨论了在不同内核版本下编译模块时可能遇到的问题及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入:apt-cache search linux-source //查看内核版本

输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下

见:

Ubuntu下构建内核源码树的方法

 

ubuntu下编译本机模块是否需要下载内核源码呢?

答案是可以的。

dmesg | tail -1 命令用于查看载入内核后打印的数据。

 

在ubuntu下,也可根据下载的源代码编译模块,若要使模块能够运行在本机中,下载的内核源码版本最好与本机一致。当然也可以根据交叉编译器开发嵌入式系统的模块。

 

makefile版本1:

obj-m := mod_test.o
KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default:
 make -C $(KERNELBUILD) M=$(shell pwd)
modulesclean:
 rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

在有源码情况下,makefile版本2:

obj-m := mod_test.o

命令行输入:

make -C /usr/src/linux26/ SUBDIRS=$PWD modules
即可产生模块。如果内核版本不同,会出现无法加载的问题。可以用modinfo mod_test.ko查看。

vi  /lib/modules/`uname -r`/build/Makefile 可查看makefile中的内核版本号

http://blog.youkuaiyun.com/sabalol/article/details/2076610

 

 

Makefile为,
PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/
 
obj-m := test.o
module-objs := test.o
 
all:
       $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules

     
clean:
       rm *.ko
       rm *.o
在test.c和Makefile所在的目录下运行make,如果看到类似输出
make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules

make[1]: Entering directory `/usr/src/linux-source-2.6.15'
  CC [M]  /home/vmeth/hello.o
  Building modules, stage 2.
  MODPOST
  CC      /home/vmeth/hello.mod.o
  LD [M]  /home/vmeth/hello.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
 
一般用下面的Makefile,
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are
listed here.

mymodule-objs := hello.o
obj-m := hello.o 

else
PWD  := $(shell pwd)

KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
       $(MAKE) -C $(KDIR) M=$(PWD)

clean:
       rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

endif
KERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此
Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。
当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=
$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild
语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,
指明模块源码中各文件的依赖关系,以及要生成的目标模块名。
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。

### 升级 Linux 内核源码 #### 准备工作 为了确保顺利编译并安装新的内核,在开始之前需确认已准备好必要的开发工具包。可以通过如下命令来安装所需的软件包: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install kernel-package build-essential libncurses5-dev fakeroot flex bison bc libssl-dev libelf-dev ``` 上述指令会更新现有系统的软件列表,并安装一系列用于构建新内核所需的基础库和支持程序[^4]。 #### 获取最新版内核源码 访问官方站点下载最新的稳定版本内核压缩包,通常为 `.tar.xz` 文件格式。对于特定版本号的获取方式可以参考相关文档说明。这里提供一种通用做法: 1. 下载目标版本的内核源代码压缩文件; 2. 利用 `xz` 和 `tar` 工具依次解开外层和内部存档: ```bash xz -d linux-x.y.z.tar.xz # 解除 .xz 压缩 tar xvzf linux-x.y.z.tar # 提取 tar 归档 ``` 其中 `x.y.z` 表示具体的内核版本编号。 #### 配置与定制化设置 进入解压后的目录执行以下操作来进行个性化设定: ```bash cd linux-x.y.z/ make menuconfig ``` 这一步骤允许用户通过图形界面调整各种选项以满足特殊需求或优化性能参数。如果不需要任何更改,则可以直接跳过此步。 #### 编译过程 完成以上准备工作之后就可以正式着手于实际编译流程了。考虑到不同硬件平台可能存在差异性,建议先查看是否有现成配置可供借鉴;如果没有的话则继续按照默认路径前进即可: ```bash make -j$(nproc) ``` 该命令利用多线程加速整个编译速度,具体使用的CPU核心数由系统自动决定。 #### 安装模块及其他组件 当编译完成后还需要额外处理一些辅助部分才能让新内核正常运作起来: ```bash sudo make modules_install sudo make install ``` 前者负责把驱动等相关部件放置到合适位置以便加载支持更多设备类型;后者则是将生成好的镜像复制至引导分区等待后续激活使用。 #### 更新 GRUB 菜单项 最后一步是要刷新启动管理器中的记录从而使得下次重启时能够看到新增加的选择项: ```bash sudo update-grub ``` 至此全部步骤均已结束,重新开机后便可以选择刚刚安装完毕的新内核运行环境了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值