加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux-kernel – Linux系统调用

发布时间:2020-12-13 23:06:17 所属栏目:Linux 来源:网络整理
导读:我能够执行系统调用调用并在内核中进行处理. 但很少有事情我不清楚.进入swi例程后,内核保存 用户模式在堆栈上注册.问题是- 是谁的堆栈? (因为swi处理和相应的系统调用例程需要堆栈框架才能工作) 如果是内核自己的堆栈,从哪里获得堆栈分配..?它会开始使用当
我能够执行系统调用调用并在内核中进行处理.
但很少有事情我不清楚.进入swi例程后,内核保存
用户模式在堆栈上注册.问题是-

>是谁的堆栈? (因为swi处理和相应的系统调用例程需要堆栈框架才能工作)
>如果是内核自己的堆栈,从哪里获得堆栈分配..?它会开始使用当前的堆栈吗?
如果是,则current可以是内核中当时可能正在执行的任何进程.这不是耗尽电流的堆栈吗?
>如果它在swi处理程序中使用当前正在执行的User进程的堆栈,那么这将是内核现在将访问的用户地址空间.
这可能吗?由于内核可寻址内存在1GB以内(如果在4GB RAM内存系统中使用1:3内核到用户地址空间比率).

解决方法

大多数ARM模式都有一个单独的堆栈.堆栈通常在重置处理程序后立即设置.从arch / arm / kernel / setup.c:

/*
 * setup stacks for re-entrant exception handlers
 */
__asm__ (
"msr    cpsr_c,%1nt"
"add    sp,%0,%2nt"
"msr    cpsr_c,%3nt"
"add    sp,%4nt"
"msr    cpsr_c,%5nt"
"add    sp,%6nt"
"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),abt[0])),"I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),und[0])),"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
    : "r14");

附: SVC是所谓的SWI的当前名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读