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. 【AR实验室】ARToolKit之概述篇

    0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...

  2. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  3. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  4. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  5. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  6. Struts2入门(五)——OGNL和标签库

    一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...

  7. Eclipse出现"Running Android Lint has encountered a problem"解决方案

    安装eclipse for android 时候的错误记录,转载自:http://blog.csdn.net/chenyufeng1991/article/details/47442555 (1)打开 ...

  8. MySQL 优化之 MRR (Multi-Range Read:二级索引合并回表)

    MySQL5.6中引入了MRR,专门来优化:二级索引的范围扫描并且需要回表的情况.它的原理是,将多个需要回表的二级索引根据主键进行排序,然后一起回表,将原来的回表时进行的随机IO,转变成顺序IO.文档 ...

  9. 微信小程序之用户数据解密(七)

    [未经作者本人同意,请勿以任何形式转载] 经常看到有点的小伙伴在群里问小程序用户数据解密流程,所以打算写一篇关于小程序用户敏感数据解密教程: 加密过程微信服务器完成,解密过程在小程序和自身服务器完成, ...

  10. 如何安装并简单的使用OwinHost——Katana

    微软OWIN的提出必然会引起一场风暴,而我们作为C#阵营中一份子,自然免不了会卷入其中.OWIN是什么东西,我在这里就不解析了,还不知道是OWIN是什么的读者请打开浏览器,然后搜索即可,中文的英文的应 ...