张若嘉 + 原创做品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
知识归纳:
html
简单模拟内核代码
主要包括:linux
操做系统三个法宝:算法
操做系统核心功能:进程调度和中断机制,经过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可使用户能够很容易操做的计算机系统
多进程的Linux操做系统:进程必须等到正在运行的进程空闲CPU后才能运行
进程切换:当正在运行的进程等待其余的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其余正在等待的进程。进程切换机制中包含esp的切换、堆栈的切换数据结构
跟踪调试Linux内核的启动框架
系统调用:即使是最简单的程序,在进行输入输出等操做时也会须要调用操做系统所提供的服务,也就是系统调用。Linux下的系统调用是经过中断(int 0x80)来实现的函数
传递参数:在执行int 80指令时,寄存器 eax 中存放的是系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成以后,返回值能够在寄存器 eax 中得到。Linux 采用的是 C 语言的调用模式,这就意味着全部参数必须以相反的顺序进栈,即最后一个参数先入栈,而第一个参数则最后入栈。
用户态、内核态和中断处理过程
使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
使用库函数API获取系统当前时间
使用C代码中嵌入汇编代码触发系统调用获取系统当前时间学习
给MenuOS增长time和time-asm命令
使用gdb跟踪系统调用内核函数sys_time
系统调用在内核代码中的工做机制和初始化操作系统
系统调用就是特殊的一种中断
系统调用:线程
进程的描述:进程描述符task_struct数据结构翻译
Linux经过复制父进程来建立一个新进程,经过调用do_fork来实现并为每一个新建立的进程动态地分配一个task_struct结构
执行起点与内核堆栈保证一致:设置子进程的ip以前:childregs = current_pt_regs();将父进程的regs参数赋值到子进程的内核堆栈,其中存放了SAVE_ALL中压入栈的参数
新进程的开始:copy_thread()中:p->thread.ip = (unsigned long) ret _from _fork;将子进程的 eip 设置为ret_from _fork的首地址,子进程从ret_from_fork开始执行的
进程的建立:
使用gdb跟踪建立新进程的过程
可执行程序的装载
------------------
浅析动态连接的可执行程序的装载
进程切换的关键代码switch_to分析:
首先系统的了解操做系统内核的相关结构和设计原理,学会了新知识gdb调试的与分析内核代码的方法。并且经过本次mooc的学习过程当中,我学到的不只是知识,还有的就是学习的能力。一方面是本身学习知识的能力本身阅读书籍,从书中得到知识的能力。还有就是本身动手作实验的能力,再也不是单纯的从课堂中从课本里从老师地口中获取知识,也能够从本身的自主地学习中获取知识。
可是因为基础知识的不够扎实致使了后面学习上遇到了一些困难,之后学习须要重视基础知识的掌握。在关于操做系统内核的学习还并非那么的清晰,有些知识点虽然已经学到但运用起来还并不熟练。还有就是关于操做系统内核的知识还没能很好的将其组架成一个完整的知识框架,该部分知识还有待学习。
学习总结:
第一周:http://www.cnblogs.com/SUJUr/p/5211488.html
第二周:http://www.cnblogs.com/SUJUr/p/5244505.html
第三周:http://www.cnblogs.com/SUJUr/p/5255808.html
第四周:http://www.cnblogs.com/SUJUr/p/5281234.html
第五周:http://www.cnblogs.com/SUJUr/p/5316270.html
第六周:http://www.cnblogs.com/SUJUr/p/5330536.html
第七周:http://www.cnblogs.com/SUJUr/p/5359978.html
第八周:http://www.cnblogs.com/SUJUr/p/5392271.html