linux世界很大,我想去学学。
从第一周到现在,每周的博客分享对我的帮助很大。不仅将自己学到的东西写下来加深了印象,同时也方便自己和别人日后查阅。虽然只是入门讲解,但是希望能对像笔者一样的菜鸟有帮助。
一、每周bolg汇总
下面是对每周blog的一个导航和概述。
第一周:浅谈计算机是如何工作的
通过这个简单的c程序,大致分析了计算机的工作情况,主要是栈的调用。冯诺依曼机指出程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作,也即存储程序计算机。涉及到函数堆栈、反汇编、AT&T汇编基础、操作系统概述等知识。
第二周:从一个简单的内核看操作系统的工作
这周主要了解操作系统是怎样工作的。计算机三大法宝:存储程序计算机、堆栈和中断机制。通过分析一个小型的kernel代码初步了解进程切换的过程。mykernel是一个模拟linux的精简内核,不过以小见大,类比推理,我们可以猜测linux进程切换也是这样。进程切换中上下文的切换、地址空间变化、堆栈的变化等等。Linux是一个多进程的操作系统,所以,其他的进程必须等到正在运行的进程空闲CPU后才能运行。当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程。
第三周:追随Linux内核启动的脚步
了解了计算机工作原理,操作系统工作原理,下面就该了解内核是如何启动或者说内核启动时都发生了什么。根据老师构造的MenuOS系统,采用gdb调试的方法分析内核从start_kernel到init进程启动的过程。系统进入start_kernel之前进行了一些最低限度的初始化工作,即对内存管理和各子系统的数据结构初始化。在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要任务就是创建并启动内核线程init。系统创建的第一个进程---idle,其pid号为 0。init进程(pid=1)是另一个比较特殊的进程,它是Linux内核开始建立起进程概念时第一个通过kernel_thread产生的进程。
第四周:浅谈Linux系统调用
所谓系统调用就是用户在程序中调用操作系统所提供的一些子功能,系统调用可以被看作特殊的公共子程序。它把用户从底层的硬件编程中解放出来,极大的提高了系统的安全性,同时也使用户程序移植性变为可能。
第五周:linux中system_call中断处理过程
本周主要是对系统调用过程的分析。用户通过执行int 0x80汇编指令,使自己从用户态切换到了内核态。通过执行ireq汇编指令,从系统调用中退出。当用户进程发出int 0x80指令时,cpu切换到内核态并开始从地址system_call处开始执行指令。当系统调用服务例程结束时,system_call()函数从eax获得返回值。如果所有标志都没有被设置,函数跳到restore_all处执行,并执行ireq。
第六周:fork()是如何创建新进程的
一个简化版的do_fork执行如下:
(1)alloc_pid()。给新的进程分配一个新的pid,即进程号。
(2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理、文件描述符和进程的代码数据等。
(3)wake_up_new_task()。计算此进程的优先级和其他调度参数,将新的进程加入到进程调度队列并设此进程为可被调度的,以后这个进程可以被进程调度模块调度执行。
第七周:浅析linux可执行文件
本节内容涉及到可执行文件elf,预处理、装载、链接,exec()函数等。可执行文件是一个普通文件,它描述了如何初始化一个新的执行上下文,也就是如何开始一个新的计算。同样我们利用gdb跟踪调试一个程序的具体体执行过程,从而更加深入的理解程序在内核中是如何被装载和编译连接执行的。
第八周:浅谈linux进程调度
本周对进程调度做了深入分析,在第二周中,我们知道了进程切换的一些情况,这里我们着重分析schedule()函数和switch_to宏。schedule()函数实现了进程的调度。它的任务就是从运行队列的链表里找到一个进程,然后将cpu的资源分配给他。进程切换的第二步由switch_to宏执行。它是内核中与硬件关系最密切的例程之一。
二、课程总结
八周的课程很短也很充实。虽然上课的内容有限,但最重要的是学习linux的方法的掌握。linux是一个杰作,短时间内我只能懂其皮毛。长期来看,学到方法是更重要的事。就像老师所说那样:天下大事必作于细,天下难事必作于易。不能一口吃个胖子,但是可以化难为易,化整为零。另外很重要的一点是,不去一行行空读代码,而是先了解整体框架,细节之处慢慢理解,关键之处逐步分析。还有就是要学会类比的学,对比的学,这样才来的深刻。当然,随时记录下学习过程,学习心得也很重要。
毕竟时间偏短,课上没有涉及到内存管理的相关内容,自己也没有花时间去了解,这是很大的遗憾。当然,日后必定会对内存管理进行仔细分析。