@xiaoxiang
2015-03-16T12:39:47.000000Z
字数 1792
阅读 1914
Linux内核分析
by 赵缙翔
原创作品转载请注明出处
还是新手,如有疏漏,还请指教。
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
内核主要包括了以下几个功能部分:
这次,我们来做个实验对其进程管理,做个简单的时间片轮转多道程序理解它。
mykernel源码在github上:mykernel。核心代码在三个文件中,其主要功能如下:
修改后执行shell命令
make allnoconfig
make
qemu -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苦逼大二狗