Linux内核设计期中总结

版权声明:本文为博主原创文章,未经博主允许不得转载。


前八周博客汇总及总结

Linux内核设计第一周——从汇编语言出发理解计算机工作原理

我们学习了汇编语言的基础知识,这一部分和内核代码没有直接的关系,但是,老师具体带我们了解了函数调用过程中的堆栈变化,以及函数在调用的过程中是如何传递参数的。这一部分是为了之后学习进程上下文切换、中断上下文切换打基础的。

Linux内核设计第二周——操作系统工作原理

老师编写了一个简单小型的内核代码,并带领我们阅读了其中的关键代码。主要介绍了my_ schedule函数、my_ start_ kernel函数以及自己编写的中断处理程序my_ time_ handler函数。利用这三个函数,就可以模拟内核进行中断上下文切换的过程。与之相关的,还定义了mypcd的数据结构,通过自定义进程PCB结构,理解进程调度级进程上下文切换的大致过程。

Linux内核设计第三周——构造一个简单的Linux系统

老师利用了一个简单的Linux内核MenuOS系统,来为我们介绍了操作系统内核启动的过程。学习了如何使用gdb进行内核调试,通过在关键函数位置设置断点,单步调试,逐步分析每一句代码的作用。这一周最重要的部分就是教给我们如何通过gdb调试学习内核代码,这个能力在之后的各个章节中都有体现。

Linux内核设计第四周——扒开系统调用三层皮(上)

第四周我们学习了系统调用的相关知识,理解了系统调用是沟通用户态和内核态的枢纽,是两者间联系的通道。其次,我们通过编写汇编代码,来理解系统调用机制。要注意,使用汇编语言编写系统调用代码时,要注意寄存器传递参数和堆栈传递参数的区别,不要弄混,在系统调用中,使用的是寄存器传递参数。

Linux内核设计第五周——扒开系统调用三层皮(下)

第五周是在第四周的基础上,将自己用汇编代码修改的系统调用函数,添加到MenuOS中,这就需要我们修改内核代码,增加新的系统调用,以及学习如何重新加载,编译写好的代码。在这个周,老师重点带我们分析了系统调用是如何返回的,即内核如何执行从syscall_ call到iret的过程,包括一些具体的细节。

Linux内核设计第六周——进程的描述和创建

主要讲了进程的描述和创建,具体到进程的控制块pcb的组织形式,以及进程创建设计到的数据结构;详细分析了task_ struct结构的组成,以及其各部分的用途;分析了fork系统调用的执行过程和返回原理,强调了fork创建的子进程时通过ret_ from_ fork返回的;从sys_ clone代码出发,分析了do_ fork函数执行的关键过程。

Linux内核设计第七周——可执行程序的装载

本周主要讲解了Linux系统中的文件格式——ELF格式,具体到ELF格式的起源发展、ELF文件格式的分类、具体文件头的组成等。还介绍了程序是如何在计算机中执行的,即经过预编译、编译、汇编、链接的过程完成的。同时介绍了可执行程序的静态加载过程和动态加载过程。

Linux内核设计第八周——进程的切换和系统的一般执行过程

本周主要围绕进程的切换讲解,分析了I/O型进程调度和CPU密集型进程调度的区别和设计原则,介绍了批处理进程、实时进程和交互式进程的优劣;以及Linux内核的优先级策略的设计;分析了用户态进程调度和内核态进程调度的不同;分析了进程上下文切换过程中,关键部分的代码,包括堆栈的变化,以及内核态堆栈中传递参数的过程;分析汇编代码,从细节出发,分析前后两个进程切换的交界点;最终,总结出Linux系统的一般执行过程。

我的一些总结和理解

  • 0、具体理解详见博客汇总中的每周总结。

  • 1、内核设计是针对操作系统而言的。不同的操作系统内核的设计是不同的。

(我们为什么研究linux系统是因为Linux系统的内核代码是开源的,我们可以直接分析它的源代码,而windows系统的内核代码是私有的,我们不易获得,不过,内核的设计虽然有细节的差异,但是总的思路和原理是共通的)。

  • 2、对linux操作系统的理解。

我认为linux系统是这样运行的:

  • 首先由0号进程idle创建其子进程1号进程init和2号进程kthreadd;
  • 1号进程init是所有用户态进程的祖先,init将会创建新的子进程用来执行用户命令;
  • 2号进程kthreadd是所有内核线程的祖先。
  • 在这个过程中,有可能会发生冲突,根据进程优先级的不同,或者该进程是否是I/O密集型进程来决定谁先抢占CPU,这涉及到进程调度策略,并且在这个过程中会发生进程切换。
  • 进程切换的具体细节,就涉及到内核堆栈和用户堆栈之间数据保存和交换,即保存进程上下文。
  • 进程是依附于程序存在的,这就需要读取文件信息,通过预编译、编译、汇编、链接,生成可执行未见,才能执行。Linux中大部分可执行文件都是ELF格式,通过该格式文件头信息,可以找到程序执行的起点。
  • 2、在学习《Linux内核分析》课程中最大的收获?
  • 第一次了解了操作系统内核的相关结构和设计原理;
  • 被内核设计者严谨的逻辑和巧妙的设计所折服;
  • 虽然,学完linux内核分析之后我并不能自己编写一个小型的操作系统,但是我学会了分析内核代码的方法,如何使用gdb调试内核代码,以及在调试的过程中,理解内核代码的具体实现。
  • 授人以鱼不如授人以渔。我感觉学习这么课我最大的收获,就是学会了学习内核代码的方法,这远比理解一种内核设计重要的多,也有用的多。
  • 3、学习完《Linux内核分析》课程后您最大的遗憾是什么?

