gpt4 book ai didi

linux-kernel - Linux系统调用

转载 作者:行者123 更新时间:2023-12-04 05:01:02 25 4
gpt4 key购买 nike

我能够执行系统调用调用并在内核中进行处理。
但我还不清楚一些事情。进入 swi 例程后,内核会保存
用户模式在堆栈上注册。问题是-

  • 是谁的堆栈? (因为 swi 处理和相应的系统调用例程需要堆栈帧来处理)
  • 如果是内核自己的堆栈,从哪里得到分配的堆栈..?它会开始使用当前的堆栈吗?
    如果是,则 current 可以是当时内核中可能正在执行的任何进程。这不会耗尽当前的堆栈吗?
  • 如果它在 swi 处理程序中使用当前正在执行的用户进程的堆栈,那么这将是内核现在将访问的用户地址空间。
    这可能吗?由于内核可寻址内存在 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/

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