Linux 内核学习笔记整理。

Unix

unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠。

1973 年,在用 C 语言重写了 Unix 系统后,大量的Unix衍生版本开始出现,许多公司把 unix 移植到新的机型上,开发者们都按照自己的方式不断增强系统的功能。Unix 系统设计简洁并在发布时提供源代码,所以许多团体都对其进行了进一步的开发。加州大学伯克利分校便是其中影响最大的一个。在BSD基础上,很多厂商也推出了自己的unix ,如 SunOS、HP-UX 等。1991 年,linus 在Internet 上发布了它的 Unix 。从此 linux 便起航了,Linux很快吸引了众多开发者、黑客对其代码进行修改和完善,由于其开源性,Linux 迅速成为多人合作的开源项目。

操作系统与内核

操作系统包括内核、设备驱动程序、启动引导程序、命令行shell、基本系统工具等部分。内核是操作系统的真正核心,负责硬件设备管理、分配系统资源等任务。内核一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护起来的空间统称为内核空间。应用程序在用户空间只能看到允许它们访问的部分系统资源、只能使用某些特定的系统功能,无法直接访问硬件、也不能访问内核划给别人的内存范围,还有一些其他的限制。应用程序通过 系统调用 与内核通信,让内核代其完成不同的任务。

内核还负责管理系统的硬件设备。当硬件设备想要和系统通信的时候,它会发出一个异步的中断信号以打断处理器执行,继而打断内核执行。中断通常对应着一个中断号,内核通过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。中断服务程序在一个与所有进程都无关的、专门处理中断的上下文中运行,以保证中断服务程序能在第一时间响应和处理中断请求并快速退出。

单内核与微内核

操作系统的内核可分为两大阵营:单内核和微内核。单内核就是把它从整体上作为一个大的过程来实现,同时也运行在一个单独的地址空间上,其特点是高性能。微内核并不作为一个单独的大过程来实现,其根据功能不同划分成多个独立的过程,其特点是各过程独立运行,避免了一个模块出现问题后祸及另一个。其相比单内核设计多了模块间的通信机制等环节,而单内核却没有这些消息传递的开销。所以,大部分基于微内核的系统都让大部分或全部功能过程全部运行在内核,如此便可以直接调用函数,消除频繁的上下文切换。windowNT、Mach就是微内核的典型实例。Linux 是单内核,但是其汲取了微内核的精华部分。Linux是模块化的、多线程的以及内核本身可调度的操作系统。

内核版本号

主版本号.副版本号.修订版本号

副版本号反映了该内核是一个稳定版本还是一个处于开发中的版本:如果该数字是偶数,那么此版本就是稳定版;如果是奇数,那么他就是开发版。

获取源码

官网地址:www.kernel.org

仓库地址:git.kernel.org

编译内核

由于从未配置过内核,所以使用缺省配置编译内核,据说这个默认配置是 Linus 本人的配置。

$make defconfig 

如果要减少编译过程中的输出信息,可以使用下列命令

$make > .. /detritus

如此一来,如果你要查看编译信息,可查看该文件。当然你也可以直接 $make > /dev/null 把无用信息重定向。

安装内核

% make modules_install

上面命令可以把所有已编译的模块安装到正确的主目录。编译时会在内核代码根目录生成一个 system.map 文件,这是一个符号对照表。

内核开发

内核开发对性能的要求非常高。内核开发不能访问 C 库,也不能访问标准的 C 头文件。内核开发必须使用 GNU C,对内核来说完整的 C 库(甚至是一个子集)太大且太低效了。但大部分常用的 C 库函数在内核中都已经得到了实现。Linux 的内核混合使用了 C 语言和汇编语言,在靠近底层或对执行时间要求严格的地方,一般使用的都是汇编语言。GCC 支持使用 asm() 指令在 C 中嵌入汇报代码。

条件分支优化

对于条件选择语句,在经常条件经常出现或极少出现的时候,编译前可根据分支声明语句对条件分支进行优化。示例:

/* 把一个条件标记成极少发生的分支。 */
if (unlikely(err)){
...
}

这里一定要确保是否当前条件在绝大多数都会成立,如果你判断正确,那么程序性能将得到答复提升,否则,反而会降低性能。

没有内存保护机制

如果用户程序试图进行一次非法的内存访问,内核会发现这个错误,并结束这个进程。然而如果内核自己非法访问了内存,那后果就很难控制了,因为没有其他的任何东西可以对内核进行监控。还有一点,内核中的内存都不分页。

扩展

内核拥有整个系统的最高权限,关于内核开发的特别注意事项还有很多,可以到更专业一点的文章中了解。

Linux 内核概述 - Linux Kernel的更多相关文章

  1. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?

    作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  2. Nginx优化指南+LINUX内核优化+linux连接数优化+nginx连接数优化

    Most setup guides for Nginx tell you the basics - apt-get a package, modify a few lines here and the ...

  3. Linux内核分析——Linux内核学习总结

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

  4. 《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁

    20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB  task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件. ...

  5. Linux内核概述

    概述 1. 多数服务器都是Linux,Windows只在PC方面应用. 2. .NET只能在Windows中应用,适用于中小型项目,在大型项目中应用很少.现在出现了Windows服务器(外围的服务器) ...

  6. Linux内核分析-Linux内核如何装载和启动一个可执行程序

    ID:fuchen1994 实验要求: 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态 ...

  7. 谢宝友 LINUX 内核专家-----LINUX内核注释

    http://download.csdn.net/user/xiebaoyou http://blog.chinaunix.net/uid/25845340.html

  8. [转帖]Linux内核系统体系概述

    Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...

  9. Linux内核系统体系概述

    Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来负责控制进程对 CPU 资源的使用.所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作. 内存 ...

随机推荐

  1. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  2. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  3. 【从零开始学BPM,Day1】工作流管理平台架构学习

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第一天课程] Step 1 软件下载:H3 BPM10.0全开 ...

  4. 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”

    注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...

  5. Bluemix中国版体验(二)

    从上一篇到现在大概有一个多月了.时隔一个月再登录中国版Bluemix,发现界面竟然更新了,现在的风格和国际版已经基本保持一致!这次我们来体验一下Mobile Service.不过mobile serv ...

  6. The first documents

    Mark~ 赶在2016年的年末,来开了一个blog. 想想以前开设的blog还是十多年前,时光飞逝~~ 开设这个blog的主要目的是用于自己平时一些知识的记录. 希望能在未来很长一段时间能坚持学习与 ...

  7. python之类介绍

    python对象销毁(垃圾回收): 1>同Java语言一样,python使用了引用计数这一简单计数来追踪内存中的对象,也就是说,python内部记录着所有使用中的对象各有多少引用,一个内部跟踪变 ...

  8. Linux文件查找.md

    Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...

  9. Oracle 用Drapper进行like模糊传参查询需要在参数值前后带%符合

    Oracle 用Drapper进行like模糊传参查询需要在参数值前后带%符合   string sqlstr="select * from tblname where name like ...

  10. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...