稳定性调试汇总

一、工具

1. QCrash

E:\tmp\kasan>aarch64-linux-gnu-objdump.exe -d vmlinux > log_objdump.txt
E:\tmp\kasan>aarch64-linux-gnu-nm.exe vmlinux > log_nm.txt
...

使用参考:驱动模块(3)——Linux交叉编译工具链: https://www.cnblogs.com/hellokitty2/p/9745959.html

 

二、Log

1. 重启后下列属性显示重启原因

./prop.txt:259:[persist.sys.boot.reason]: []
./prop.txt:260:[persist.sys.boot.reason.history]: [kernel_panic,bug,52663
./prop.txt:789:[sys.boot.reason]: [kernel_panic,bug]
./prop.txt:790:[sys.boot.reason.last]: [kernel_panic,bug]

 

三、内核浮点运算

1. 如果内核使用浮点则需要保存恢复浮点寄存器等其他杂项,这样会导致内核性能下降,所以一般不建议使用浮点,除非特殊情况。

当你需要在内核中使用浮点,如果按照用户空间的写法可能会出现一些意想不到的情况。如:程序Crash,内存越界、访问非法内存地址,浮点计算出错等稀奇古怪的问题。
出现这种问题的原因是:内核由于性能原因,在内核运行的代码,内核在进行上下文切换时,不会主动保存和恢复浮点寄存器。这样可能会导致内核在进行浮点运算时,可能会破坏此时用户空间的浮点寄存器状态,导致用户空间的fpsimd_state状态异常,随后程序的行为将变的不可控。

https://www.kernel.org/doc/Documentation/arm/kernel_mode_neon.rst 中说明了在内核运行的代码,内核在进行上下文切换时,不会主动保存和恢复浮点寄存器。

2. 如何在内核使用浮点

在内核中使用浮点,在不同架构下会有不同操作流程。这部分需要查阅内核文档,如在X86上要用 kernel_fpu_begin()/kernel_fpu_end(),在arm上用 kernel_neon_begin()/ kernel_neon_end()。

这里提到在使用 kernel_neon_begin()/ kernel_neon_end()规则:

NEON/VFP code 不允许在中断中使用
NEON/VFP code 不允许睡眠
NEON/VFP code 执行时是禁止抢占的

3. 测试

//测试1:
int kernl_float_test_1(int test,int ratio){
    int result;
    result = test*2.6/ratio - test/20;
    return result;
}

//测试2:
#include <asm/neon.h>
int kernl_float_test_2(int test,int ratio){
    int result;
    if (!may_use_simd()) {
     //判断是否可以使用浮点,如果为判断在执行kernel_neon_begin可能会死机
        return;
    }
    kernel_neon_begin();
    result = test*2.6/ratio - test/20;
    kernel_neon_end();
    return result;
}

//测试3:
int kernl_float_test_3(int test,int ratio){
    int result;
    result = (test*26)/(ratio*10) - test/20;
    return result;
}

说明:

kernl_float_test_1 在用户空间和内核空间都可以编译通过,在用户空间使用没有任何问题,但是在内核虽然可以编译通过,但使用时可能会破坏用户空间的浮点寄存器的状态
kernl_float_test_2 内核使用浮点,必须按照这种方式使用,浮点计算安全,但是效率不高,可以看到汇编代码需要执行对浮点寄存器进行保存,相比较于保存恢复浮点寄存器状态开销,使用浮点运算有点不划算。
kernl_float_test_3 内核和用户空间使用都没有问题,把浮点转化为整型计算,执行效率高于前两种

 

参考:
[转]Linux 内核使用浮点问题: https://www.jianshu.com/p/c1b29f9dea97

 

posted on 2022-06-01 11:49  Hello-World3  阅读(196)  评论(0编辑  收藏  举报

导航