序:写在前面的话
本次内容作为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.内存.磁盘 ...
随机推荐
- CDLinux 自动休眠功能的关闭方法
CDLinux 自动休眠功能的关闭方法: 控制台下使用xset命令来完成. xset q 可以查看当前屏幕保护和电源管理的状态信息 具体设置时,常用的有以下参数: xset s //这个参数设置屏 ...
- LeetCode 6:Excel Sheet Column Number
Given a column title as appear in an Excel sheet, return its corresponding column number. For exampl ...
- mysql五:数据操作
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- 如何在 Linux 上锁定虚拟控制台会话
当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么.如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统.要感谢 Vlock(Vi ...
- Linux执行shell脚本方式及区别&命令后台运行
Linux执行shell脚本方式及区别&命令后台运行 http://blog.csdn.net/heqiyu34/article/details/19089951/
- SuSE Linux修改网卡配置
http://blog.chinaunix.net/uid-20765159-id-1850854.html SuSE Linux修改网卡配置 2010 SuSE linux ...
- PL/SQL 01 代码编写规则
1.标识符命名规则当在 PL/SQL 中使用标识符定义变量.常量时,标识符名称必须以字符开始,并且长度不能超过 30 个字符.另外,为了提高程序的可读性,Oracle 建议用户按照以下规则定义各种标识 ...
- 请求参数中的"+"号为什么会丢失,如何保证参数完整
最近在开发中碰见一个问题,后端代码调用接口,在请求端参数没有任何问题,但是当接口接收到参数时,其中的加号全部变为了空格. 在查阅资料后发现是URLDecoder方法的问题,以下是URLDecoder的 ...
- 学习PHPCMS需要掌握的函数
路径:phpcms\libs\classes\model.class.php /** * 执行sql查询 * @param $where 查询条件[例`name`='$name'] * @param ...
- Python与数据结构[3] -> 树/Tree[0] -> 二叉树及遍历二叉树的 Python 实现
二叉树 / Binary Tree 二叉树是树结构的一种,但二叉树的每一个节点都最多只能有两个子节点. Binary Tree: 00 |_____ | | 00 00 |__ |__ | | | | ...