Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码

Linux内核分析第二周学习博客

本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程。

实验主要步骤如下:

代码分析:

void my_process(void)
{
    int i = 0;
    while(1)
    {
        i++;
        if(i%10000000 == 0)
        {
            printk(KERN_NOTICE "this is process %d -
",my_current_task->pid);
            if(my_need_sched == 1)
            {
                my_need_sched = 0;
        	    my_schedule();
        	}
        	printk(KERN_NOTICE "this is process %d +
",my_current_task->pid);
        }     
    }
}

通过这段代码,我们可以从整体上了解这个精简内核不断地执行、切换进程的逻辑过程。他使得变量i无限增加,并且模去一个大数,使得进程能够周期性轮转。

void my_timer_handler(void)
{
#if 1
    if(time_count%1000 == 0 && my_need_sched != 1)
    {
        printk(KERN_NOTICE ">>>my_timer_handler here<<<
");
        my_need_sched = 1;
    } 
    time_count ++ ;  
#endif
    return;  	
}

这是myinterrupt.c文件中的时钟中断处理函数的代码,他同样使得变量time_count无限自增,使得时钟周期性中断,并且将my_need_sched赋为1.


asm volatile(	
        	"pushl %%ebp
	" 	    /* save ebp */
        	"movl %%esp,%0
	" 	/* save esp */
        	"movl %2,%%esp
	"     /* restore  esp */
        	"movl %2,%%ebp
	"     /* restore  ebp */
        	"movl $1f,%1
	"       /* save eip */	
        	"pushl %3
	" 
        	"ret
	" 	            /* restore  eip */
        	: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
        	: "m" (next->thread.sp),"m" (next->thread.ip)
    	);  

在这段代码中,操作者依次将ebp入栈,esp存为上一个线程的栈指针,将下一个线程的栈指针放入当前的esp和ebp,将地址放入上个线程的指令寄存器,并将下个线程的指令寄存器的值入栈,最终返回。起到一个建立新进程的作用。

asm volatile(	
        	"pushl %%ebp
	" 	    /* save ebp */
        	"movl %%esp,%0
	" 	/* save esp */
        	"movl %2,%%esp
	"     /* restore  esp */
        	"movl $1f,%1
	"       /* save eip */	
        	"pushl %3
	" 
        	"ret
	" 	            /* restore  eip */
        	"1:	"                  /* next process start here */
        	"popl %%ebp
	"
        	: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
        	: "m" (next->thread.sp),"m" (next->thread.ip)
    	); 

在这段代码中,操作者先将当前基址指针入栈,然后将当前栈指针存为上个线程的栈指针,将下个线程的栈指针赋为当前栈指针,将标记的“1:”的地址赋给上个线程的指令寄存器,并将下个线程的指令寄存器入栈,最终弹出当前的基址指针,并将栈指针+4,完成进程的切换。

总结:关于操作系统如何工作这个问题,我认为操作系统就是提供了一个平台,留出许多排好顺序的位置来让应用程序依次使用硬件资源,他通过堆栈来调度硬件,使得进程的创建和切换成为可能。

zl + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

原文地址:https://www.cnblogs.com/20135319zl/p/5245549.html