稳定性调试汇总
一、工具
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) 编辑 收藏 举报