?? sched.s
字號:
@#include "sched.h"#define PID_OFT 0#define STATE_OFT 4#define COUNT_OFT 8#define PRIORITY_OFT 12#define CONTENT_OFT 16@ 應該轉換成虛擬地址 #define SDRAM_BASE 0x30000000#define SDRAM_SIZE 0x04000000 @ 寄存器切換@ __switch_to(struct task_struct pcur,struct task_struct pnext): @ r0 = &pcur, r1 = &pnext@ 對于linux,__switch_to在arch/arm/kernel/entry-armv.S中定義,以下代碼參考它 @ ENTRY(__switch_to).global __switch_to__switch_to: add r0, r0,#CONTENT_OFT ldr sp, =(SDRAM_BASE+0x100000-14*4) stmia r0!,{sp}^ @ 用戶/系統模式下的sp mrs r2, spsr @ 讀出spsr,保存 stmia r0!,{r2} ldmia sp!,{r2-r8} @ 把進入中斷時保存的寄存器轉移到當前task struct中 stmia r0!,{r2-r8} ldmia sp!,{r2-r8} stmia r0!,{r2-r8} ldr r0, [r1,#PID_OFT] @ 要切換到的進程的PID mov r0, r0, lsl #25 @ PID存在寄存器的最高7位 mcr p15, 0, r0, c13, c0, 0 @ 寫next_pid,從此,VA<32M的取址計算公式就變了,不過現在的VA總是大于32M的 add r1, r1, #CONTENT_OFT @ r1 = &task[next].content ldmia r1!,{sp}^ @ 用戶/系統模式下的sp ldmia r1!,{r2} @ spsr msr spsr_cxsf, r2 mov sp, r1 ldmia sp!,{r0-r12,pc}^ @ 模擬中斷返回, ^表示將spsr的值復制到cpsr
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -