序:写在前面的话
本次内容作为Linux内核的总结内容,主要涉及对Linux系统的总体的一些理解,同时将之前的一些总结贴出来作为大家的一个索引,希望笔者的博客能对和笔者一样的菜鸟有一些帮助和入门的作用。从一个初学者的角度对Linux有一个较为整体的印象,从而加速对Linux操作系统的理解。
一、Linux内核分析系列文章简介及导航
下面就是本系列博客的文章目录,后期还会更加细致的对每个环节进行补充,这一系列【Linux内核分析(一)至(九)】作为系统的入门概览希望大家能够在一个较为总体的层次上对Linux有所了解。下面给出文章的列表供作为目录参考:
涉及内容(函数堆栈、反汇编C程序、AT&T汇编基础讲解、操作系统概述)
本节内容简述了在Linux操作系统中是如何调度各个进程的。实际上我们知道现代的操作系统都是多任务的操作系统。那么这些任务或者说进程之间是采用什么要的机制决定哪个先被执行,哪个后被执行呢?事实上这些就是进程调度所关注的问题。我们知道Linux内核是一个基于分时的调度机制,所以我们也可以简单的理解为同一时刻只有一个进程在CPU中真正的执行着。
涉及内容(mykernel内核中进程的切换源代码分析、进程的数据结构组织、进程的切换过程)
本节介绍了一个基于时间片轮转的建议操作系统内核代码。分析了操作系统中进程之间是如何进行切换的。通过对mykernel的源代码分析,体会进程在切换过程中操作系统对进程运行环境的管理。事实上有时候我们可以把它叫做运行框架,也可以说是上下文,现场环境等等。实际上这些东西指的都是程序运行时候的堆栈,运行内存空间的地址,寄存器值的集合。因为程序运行需要改变他们,而他们中的一些也许会被其他程序运行时改变,所以在切换进程的时候要对所有进程恢复当前状态的系统资源进行保存,这就是切换的核心。
3、
涉及内容(Linux系统的启动分析(start_kernel)、BIOS的结构、操作系统启动的各历史时期简介)
涉及内容(系统调用的基本概念、系统调用的实现、系统调用的过程、内核态、用户态)
本文介绍了如何通过两种方式实现一个系统调用的。一种是通过系统API函数的方式实现,另外一种通过软中断int0x80来实现,通过软中断实现的时候,我们需要在之前先传入中断入口参数,然后中断时候系统就可以知道要执行哪个服务程序。入口参数就是一些必要的标识和系统执行这个功能必要的输入数据。
涉及内容(系统调用的过程详解、用户态内核态的切换)
我们知道操作系统为在用户态运行的进程与硬件设备进行交互提供了一组几口。在应用程序与硬件之间设置一个额外的层实际上是有很多优点的——所谓的系统调用。首先这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来。其次,着极大的提高了系统的安全性,因为内核在试图满足某个请求之前在接口级别上就可以检查这种请求是否是正确的合法的。最后更为重要的是,这些接口是的程序更具有可以执行,因为只要内核所提供的一组接口相同,那么在任意一个内核之上就可以正确的编译和执行我们编写的程序了。Linux系统就是通过内核发出的系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口。最后我们还是以一张图来从很抽象的层次说明这件事情。
涉及内容(进程的创建、fork)
涉及内容(可执行程序的加载、execve)
本节的内容主要讲述了程序在系统中是如何被装载和执行的,另外我们将介绍ELF格式的文件的一些内容,这个文件实际上是用来描述程序一些执行时候被用到的属性,例如他的堆栈信息之类的。然后我们将利用实验的方式跟踪调试一个程序的具体体执行过程,从而更加深入的理解程序在内核中是如何被装载和编译连接执行的。同时介绍一下新可执行程序的执行起点及对应的堆栈状态,以及笔者对其的一些理解。
涉及内容(Linux进程切换代码分析、switch_to、进程相关的数据结构简析)
二、课程总结篇
经过两个月的学习,对操作系统的启动、系统功能调用、函数堆栈、进程的创建、切换和可执行程序加载有了较为详细的了解。比较遗憾的是没有进行关于存储管理内容和调度算法的涉及,笔者会在之后的文章中更加详细的阐述Linux系统的各方面内容。(笔者在计算机系统上的目标就是自己写一个内核并把它成功运行在一个嵌入式处理器上,我觉得笔者还有好多需要学习,越学习发现不会的越多╮(╯▽╰)╭)
下面我们来总结一些Linux操作系统的一些内容,首先要明确操作系统主要只做一件事情就是资源管理,包括存储资源和处理资源。
存储资源这一系列我们没有主要涉及,实际上就是对内存和外部存储器比如硬盘的管理。这部分的内容大体上就是一个调度的问题,实际上处理资源也是个调度的问题,所以我们也可以说操作系统就是一个解决资源调度的软件。那么存储资源的调度实际上是由于存储结构分层所导致的。举个简单的例子CPU的缓存(catch)很快但是不大,内存呢比他大但是比他慢一些,一个作业或者程序不可能完全调入catch中,但是运行时候CPU是直接从catch中取数据和指令的,所以有的时候程序的一些执行指令和数据在内存中却不在catch中,这个时候就需要从内存中调出此时用到的数据放入catch,这个调度是基于局部性原理的策略进行的。那么同样的事情也发生在内存和硬盘中间。这就是存储的管理。同时此部分还涉及外存到底如何组织大量的数据(文件结构、磁盘格式等)从而方便人们查找。
处理资源主要我们指的是程序的执行,我们知道程序的一个可执行实例是进程,里面包含了代码可以运行的最基本数据集合。那么从时间的维度上看,操作系统如何加载一个程序就是我们首先需要关心的,Linux中是把这个程序的执行地址的开头作为参数传递给操作系统然后由系统将它启动,系列文章中有涉及。从宏观的角度上看,任务或者说程序被实例化成很多的进程,作为允许多进程同时运行的系统,Linux是如何在进程之间进行切换的呢?实际上我们在文章中有介绍Linux进程创建和切换源代码的分析。这就好比你在做作业,比如你在做数学,用到了计算器,草算纸,做到一半你忽然需要看数学书了,这个时候你要记住你做到哪一个题、计算这个题的一些中间结果在草纸上要标记一下、看完书回来你才可以继续做这道题。进程切换也是这样的一个过程,包括中断处理也是这样的过程,你需要保存你正在做的这件事情的上下文(哪道题、计算的中间结果等等)然后再去做别的,这样保证你回来继续做的时候能够连贯不出错。这里面看出操作系统实际上在处理任务的时候和人有一定的相似性。从微观的角度来看,函数的调用也是上述这个过程,你需要知道怎么回到调用你的函数继续执行。系统调用也同样是这个思路。那么所有的这些保存的信息都是用堆栈完成的。
此外,再就是系统的启动过程和一些调试技巧,我们每篇文章都有实验过程的详述大家可以好好交流一下。那么这一阶段的Linux内核分析初级系列就这样结束了,感谢USTC孟宁老师以及网易云课堂《Linux内核分析》课程,希望有兴趣的同学继续参加下一期的学期。日后笔者也将继续更新这个博客希望能被更多的人看到,给更多的人起到一些学习上的帮助作用。
- Linux内核分析之操作系统是如何工作的
在本周的课程中,孟老师主要讲解了操作系统是如何工作的,我根据自己的理解写了这篇博客,请各位小伙伴多多指正. 一.知识点总结 1. 三个法宝 存储程序计算机:所有计算机基础性的逻辑框架. 堆栈:高级语言 ...
- linux内核分析 课程总结
Linux内核分析 链接汇总 Linux内核分析第一周学习总结--计算机是如何工作的 Linux内核分析第二周学习总结--操作系统是如何工作的 Linux内核分析第三周学习总结--构造一个简单的Lin ...
- Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质
原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...
- Linux内核分析(二)----内核模块简介|简单内核模块实现
原文:Linux内核分析(二)----内核模块简介|简单内核模块实现 Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某 ...
- Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装
原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...
- 【转】一文掌握 Linux 性能分析之网络篇(续)
[转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...
- 【转】一文掌握 Linux 性能分析之网络篇
[转]一文掌握 Linux 性能分析之网络篇 比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看.监控,又包括网络链路上的包转发时延.吞吐量.带宽等指标分析.包括但不限于以下分析工具: pin ...
- 【转】一文掌握 Linux 性能分析之内存篇
[转]一文掌握 Linux 性能分析之内存篇 前面我们已经学习了 CPU 篇,这篇来看下内存篇. 01 内存信息 同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法. 1.1 /pro ...
- 【转】一文掌握 Linux 性能分析之 CPU 篇
[转]一文掌握 Linux 性能分析之 CPU 篇 平常工作会涉及到一些 Linux 性能分析的问题,因此决定总结一下常用的一些性能分析手段,仅供参考. 说到性能分析,基本上就是 CPU.内存.磁盘 ...
随机推荐
- Python阶段复习 - part 2 - Python序列/持久化
1. 把一个数字的list从小到大排序,然后写入文件,然后从文件中读取出来文件内容,然后反序,在追加到文件的下一行中 >>> import json >>> imp ...
- Python学习笔记 - day4 - 流程控制
Python流程控制 Python中的流程控制主要包含两部分:条件判断和循环. Python的缩进和语法 为什么要在这里说缩进和语法,是因为将要学习的条件判断和分支将会涉及到多行代码,在java.c等 ...
- 用python写爬虫笔记(一)
https://bitbucket.org/wswp/code http://example.webscraping.com http://www.w3schools.com selenium.g ...
- redis SCAN cursor
https://redis.io/commands/scan 可以看到: sscan的返回结果,有两部分, 第一部分 是一个数字.其实代表一个游标. 第二部分 是结果. scan是以游标为基础,每 ...
- Selenium2+python自动化55-unittest之装饰器(@classmethod)【转载】
前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...
- Selenium2+python自动化20-Excel数据参数化【转载】
前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ...
- 使用bottle进行web开发(9):文件上传;json传递
1.文件上传 如果要完成文件上传,则需要对上文的form做一点改动,具体如下: <form action="/upload" method="post" ...
- python基础之初识python
Python的发展史 1989年圣诞节期间,吉多·范罗苏姆为了打发时间,开发了python这门语言.真他妈牛逼. Python崇尚优美.清晰.简单,是一门优秀并广泛使用的语言.2007年在TIOBE榜 ...
- AC日记——病毒侵袭 hdu 2896
2896 思路: 好题: 代码: #include <queue> #include <cstdio> #include <cstring> using names ...
- MySQL 使用硬链接配合truncate 删除2.2T的表
1 创建tmp 表并 rename 表 mysql> rename table ep to ep_bak; Query OK, 0 rows affected (0.07 sec) mysql& ...