# 开启KASAN

KASAN（Kernel Address Sanitize）是一个动态检测内存错误的工具，主要功能是检查内存越界访问和使用已释放的内存等问题。在涉及内存的问题时，开启KASAN通常能帮助用户更快的定位问题。但是在打开KASAN后，会出现难以复现的问题，存在概率性复现的问题。

内核集成了KASAN，打开KASAN选项，重新编译内核即可使能相关功能。KASAN在Linux内核4.0版本时被引入内核，所以选择的内核代码需要高于4.0版本。另外，最基本的KASAN功能需要GCC 4.9.2支持，更多的支持则需要GCC 5.0及以上版本。以下操作以鲲鹏平台CentOS7.6为例：

1. 下载RPM包kernel-alt-xxx.src.rpm。
  下载地址：http://vault.centos.org/7.6.1810/os/Source/SPackages/(http://vault.centos.org/7.6.1810/os/Source/SPackages/)

2. 安装依赖。

```
yum install gcc net-tools openssl-devel python-devel git bison java-devel numactl-devel ncurses-devel xmlto  asciidoc newt-devel pciutils-devel bc
yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto
yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
```


3. 更新GCC。

```
yum install -y centos-release-scl centos-release-scl-rh
yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++
source scl_source enable devtoolset-8
```


4. 确保mockbuild用户和mockbuild所属的组有效。
  1 2 groupadd mockbuild useradd mockbuild -g mockbuild

5. 安装RPM包。
  1 rpm –ivh kernel-alt-xxx.src.rpm

  安装完成，RPM构建工程自动部署在“/root/rpmbuild/SPECS”和“/root/rpmbuild/SOURCES”。

6. 构建rpmbuild。
  1 2 cd /root/rpmbuild/SPECS rpmbuild -bp --target=$(uname -m) kernel-alt.spec

7. 编译.config配置文件，文件路径及文件名称请以实际情况为准。
  1 2 cd /root/rpmbuild/BUILD/kernel-alt-xxx/linux-xxx.aarch64 make menuconfig

  进入menuconfig界面后，依次选择“Kernel hacking > Memory Debugging > KASan: runtime memory debugger”，选中“KASan: runtime memory debugger”，将“Instrumentation type”修改为“Inline instrumentation”，保存后退出。

8. 编译内核，文件路径及文件名称请以实际情况为准。
  1 2 3 4 cd /root/rpmbuild/BUILD/kernel-alt-xxx/linux-xxx.aarch64 make -j make modules_install make install

9. 重启。
  1 reboot

  重启后选择对应的内核，内核启动较慢，约耗时5~15分钟，请耐心等待。
