最近在看linux 0.11 源码,在这里记录一下某些函数的自己的一些理解,其中有*号的地方是还没完全搞懂的,需要后面再去看一下,后续还会继续更新
system_call:
1. 原寄存器入栈保存
2. 通过sys_call_table取得系统函数地址,跳转到系统调用(返回值存到eax)
3. 跳转到schedule调度程序
schedule(kernal/sched.h):
******1. 对所有任务进行检查,如果alarm过期,则重置为0,并吧可中断睡眠状态的任务置为就绪状态
2. 在所以就绪状态的任务中选择一个counter值最大的任务,并用switch_to切换到该任务
3. 如果所有counter都为0, 则重置所有任务的counter为任务的priority,既优先级高的任务获得更大counter,可以优先运行
switch_to(linux/include/sched.h): 判断当前进程是否是要切换的进程如果是就不操作,否则执行ljmp tmp.a,其实是ljmp tmp.b: tmp.a,tmp.b 已被赋值为TSS选择符,而tmp.a 无用,这是Intel 处理器规定(https://blog.csdn.net/fukai555/article/details/41912735)
set_system_gate(kernel/sched.c): 设置中断号和函数的关联关系
_syscall(include/unistd.h): 进入0x80中断,跳转到系统函数调用,其中函数索引(通过宏定义)放在eax中,返回结果也是放在eax中,该函数在sched_init中设置0x80中断与system_call关联
*****copy_process(kernal/fork.c): sys_fork才push了5个参数,而函数有那么多参数,是因为调用system_call 的时候push了一部分参数
******get_free_page(mm/mermory.c): 在mem_map中找出mem_map[i]==0的项作为分配空间(https://www.cnblogs.com/lcchuguo/p/5231735.html)