潘恒 原创做品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000html
简单模拟内核代码
主要包括: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
系统调用在内核代码中的工做机制和初始化spa
系统调用就是特殊的一种中断
系统调用:操作系统
进程的描述:进程描述符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分析:
每周若是静下心来学习总结相应课程的话确实会感到有所收获,但本人以为虽然内容不错,每每看完视频写完做业就不会记忆深入了,仍是要经常复习,多加以实践才能掌握linux内核的真正原理。往后遇到实践复习的机会必定要好好把握,就这半学期的学习来讲仍是掌握的很差,深层次的理解远远不够。