gpt4 book ai didi

c - 内核在添加新代码时中断(永远不会运行)

转载 作者:行者123 更新时间:2023-12-04 11:58:58 26 4
gpt4 key购买 nike

我正在尝试在用户空间和内核空间之间的边界处添加一些逻辑,尤其是在 ARM 架构上。

其中一个边界似乎是 arch/arm/kernel/entry-common.S 中实现的 vector_swi 例程。现在,我的大部分代码都是用 C 函数编写的,我想在 vector_swi 开头的某个地方调用它。

因此,我做了以下事情:

ENTRY(vector_swi)
sub sp, sp, #S_FRAME_SIZE
stmia sp, {r0 - r12} @ Calling r0 - r12
ARM( add r8, sp, #S_PC )
ARM( stmdb r8, {sp, lr}^ ) @ Calling sp, lr
THUMB( mov r8, sp )
THUMB( store_user_sp_lr r8, r10, S_SP ) @ calling sp, lr
mrs r8, spsr @ called from non-FIQ mode, so ok.
str lr, [sp, #S_PC] @ Save calling PC
str r8, [sp, #S_PSR] @ Save CPSR
str r0, [sp, #S_OLD_R0] @ Save OLD_R0
zero_fp

#ifdef CONFIG_BTM_BOUNDARIES
bl btm_entering_kernelspace @ <--- My function
#endif

当我的函数内容如下时,一切正常:

static int btm_enabled = 0;
asmlinkage inline void btm_entering_kernelspace(void)
{
int cpu;
int freq;
struct acpu_level *level;
if(!btm_enabled) {
return;
}
cpu = smp_processor_id();
freq = acpuclk_krait_get_rate(cpu);
(void) cpu;
(void) freq;
(void) level;
}

但是,当我添加一些额外的代码时,内核会进入崩溃重启循环。

static int btm_enabled = 0;
asmlinkage inline void btm_entering_kernelspace(void)
{
int cpu;
int freq;
struct acpu_level *level;
if(!btm_enabled) {
return;
}
cpu = smp_processor_id();
freq = acpuclk_krait_get_rate(cpu);
(void) cpu;
(void) freq;
(void) level;
// --------- Added code ----------
for (level = drv.acpu_freq_tbl; level->speed.khz != 0; level++) {
if(level->speed.khz == freq) {
break;
}
}
}

虽然第一直觉是责怪添加代码的逻辑,但请注意,由于 btm_enabled0,因此不应执行任何代码。

我通过添加 sysfs 条目来打印出变量(删除了添加的代码)。

有人可以解释这里发生了什么或者我做错了什么吗?

最佳答案

第一个版本可能会编译成一条返回指令,因为它没有副作用。第二个需要加载 btm_enabled 并在此过程中覆盖一个或两个系统调用参数。

当从汇编语言调用 C 函数时,您需要确保可能被修改的寄存器不包含所需的信息。

要解决您的具体问题,您可以将代码更新为:

#ifdef CONFIG_BTM_BOUNDARIES
stmdb sp!, {r0-r3, r12, lr} @ <--- New instruction
bl btm_entering_kernelspace @ <--- My function
ldmia sp!, {r0-r3, r12, lr} @ <--- New instruction
#endif

新指令将寄存器 r0-r3、r12 和 lr 存储到堆栈中,并在函数调用后恢复它们。这些是 C 函数唯一允许修改的寄存器,在这里保存 r12 是不必要的,因为它的值没有被使用,但是这样做可以使堆栈按照 ABI 的要求保持 8 字节对齐。

关于c - 内核在添加新代码时中断(永远不会运行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49034855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com