linux内核是单块结构
Linux能动态的按需装载或卸载模块
Linux内核线程以一种十分受限制的方式来周期性地执行几个内核函数,因为linux内核线程不能执行用户程序,因此,她们并不代表基本的可执行上下文的抽象
Linux支持多线程应用
Linux是非抢占式的内核
Linux支持多处理器
Linux文件系统有了强大的面对对象的虚拟文件系统技术,把外部文件系统移植到linux就变得相对容易了
Linux流

多用户系统:
一台能并发和独立的执行分别属于两个或多个用户的若干应用程序的计算机

为了确保能实现这些安全保护机制,操作系统必须利用与CPU特权相关的硬件保护机制。
用户和组:

操作系统只允许有非抢占式进程,这就意味着,只有当进程自愿放弃CPU时,调度程序才被调用。但是,多用户系统中的进程调度必须是抢占式的。操作系统记录下每个进程占有的CPU时间,并周期性的激活调度程序。
模块:

文件:
文件是以一列字节组成的信息载体(container),内核不解释文件的内容。很多编程的库函数实现了更高级的抽象。这些库中的程序必须依靠内核提供系统调用。
每个进程都有一个当前的工作目录,他属于进程执行上下文(execution context),标识出进程所用的当前目录。
硬链接和软连接:
包含在一个目录中的文件名就是一个文件的硬链接(hard link),在同一个目录或不同目录中,同一文件可以有几个链接。
硬链接限制:

为了克服这些限制,引入软连接(symbolic link),软连接是一个断文件,这个文件包含了另一个文件的任意路径名,这个路径名指向的位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。

文件描述符和索引节点:
将文件和文件描述符(file descriptor)区分的非常清楚
文件系统用来管理文件的所有信息包含在一个叫做索引节点的数据结构中。
Inode节点必须提供以下属性:
文件类型;与文件相关的硬链接个数;以字节为单位的文件长度;设备标识符;用来在文件系统中标识文件的索引节点号;文件拥有者(UID);文件所属组(GID);几个时间标记(状态改变,最后访问,最后修改);访问权限和文件模式。
访问权限和文件模式:
文件潜在的用户分为三种类型:作为这个文件所有者的用户;同组用户,不包括所有者;所有剩下的用户。
文件操作的系统调用:

一个打开的文件对象包括:
Fd=open(path(相对或绝对), flag(打开方式), mode(访问权限))

Posix标准所指定的一般特性:

访问一个打开的文件:
正规文件,可以顺序的访问,也可随机的访问,而对设备文件和命令管道文件,通常只能顺序的访问。

内核概述:
内核提供了应用程序可以运行的执行环境,因此,内核必须实现一组服务及相应的接口。应用程序使用的这些接口,通常不会与硬件资源直接打交道。
进程/内核模式:

进程的执行:为了让内核管理进程,每个进程由一个进程描述符(process descriptor)表示,这个描述符包含有关进程当前状态的信息。

可重入(reentrant)内核:
所有unix内核都是可重入的,这就意味着这几个进程可以同时在内核态下执行。当然,在单处理器系统上,只有一个进程在真正运行,但是许多进程可以在内核态下被阻赛,或等待CPU,或等待一些I/O操作完成。例如,当内核代表进程发出一个读请求后,就让磁盘控制器处理这个请求,并将恢复其他进程的执行。当这个设备满足了读请求时,一个中断就会通知内核,从而以前的进程可以恢复执行。
提供可重入的一种方式是编写函数,以便这些函数只能修改局部变量,而不能改变全局数据结构,这样的函数叫可重入函数。但可重入内核不仅仅局限于这样的
可重入函数。内核可以包含非重入函数,并且利用锁机制保证一次只有一个进程执行一个非重入函数。处于内核态的每个进程只能作用于自己的内存空间,不能干预其他的进程。
如果发生一个硬件中断,可重入内核能挂起当前正在执行的进程,即使这个进程处于内核态。这种能力非常重要的,因为这能提高发出中断的设备控制器的吞吐量。一旦设备发出一个中断,它一直等到CPU应答它为止。如果内核能够快速应答,在CPU处理中断的时候设备控制器将能执行其他任务。
进程地址空间:

