操作系统工作小解
操作系统工作小解
20135224陈实 + 原创作品+ 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
套用课上陈述内容:
计算机是如何工作的?(总结)——三个法宝
-
存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;
-
函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能;
-
enter
-
pushl %ebp
-
movl %esp,%ebp
-
leave
-
movl %ebp,%esp
-
popl %ebp
-
函数参数传递机制和局部变量存储
-
中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序
核心代码分析:
第一部分:
void my_timer_handler(void)
{ #if 1
if(time_count%1000 == 0 && my_need_sched != 1)
printk(KERN_NOTICE ">>>my_timer_handler here<<<\n");
my_need_sched = 1;
}
time_count ++ ;
#endif
return;
}
这段代码很明显是C语言编写,内容只要是时间片的跳转即时钟中断函数,这里可以看见
if(time_count%1000 == 0 && my_need_sched != 1)这样一句,表示为时间片1000单位后跳转,在操作系统里有自己的定义单位
这里
my_need_sched = 1;将标志设置为1,在后面内容用到
void my_process(void)
void my_process(void)
if(i%10000000 == 0)
{
printk(KERN_NOTICE "this is process %d -\n",my_current_task->pid);
if(my_need_sched == 1)
。。。。。。
小结:可以看出,这部分主要内容是C编写的LINUX内核时间片对于函数调度的c代码
第二部分嵌入式汇编代码:
asm volatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t" /* save esp */
"movl %2,%%esp\n\t" /* restore esp */
"movl $1f,%1\n\t" /* save eip */
"pushl %3\n\t"
"ret\n\t" /* restore eip */
"1:\t" /* next process start here */
"popl %%ebp\n\t"
: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
: "m" (next->thread.sp),"m" (next->thread.ip)
);
my_current_task = next;
printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid
}
这部分主要注意的下面是标注主要语法在这不赘述
注意的几点:
数字代表的是标注下的内容,这里pcb是以链表的形式在前面定义好的
每个进程独立的堆栈。每个进程独立的PCB即进程数据对应于
"=m" (prev->thread.sp),"=m" (prev->thread.ip) : "m" (next->thread.sp),"m" (next->thread.ip)
这些数据内容
总结
第一阶段:进程从用户态切换到内核态 第二阶段:中断处理 第三阶段:进程切换
操作系统本质上是一种软件,是实现交流的接口