Linux内核学习总结html
贺邦linux
原创做品转载请注明出处函数
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000学习
1、博客做业目录。操作系统
1. 从C简单程序的汇编代码入手,以理解计算机工做原理。rest
http://www.cnblogs.com/L1nke/p/5218790.htmlcode
2. LINUX内核分析:完成一个简单的时间片轮转多道程序内核代码。htm
http://www.cnblogs.com/L1nke/p/5247152.htmlblog
3. LINUX内核分析 实验三:跟踪分析LINUX内核的启动过程。进程
http://www.cnblogs.com/L1nke/p/5270262.html
4.实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用。
http://www.cnblogs.com/L1nke/p/5297663.html
5. 实验五:分析SYSTEM_CALL中断处理过程。(PS.提交做业的时候链接提交错了 ….以至分很低)
http://www.cnblogs.com/L1nke/p/5323966.html
6. 分析LINUX内核建立一个新进程的过程。
http://www.cnblogs.com/L1nke/p/5347984.html
7. LINUX内核如何装载和启动一个可执行程序。
http://www.cnblogs.com/L1nke/p/5374617.html
8. 理解进程调度时机跟踪分析进程调度与进程切换的过程。
http://www.cnblogs.com/L1nke/p/5401757.html
2、学习心得。
1. 图解分析汇编代码以理解计算机是如何工做的
冯诺依曼体系结构的计算机,又叫存储程序计算机,从硬件的角度来看,其工做模型是CPU依次读取内存中的指令来完成工做。其核心思想是:数制采用二进制,计算机应该按照程序顺序执行。
汇编语言的五种寻址模式:1.寄存器寻址 registermode 2. 当即寻址 immediate 3.直接寻址 direct 4. 间接寻址 indirect 5.变址寻址 displaced
2. 基于mykernel的一个简单的时间片轮转多道程序内核代码分析
mykernel是由老师创建的一个用于开放您本身的操做系统的内核平台,它基于Linux Kernel 3.9.4 source code。经过本讲的学习和实验,咱们知道操做系统的核心功能就是:进程调度和中断机制,经过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可使用户能够很容易操做的计算机系统。
3. 使用gdb跟踪Linux内核启动过程
start_kernel()是内核的汇编与C语言的交接点,在该函数之前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工做。start_kernel就像是c代码中的main函数。无论你关注Linux的内核模块,老是离不开start_kernel函数的,由于大部分模块的初始化工做都是在start_kernel中完成的。按照这节课的实验步骤,咱们能够跟踪Linux内核的启动过程。
4. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
即使是最简单的程序,也不免要用到诸如输入、输出以及退出等操做,而要进行这些操做则须要调用操做系统所提供的服务,也就是系统调用。除非你的程序只完成加减乘除等数学运算,不然将很难避免使用系统调用。在 Linux 平台下有两种方式来使用系统调用:利用封装后的 C 库(libc)或者经过汇编直接调用。这篇文章从示例出发,介绍了系统调用的概念,以及如何使用系统调用。
5. 分析system_call中断处里过程
经过gdb咱们能够给系统调用内核处里程序如sys_write, sys_time设置断点,并让程序停在断点处,进行断点跟踪系统调用处里过程。因为system_call是彻底用汇编写就一个的函数,虽然咱们也能够在system_call处设置断点,但却没法让系统停在system_call处,因此也没法经过单步跟踪学习其处里流程。但system_call是全部系统调用的入口,也是程序由用户态转入内核态执行时没法越过的一个函数,其重要性不言而喻,因此咱们跟随老师简化的汇编代码以及源代码学习其主要的流程。
6. 初学Linux进程的描述和进程的建立
为了管理进程,内核必须对每一个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。进程描述符task_struct的源码连接:http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235。在Linux应用程序的开发中,能够经过fork、vfork和clone等API来建立一个子进程,它们在Linux内核中对应的系统调用分别为sys_fork、sys_vfork和sys_clone函数,而这些函数最终都会调用do_fork完成子进程的建立。do_fork主要是复制了父进程的task_struct,而后修改必要的信息,从而获得子进程的task_struct。
7. 初学《Linux内核如何装载和启动一个可执行程序》
Linux系统能够经过execve API启动一个新进程,该API又呼叫sys_execve系统调用,负责将新的程序代码和数据替换到新的进程中,打开可执行 文件,载入依赖的库文件,申请新的内存空间,最后执行 start_thread(regs, elf_entry, bprm->p) ,设置 new_ip, new_sp ,完成新进程的代码和数据替换,而后返回,接下来就是执行新的进程代码了。
8. 初学Linux中进程调度与进程切换过程
Linux系统的通常执行过程,最通常的状况是:正在运行的用户态进程X切换到运行用户态进程Y的过程要通过如下步骤
1). 正在运行的用户态进程X
2). 发生中断:save cs:eip/esp/eflags(current) to kernel stack, then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
3). SAVE_ALL //保存现场,这里是已经进入内核中断处里过程
4). 中断处理过程当中或中断返回前调用了schedule(),其中的switch_to作了关键的进程上下文切换
5). 标号1以后开始运行用户态进程Y(这里Y曾经经过以上步骤被切换出去过所以能够从标号1继续执行)
6). restore_all //恢复现场
7). iret - pop cs:eip/ss:esp/eflags from kernel stack
8). 继续运行用户态进程Y
3、收获与感悟。
八周的学习,转瞬即逝,孟老师为咱们在LINUX学习道路上打开了一扇窗,很感激老师的辛苦付出。八周的学习,也只是浅尝辄止,将来我也会继续学习LINUX。
前几周的内容仍是很轻松的,不过进程切换仍是很难以理解,还须要再学习。