我最大的遗憾就是,在进程课程的过程中,对内核代码没有完全理解,只是对关键代码有一定的了解,我相信内核部分的学习远远不是短短几个周就可以学习的充分的,我应该在以后的学习中,多多关注内核部分的设计和实现,必要的时候,亲自动手实践。在实践的过程中,加深对所学知识的理解。

《Linux内核分析》期末总结的更多相关文章

  1. Linux内核分析 期末总结

    Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...

  2. LINUX内核分析期末总结

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.课程总结 1 ...

  3. Linux内核分析——期末总结

    Linux内核学习总结 首先非常感谢网易云课堂这个平台,让我能够在课下学习,课上加强,体会翻转课堂的乐趣.孟宁老师的课程循序渐进,虽然偶尔我学习地不是很透彻,但能够在后续的课程中进一步巩固学习,更加深 ...

  4. 网易云课堂-----Linux内核分析-----期末主观题

    姚歌 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 下面是对8个课题的 ...

  5. 期末总结:LINUX内核分析与设计期末总结

    朱国庆原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一,心得体会 关于网上听课这 ...

  6. 《Linux内核分析》期末总结及学习心得

    [洪韶武 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ] 一.学习心得 本学 ...

  7. 期末总结20135320赵瀚青LINUX内核分析与设计期末总结

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 对LINUX内核分析与设计这 ...

  8. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  9. Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序

            1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...

随机推荐

  1. 笔记本双系统XP与Ubuntu,重装XP后如何恢复grup引导,另附操作系统启动过程

    背景:笔记本双系统(XP与Ubuntu),其中XP系统因问题重装了一下,重装后不能识别Ubuntu系统(该系统装在另一个磁盘中),直接进入了XP系统. 解决办法:利用U盘(Ubuntu系统)启动机器, ...

  2. 关于readonly修饰符

    修饰字段: 1.值类型:不能修改值 2.引用类型:是指该字段引用的对象不可以修改,但是里面的内容是可以修改的! 示例: static void Main(string[] args) { Consol ...

  3. [C++][数据结构]栈(stack)的实现

    对于栈的定义,前人之述备矣. 我实现的是一个stack<value>容器类,支持push,pop,top,size,empty,clear和copy construction操作. 主要的 ...

  4. jrebel实现tomcat热部署

    -noverify -javaagent:D:\jrebel.jar 注:频繁切换工程的时候,热部署可能会失效; 解决办法是:先把项目拖到tomcat下发布,然后在没有配置上面这行代码的情况下,让项目 ...

  5. HTML5离线Web应用实战:五步创建成功

    [IT168 技术]HTML5近十年来发展得如火如荼,在HTML 5平台上,视频,音频,图象,动画,以及同电脑的交互都被标准化.HTML功能越来越丰富,支持图片上传拖拽.支持localstorage. ...

  6. 《DSP using MATLAB》示例Example5.16

    代码: x1 = [1,2,2,1]; x2 = [1,-1,-1,1]; x3 = conv(x1,x2); % N = 5 n1 = 0:1:length(x1)-1; n2 = 0:1:leng ...

  7. 【Unity3d游戏开发】UGUI插件入门之游戏菜单

    ugui是unity4.6开始加入的一个新的ui系统,非常强大,下面我们将通过一系列博客的方式一起来学习一下ugui的使用.本篇博客会介绍如何使用ugui制作一个游戏菜单,并且了解如何让物体与ugui ...

  8. Linux Kernel Oops异常分析

    1.PowerPC小系统内核异常分析 1.1  异常打印 Unable to handle kernel paging request for data at address 0x36fef31eFa ...

  9. 【系统篇】从C/C++语言到进程启动背后的故事

    我们需要运行一个程序或者软件,双击之即可完成.不过从你双击到程序的窗口产生的这“短暂”的时间内,Windows为你做了很多的工作. 首先,系统有一个进程监测到了你的双击操作,这个进程就是系统shell ...

  10. HTML结构化

    目的:为开发页面时有一套明确的页面结构化实施方案,提高开发效率: HTML结构化指的其实就是使用HTML语义化标签根据web标准书写具有明确结构逻辑的HTML代码的一种思路: 说白了重点就是:页面实际 ...