进程间也能共享其部分地址空间来进行进程间通信,使用一种由system V引入并且已经被linux支持的“共享内存”技术。


同步和临界区:
实现可重入内核需要利用同步机制;如果作用于内核数据结构的内核控制路径被挂起,那么,其他的内核控制路径就不能再作用于该数据结构,除非他已被重新设置成一个一致性(consistent)状态。否则,两个控制路径的交互作用将破坏所储存的信息。
对全局变量的安全访问通过原子操作(atomic operation)来保证。内核包含很多不能用单一的操作访问的数据结构。例如:用单一的操作从链表中删除一个元素是不可能的,因为内核一次至少访问两个指针。临界区(critical region)是这样的一段代码,进入这段代码的进程必须完成以后,另一个进程才能进入。
怎么同步内核控制路径?
非抢占式内核:
当进程在内核态执行时,他不能被任意挂起,也不能被另一个进程代替。因此,在单处理器系统上,所有中断或异常处理程序不能更新内核数据结构,内核对他们的访问都是安全的。内核态的进程能自愿放弃CPU,但是,在这种情况下,他必须确保所有的数据结构处于一致性状态,此外,当这个进程恢复执行时,必须重新检查以前访问过的数据结构的值,因为这些数据结构有可能被改变。
非抢占能力在多处理器系统上是低效的,因为运行在不同CPU上的两个内核控制路径本可以并发地访问相同的数据结构。
关中断:
单处理器系统上的另一种同步机制是:在进入一个临界区之前禁止产生所有的硬件在这些情况下 ,多处理器操作系统使用了自旋锁机制。自旋锁与信号量相似,但没有进程链表:当一个进程发现锁被另一个进程锁着时,它就不停地“旋转”,不断执行一个指令的循环直到锁打开。
当然,自旋锁在单处理器环境下是无用的。当内核控制路径试图访问一个上锁的数据时,它开始无终止的循环。因此,正在更新受保护的数据结构的内核控制路劲将没有机会继续执行和释放这个自旋锁。最后的结果是系统挂起。
避免死锁:引入很有限的信号量权限类型和以递增的顺序请求信号量。
信号与进程间通信
信号提供了把系统事件报告给进程的一种机制。每种事件都有自己的信号编号,通常用一个符号常量来表示,两种系统事件:
异步通告:当用户在终端按下中断键,即向前台进程发出中断信号。
同步错误或异常:当进程访问内存非法地址时,内核向这个进程发送一个信号。
进程对信号的接收做出反应:忽略该信号;异步的执行一个指定的过程(信号处理程序)
如果进程不指定选择何种方式,内核就根据信号的编号执行一个缺省操作。五种可能的缺省操作是:终止进程;将执行上下文和进程地址空间的内容写入一个文件(核心转储core dump),并终止进程;忽略信号;挂起信号;如果进程曾被暂停,恢复他的执行。

僵死进程:父进程挂了,子进程还在运行。
解决办法使用init的特殊系统进程,当一个进程终止时,内核改变他的描述符中所有子进程的指针,使这些子进程成为init的孩子,init监控所有子进程的执行,除去所有僵死的进程。

进程组和登陆会话:
Unix操作系统引入了进程组(process group)的概念以表示“作业(job)”的抽象。


虚拟内存:
Unix系统都提供了一种有用的抽象,叫虚拟内存(virtual memory)。虚拟内存作为一种逻辑层,处于应用程序对内存的申请与硬件内存管理单元(memory management unit MMU)之间。虚拟内存有很多用途和优点:

