进程切换部分代码实现
移植linux,修改的主要就是和平台相关的那部分代码.linux里面和平台相关的代码 包括很多方面,比如boot过程,系统调用,中断处理,设备驱动,还有部分信号(软中断)处理 等,进程切换也有很小一部分平台相关代码.相对其它部分,我觉得这部分平台相关代码还 是相对简单的.
schedule()是uClinux中实现进程调度的函数.通过一定算法,进行调度.假设有2各进 程a,b,a运行时,调用了schedule(),那么os就要从进程就绪队列中挑选一个合适的进程, 如果没有合适进程,则后面继续运行a,假设找到了合适进程b,则就要从当前进程a切换到b. 这个切换过程是在switch_to()中进行的.
switch_to()出现在schedule()函数里面。调用形式switch_to(prev, next, last); prev,next都是进程控制块task_struct的指针.prev指向当前运行的进程,next指向要切 换的进程.
讲一下我移植的代码.由于代码是汇编程序,首先介绍一下cpu结构。我用的cpu采用 16位指令,32位的地址和数据。有16个通用寄存器,记作r0-r15。r0作为堆栈指针寄存器 sp,r1用途不固定,r2-r6作为参数传递寄存器,函数调用如果有不超过5个的参数,则参 数从左至右依次放在r2-r6中。同时,r2还作为函数返回值寄存器,函数的返回值都放在 r2里面。r7-r14是局部变量寄存器。r15是函数返回地址寄存器,也叫link register, 存放的是function call地返回地址。
#define switch_to(prev,next,last) { \ (1) register void *_prev __asm__ ("r2") = (prev); \ (2) register void *_next __asm__ ("r3") = (next); \ (3) register void *_last; \ (4) __asm__ __volatile__( \ (5) "jbsr " SYMBOL_NAME_STR(resume) "\t" \ (6) "mfcr %0, ss4" \ (7) : "=r" (_last) \ (8) : "r" (_prev), \ (9) "r" (_next) \ (10) : "r2", "r2", "r3"); \ (11) (last) = _last; \ } 换的进程.
讲一下我移植的代码.由于代码是汇编程序,首先介绍一下cpu结构。我用的cpu采用 16位指令,32位的地址和数据。有16个通用寄存器,记作r0-r15。r0作为堆栈指针寄存器 sp,r1用途不固定,r2-r6作为参数传递寄存器,函数调用如果有不超过5个的参数,则参 数从左至右依次放在r2-r6中。同时,r2还作为函数返回值寄存器,函数的返回值都放在 r2里面。r7-r14是局部变量寄存器。r15是函数返回地址寄存器,也叫link register, 存放的是function call地返回地址。
#define switch_to(prev,next,last) { \ (1) register void *_prev __asm__ ("r2") = (prev); \ (2) register void *_next __asm__ ("r3") = (next); \ (3) register void *_last; \ (4) __asm__ __volatile__( \ (5) "jbsr " SYMBOL_NAME_STR(resume) "\n\t" \ (6) "mfcr %0, ss4" \ (7) : "=r" (_last) \ (8) : "r" (_prev), \ (9) "r" (_next) \ (10) : "r2", "r2", "r3"); \ (11) (last) = _last; \ } |