2.2 EL0_IRQ 中断改造之入口
2.2.1 el0_irq代码框架
首先沿着 vectors-> kernel_ventry 0,irq -> el0_irq 分析。I-pipe的主要修改点如图中红色字体所示。接下来会对el0_irq中的每一行展开分析。

当el0_irq发生时,被中断的用户态进程有两种:一种是Linux进程,一种是Xenomai进程。
2.2.2 kernel_entry 0 与kernel_exit 0
1. 概要
调用kernel_entry 0将进程运行的用户态现场按照struct pt_regs的格式存入进程内核栈。调用kernel_exit 0将已压入进程内核栈的用户态现场恢复到对应的寄存器。struct pt_regs定义在arch/arm64/include/asm/ptrace.h,其中用于保持用户态现场的结构为:
struct pt_regs {
union {
struct user_pt_regs user_regs;
struct {
u64 regs[31];
u64 sp;
u64 pc;
u64 pstate;
};
};
u64 orig_x0;
#ifdef __AARCH64EB__
u32 unused2;
s32 syscallno;
#else
s32 syscallno;
u32 unused2;
#endif
u64 orig_addr_limit;
u64 unused; // maintain 16 byte alignment
u64 stackframe[2];
};
在I-pipe中,没有对kernel_entry和kernel_exit做修改。如果已经对二者比较熟悉,可以跳过本节剩余章节。
2. kernel_entry 0
去掉32位的干扰,只保留入参el为0的情况,核心代码如下:
| 行号 | 指令 | 参数 |
|---|---|---|
| 1 | .macro | kernel_entry, el, regsize = 64 |
| 2 | stp | x0, x1, [sp, #16 * 0] |
| 3 | stp | x2, x3, [sp, #16 * 1] |
| 4 | stp | x4, x5, [sp, #16 * 2] |
| 5 | stp | x6, x7, [sp, #16 * 3] |
| 6 | stp | x8, x9, [sp, #16 * 4] |
| 7 | stp | x10, x11, [sp, #16 * 5] |
| 8 | stp | x12, x13, [sp, #16 * 6] |
| 9 | stp | x14, x15, [sp, #16 * 7] |
| 10 | stp | x16, x17, [sp, #16 * 8] |
| 11 | stp | x18, x19, [sp, #16 * 9] |
| 12 | stp | x20, x21, [sp, #16 * 10] |
| 13 | stp | x22, x23, [sp, #16 * 11] |
| 14 | stp | x24, x25, [sp, #16 * 12] |
| 15 | stp | x26, x27, [sp, #16 * 13] |

最低0.47元/天 解锁文章
2062

被折叠的 条评论
为什么被折叠?



