如果你使用如下的命令来打补丁:
patch -pN < ../a.patch
那么你可以像下面这样来卸载掉这个补丁:需要根据打补丁的顺序倒序卸载,比如linux内核添加了a补丁,之后又打上了b补丁,那么卸载顺序是先卸载b补丁,然后卸载a补丁
patch -R -p1 < ../a.patch
上面N表示一个自然数,表示去掉补丁路径的第几个部分,假定源码目录是/home/my-linux/work/linux4.19.9
1.新建工作目录
mkdir -p /home/work/kernel
2.获取ST官方源码到此目录,如下面列表文件:
........................
........................
0060-ARM-stm32mp1-r0-rc4-hotfix-w904.3-DEVICETREE.patch
0061-ARM-stm32mp1-r0-rc4-hotfix-w904.5-DRIVERS.patch
0062-ARM-stm32mp1-r0-rc4-hotfix-w904.5-DEVICETREE.patch
0063-ARM-stm32mp1-r0-rc4-hotfix-w905.2-DRIVERS.patch
0064-ARM-stm32mp1-r0-rc4-hotfix-w905.2-DEVICETREE.patch
build
fragment-03-systemd.config
fragment-04-optee.config
fragment-05-modules.config
linux-4.19.9
linux-4.19.9.tar
README.HOW_TO.txt
series
3.解压源码,三种格式源码的解压方式
$> tar xfz <kernel source>.tar.gz
$> tar xfj <kernel source>.tar.bz2
$> tar xfJ <kernel source>.tar.xz
对于此文件
tar xvf linux-4.19.9.tar
4.进入源码目录
cd linux-4.19.9
5.打补丁,管理模式
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
6.配置内核文件(在源码目录外)
1)进入源码目录
cd Linux-4.19.9
2)创建编译输出目录
mkdir -p ../build
3)配置内核,
make ARCH=arm O="$PWD/../build" multi_v7_defconfig fragment*.config
如果还有一写小模块功能需要配置,则通过以下命令配置,
$>for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config $f; done
$> yes '' | make ARCH=arm oldconfig O="$PWD/../build"
7.编译内核,输出和编译到build目录
1)进入源码目录
cd linux-4.19.9
2)编译镜像
make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"
3)编译内核模块
make ARCH=arm modules O="$PWD/../build"
八.生成输出文件
1)创建输出文件路径
make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
2)创建boot目录
mkdir -p $PWD/../build/install_artifact/boot/
3)拷贝镜像到创建的boot目录
cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
4)拷贝设备树文件到创建的boot目录
cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
或者直接在build目录编译
1)进入build目录
cd build
2)编译镜像设备树文件
make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
3)编译内核模块
make ARCH=arm modules
4)生成输出文件
a.安装内核模块
make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install
b.创建一个boot目录
mkdir -p $PWD/../build/install_artifact/boot/
c.拷贝镜像文件到boot目录
cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
d.拷贝设备树文件到boot目录
cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
由于需要把wifi编进内核里面,配置问题解决:
1)make menuconfig O=“..build” 由于我是在build文件夹编译的所有需要这样配置
2)定位到WLAN driver
这时候光标移动到需要选择的item上,按h按键,会有下面的提示,说明这个模块依赖于NETDEVICES,WLAN 和WLAN_VENDOR_BROADCOM和CFG80211这四个模块。
需要将CFG80211模块从M变成Y,接着找到CFG80211模块驱动
按Y就表示编进内核了,保存再编译
官方编译
Compile and install on a build directory (different of kernel source code directory)
$> cd <directory to kernel source code>
* Build kernel images (uImage and vmlinux) and device tree (dtbs)
$> make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"
* Build kernel module
$> make ARCH=arm modules O="$PWD/../build"
* Generate output build artifacts
$> make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
$> mkdir -p $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
or
$> cd <build directory>
* Build kernel images (uImage and vmlinux) and device tree (dtbs)
$> make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
* Build kernel module
$> make ARCH=arm modules
* Generate output build artifacts
$> make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install
$> mkdir -p $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/