linux-kernel - Linux系统调用

标签 linux-kernel arm embedded-linux

我能够执行系统调用调用并在内核中进行处理。
但我还不清楚一些事情。进入 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/

    相关文章:

    c - mmap() 和 pthreads - 复制 VMA

    linux - QEMU 中的滚动选项

    multithreading - 我们可以在多核CPU中的特定内核上运行linux内核吗?

    c - 如何在另一个进程中调用函数(C,Linux)

    arm - ARM 系统模式与 arm 监控模式有何不同?

    linux - 从文件系统中查找路由器固件的 linux 内核版本

    memory-management - 我如何知道linux进程的页面缓存大小

    ios - 混合 ARM 和 THUMB 指令

    c - STM32F4 不压入/弹出浮点寄存器

    c - 如何将原始数据转换为有用的角度?