Linux内核4.4打开kasan功能并替换内核编译器

基于高通820,Linux4.4内核使能kasan功能

 

1. 打开宏定义

CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y //GCC 5.0以上支持,主要优化执行效率
CONFIG_KCOV=y
CONFIG_TEST_KASAN=y//kasan 测试程序
CONFIG_FRAME_WARN=0

 

2. bootimage分区和内核image大小调整

打开kasan后,内核Image变大,需要调整lk加载内核地址以及boot.img分区大小

2. 1 调整内核加载地址大小

bootable/bootloader/lk/platform/msm8996/include/platform/iomap.h
+#define ABOOT_FORCE_RAMDISK_ADDR           DDR_START + 0x4700000
+#define ABOOT_FORCE_TAGS_ADDR              DDR_START + 0x4600000
根据image大小调整,这里给kernel image 69.5M的空间。 dtbo.img 给1M,ramdisk.img 7M

0x80080000 -> 0x84600000 /* kernel image:69.5 */
0x84600000 -> 0x84700000 /*dtbo or tag:1M */
0x84700000 -> 0x84e00000 /* ramdisk:7M*/

这里需要注意:

 kernel image 要配置合适,太大可能会占用其他模块地址,太小又会覆盖dtbo和ramdisk.

可以根据System.map,查找内核符号_text和_end,把_end 减去_text就是kernel 真实占用内存大小.

比如_text = 0xffffff9008080000,  _end = 0xffffff900c57f000; 则kernel size = 0x44ff000=68.9M

所以在lk中配置内核加载地址为69.5M(0x80080000 -> 0x84600000)

dtbo和ramdisk大小,可以根据dtbo.img和ramdisk.img文件大小来确定.

2.2 调整boot.img打包大小:

当修改内核GCC为高版本后,CONFIG_KASAN_INLINE生效,boot.img会大于默认打包大小64M.

在BoardConfig.mk中修改BOARD_BOOTIMAGE_PARTITION_SIZE=0x5000000// 80M

2.3 调整eMMC中boot.img分区大小

vendor/chipcode/xmart/common/config/emmc

boot_a和boot_b需要调整为80M ;

3. test kasan测试kasan的功能

发现kasan_report功能会出现panic.

问题 原因是nearest_obj函数计算objects地址错误,没有计算左边的redzone

可以调用fixup_red_left进行修正.

static inline void *nearest_obj(struct kmem_cache *cache, struct page *page,
                void *x) {
    void *object = x - (x - page_address(page)) % cache->size;
    void *last_object = page_address(page) +
        (page->objects - 1) * cache->size;
    void *result = (unlikely(object > last_object)) ? last_object : object;

    result = fixup_red_left(cache, result);
    return result;
}

 

4. kasan不足

测试发现,kasan对栈和全局变量没有保护,查阅文档,发现是要gcc.5.0以上才支持,而android编译器最新是aarch-linux-android-4.9.

5. 修改编译内核的gcc版本为7.4

5.1 下载gnu gcc,并放到prebuilts

prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu

修改内核交叉编译器,高通平台可以直接修改AndroidKernel.mk文件

KERNEL_CROSS_COMPILE := $(shell pwd)/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

或者直接修改CROSS_COMPILE变量。

这样替换内核交叉编译器为7.4以后,可以支持全局变量和栈溢出保护,以及CONFIG_KASAN_INLINE

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值