//init/main.c
init
//kernel/sched.c//这是调度的初始化模块void sched_init(void)
{
int i;
struct desc_struct * p;
if (sizeof(struct sigaction) != 16)
panic("Struct sigaction MUST be 16 bytes");
set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss));
set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt));
p = gdt+2+FIRST_TSS_ENTRY;
for(i=1;i<NR_TASKS;i++) {
task[i] = NULL;
p->a=p->b=0;
p++;
p->a=p->b=0;
p++;
}
/* Clear NT, so that we won't have troubles with that later on */
__asm__("pushfl ; andl $0xffffbfff,(%esp) ; popfl");
ltr(0);
lldt(0);
outb_p(0x36,0x43); /* binary, mode 3, LSB/MSB, ch 0 *///设置时钟1
outb_p(LATCH & 0xff , 0x40); /* LSB *///设置时钟2
outb(LATCH >> 8 , 0x40); /* MSB *///设置时钟3
set_intr_gate(0x20,&timer_interrupt);//设置时钟中断处理函数
outb(inb_p(0x21)&~0x01,0x21);
set_system_gate(0x80,&system_call);
}
//1/调度函数(kernel/sched.c)//在mykernel中是内核上层的函数在想切换的时候,调用了 my_schedule 函数进行调度//所以我猜这里也是在想要切换进程的时候调用了内核中的函数切换,这里切换函数是 schedule//2/调度时机//但是在什么时候切换呢?在mykernel中,是时钟中断达到了10^7次,才调用了调度函数//在linux-0.11中只有8个地方调用了 schedule 函数
//schedule1/修改任务数组中每个任务的 signal alarm state
2/找出next
2.1/在任务数组中从后往前找,按照counter 的大小, 越大,优先级越高
2.2/找不到,按照 priority 更新counter,回到 2.13/switch_to(next)
/*
* switch_to(n)将切换当前任务到任务nr,即n。首先检测任务n 是不是当前任务,
* 如果是则什么也不做退出。如果我们切换到的任务最近(上次运行)使用过数学
* 协处理器的话,则还需复位控制寄存器cr0 中的TS 标志。
*/// 输入:%0 - 新TSS 的偏移地址(*&__tmp.a); %1 - 存放新TSS 的选择符值(*&__tmp.b);// dx - 新任务n 的选择符;ecx - 新任务指针task[n]。// 其中临时数据结构__tmp 中,a 的值是32 位偏移值,b 为新TSS 的选择符。在任务切换时,a 值// 没有用(忽略)。在判断新任务上次执行是否使用过协处理器时,是通过将新任务状态段的地址与// 保存在last_task_used_math 变量中的使用过协处理器的任务状态段的地址进行比较而作出的。/*
* switch_to(n) should switch tasks to task nr n, first
* checking that n isn't the current task, in which case it does nothing.
* This also clears the TS-flag if the task we switched to has used
* tha math co-processor latest.
*/#define switch_to(n) {\struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \
"je 1f\n\t" \
"movw %%dx,%1\n\t" \
"xchgl %%ecx,_current\n\t" \
"ljmp %0\n\t" \
"cmpl %%ecx,_last_task_used_math\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"d" (_TSS(n)),"c" ((long) task[n])); \
}