@xiaoxiang
2015-03-16T04:39:47.000000Z
字数 1792
阅读 2135
Linux内核分析
by 赵缙翔
原创作品转载请注明出处
还是新手,如有疏漏,还请指教。
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
内核主要包括了以下几个功能部分:
这次,我们来做个实验对其进程管理,做个简单的时间片轮转多道程序理解它。
mykernel源码在github上:mykernel。核心代码在三个文件中,其主要功能如下:
修改后执行shell命令
make allnoconfigmakeqemu -kernel arch/x86/boot/bzImage
可以看到n个进程的PCB组成循环链表,按序被调度,一个进程执行一段时间,进入my_schedule让出CPU,下个进程继续占用CPU,时间中断my_timer_handle将my_need_sched设为1是进入调度的必要条件
my_start_kernel中启动第一个进程的代码:
asm volatile("movl %1,%%esp\n\t" /* set task[pid].thread.sp to esp */"pushl %1\n\t" /* push ebp */"pushl %0\n\t" /* push task[pid].thread.ip */"ret\n\t" /* pop task[pid].thread.ip to eip */"popl %%ebp\n\t":: "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) /* input c or d mean %ecx/%edx*/);
进程调度时的关键代码:
if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */{/* switch to next process */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);}else{next->state = 0;my_current_task = next;printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);/* switch to new process */asm volatile("pushl %%ebp\n\t" /* save ebp */"movl %%esp,%0\n\t" /* save esp 保存旧进程的ebp和esp*/"movl %2,%%esp\n\t" /* restore esp */"movl %2,%%ebp\n\t" /* restore ebp。 esp 和ebp都指向新进程的栈底*/"movl $1f,%1\n\t" /* save eip 。 前一个进程的下一条执行命令是上面标号1的pop ebp*/"pushl %3\n\t""ret\n\t" /* restore eip 。 开始调度新进程*/: "=m" (prev->thread.sp),"=m" (prev->thread.ip): "m" (next->thread.sp),"m" (next->thread.ip));}
抱歉啊,稍后更新……我先去赶一大堆作业了,by苦逼大二狗