抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

在某群里看到有机油苦苦寻求给他手机内核添加上KVM支持, 正好触景生情, 想起当年熬夜搞机的日子, 便答应尝试帮帮他.

KVM

Kernel-based Virtual Machine 是一种内建于 Linux 中的开源虚拟化技术.
具体而言, KVM 可帮助您将 Linux 转变为虚拟机监控程序, 使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机 (VM).

过程

获取内核源码

得知她目前的手机型号为 Samsung Galaxy S8 (Exynos8895) 和内核版本后, 便找到了他目前使用的内核源码 BatKernel

配置编译环境

系统平台

官方推荐在 Ubuntu 18.04 上进行编译, 你可以使用 物理机docker 等虚拟机进行环境搭建, 这里我使用 WSL (Windows Sub Linux) 下的 Ubuntu 20.04

交叉编译链

创建一个工作目录

1
2
$ mkdir -p ~/Projects/Kernel
$ cd ~/Projects/Kernel

克隆一下交叉编译链

这里使用三星内核文档里推荐的版本

1
2
$ mkdir -p PLATFORM/prebuilts/gcc/linux-x86/aarch64
$ git clone https://github.com/djb77/aarch64-linux-android-4.9 PLATFORM/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

编译内核

内核源码

这里以你的方式去获取你的设备的内核源码

提示: git 加上 –depth 参数可以制定深度 (避免巨量 commit 导致占用太多存储)

1
$ git clone https://github.com/GrifoDev/BatKernel --depth=1

接下来进行一下简单分析, 可以看到第三方内核作者的编译脚本, 例如我这里的 build.sh

打开修改一下编译链路径

1
export BUILD_CROSS_COMPILE=../Toolchain/aarch64-cortex_a53-linux-gnueabi-6.4.0/bin/aarch64-cortex_a53-linux-gnueabi-

发现大意了, 这个作者使用的交叉编译链工具是 aarch64-cortex_a53-linux-gnueabi-6.4.0

于是我们由着他来

1
$ git clone https://github.com/djb77/aarch64-cortex_a53-linux-gnueabi ../Toolchain/aarch64-cortex_a53-linux-gnueabi-6.4.0

尝试运行

1
2
3
4
$ cd BatKernel
$ ./build.sh

line 141: make: command not found

出现报错, 于是我们便将依赖安装上, 反复过后便可以获得一个正常编译的环境

修改配置

由他的设备型号和代号可知它的内核配置在 arch/arm64/configs/exynos8895-dreamlte_defconfig

修改添加如下配置开启 KVM 支持

1
2
3
4
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ARM_HOST=y

修改添加如下配置自定义内核版本 (可选)

1
2
CONFIG_LOCALVERSION="-BatKernel_SM-G950F_Modified_By_icepie"
# CONFIG_LOCALVERSION_AUTO is not set

boot.img 中的 ramdisk/init.rcon boot 下添加

1
2
3
4
5
6
on boot:

......

# KVM
chmod 666 /dev/kvm

编译测试

1
$ ./build.sh

最后

打包

当然是打包为 boot.img 啦, 在这个第三方内核作者的脚本里已经自带此操作

再按照该设备的分区打包一个 zip 格式的包就好啦~

成果链接:
BatKernel_SM-G950F_Modified_By_icepie(KVM)

测试

打开一个安卓终端输入

1
$ ls /dev/kvm

即此目录存在便是成功添加了 KVM 支持

参考资料

评论