我能够执行系统调用调用并在内核中进行处理。
但我还不清楚一些事情。进入 swi 例程后,内核会保存
用户模式在堆栈上注册。问题是-
如果是,则 current 可以是当时内核中可能正在执行的任何进程。这不会耗尽当前的堆栈吗?
这可能吗?由于内核可寻址内存在 1GB 以内(如果在 4GB RAM 内存系统中使用 1:3 的内核与用户地址空间比)。
最佳答案
大多数 ARM 模式都有一个单独的堆栈。堆栈通常在重置处理程序后不久设置。从 arch/arm/kernel/setup.c:
/*
* setup stacks for re-entrant exception handlers
*/
__asm__ (
"msr cpsr_c, %1\n\t"
"add sp, %0, %2\n\t"
"msr cpsr_c, %3\n\t"
"add sp, %0, %4\n\t"
"msr cpsr_c, %5\n\t"
"add sp, %0, %6\n\t"
"msr cpsr_c, %7"
:
: "r" (stk),
"I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
"I" (offsetof(struct stack, irq[0])),
"I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
"I" (offsetof(struct stack, abt[0])),
"I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
"I" (offsetof(struct stack, und[0])),
"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
: "r14");
附注SVC 是所谓的 SWI 的当前名称。
关于linux-kernel - Linux系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11257186/