写时复制策略:当一个新进程被创建时,内核仅仅把父进程的页框赋予子进程的地址空间,但是,把这些页框标记为只读。一旦父或子进程试图修改页中的内容时,一个异常就会发生。异常处理程序把新页框赋予受影响的进程,并用原来页中的内容初始化新页。

段选择符:
为了加快逻辑地址到线性地址的转换。

硬件的分页单元
分页单元(paging unit)把线性地址转换成物理地址。为了效率起见,线性地址被分成以固定长度为单位的组,称为页。

简单了解linux内核的更多相关文章

  1. 构造一个简单的Linux内核的MenuOS

    构造一个简单的Linux内核的MenuOS 20135109 高艺桐 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000 ...

  2. 通过简单的Linux内核启动程序代码窥探操作系统的启动原理

    作者:吴乐  山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...

  3. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

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

  4. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  5. Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统

    一.系统的启动(各历史节点) 在最开始的时候,计算机的启动实际上依靠一段二进制码,可以这么理解,他并不是一个真正的计算机启动一道程序.计算机在开始加电的时候几乎是没有任何用处的,因为RAM芯片中包括的 ...

  6. 《Linux内核分析》期末总结

    Linux内核设计期中总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 前八周博客汇总及总结 Linux内核设计第一周——从汇编语言出发理解计算机工作原理 我们学习了汇编语言的基础知识,这一 ...

  7. 《Linux及安全》期中总结&《Linux内核分析》期终总结

    [5216 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK NINE ...

  8. 从linux内核代码分析操作系统启动过程

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 在本次的实验中, ...

  9. Linux内核探索之路——关于方法

    转载自:http://blog.chinaunix.net/uid-20608849-id-3014502.html   Linux内核实践之路 -给那些想从Linux内核找点乐趣的人 一个不能回避的 ...

随机推荐

  1. Top 10 open source projects of 2015

    Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...

  2. mongodb Helper

    /// <summary> /// mongoDBHelper访问助手 /// </summary> public class mongoDBHelper { /// < ...

  3. SuperSocket命令和命令加载器

    关键字: 命令, 命令加载器, 多命令程序集 命令 (Command) SuperSocket 中的命令设计出来是为了处理来自客户端的请求的, 它在业务逻辑处理之中起到了很重要的作用. 命令类必须实现 ...

  4. Node.js 安装及环境配置 以及google浏览器安装插件并使用

    一.安装环境 1.本机系统:Windows 10 企业版(64位)2.Node.js:node-v10.16.0-x64.msi(64位) 二.安装Node.js步骤 1.下载对应自己系统对应的 No ...

  5. javaObject类

    所有类的公共父类,一旦一个类没有显示地继承一个类则其直接父类一定是Object. 一切数据类型都可用Object接收 class OOXX  extends Object{}等价于class ooXX ...

  6. (二)Centos7下Yum更新安装PHP5.5,5.6,7.0

    yum源默认的版本太低了,手动安装有一些麻烦,想采用Yum更新安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包, ...

  7. 给websocket加入心跳包防止自动断开连接

    var userId=$("#userId").val(); var lockReconnect = false; //避免ws重复连接 var ws = null; // 判断当 ...

  8. Spring security用户URL权限之FilterSecurityInterceptor

    总: 用户通过浏览器发送URL地址,由FilterSecurityInterceptor判断是否具有相应的访问权限. 对于用户请求的方法权限,例如注解@PreAuthorize("hasRo ...

  9. javaScript 删除事件 弹出确认 取消对话框

    javaScript 删除事件 弹出确认 取消对话框 1. <a href="javascript:if(confirm('确实要删除?'))location='http://www. ...

  10. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted)

    问题现象 原因 1.初次看报错日志内容,定义权限为问题,后来查资料才知道是缓存问题. 解决方法 1.简单直接 直接删除 npmrc文件 tips: 不是nodejs安装目录npm模块下的那个npmrc ...