Linux 内核概述 - Linux Kernel
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的更多相关文章
- 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?
作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- Nginx优化指南+LINUX内核优化+linux连接数优化+nginx连接数优化
Most setup guides for Nginx tell you the basics - apt-get a package, modify a few lines here and the ...
- Linux内核分析——Linux内核学习总结
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...
- 《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁
20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件. ...
- Linux内核概述
概述 1. 多数服务器都是Linux,Windows只在PC方面应用. 2. .NET只能在Windows中应用,适用于中小型项目,在大型项目中应用很少.现在出现了Windows服务器(外围的服务器) ...
- Linux内核分析-Linux内核如何装载和启动一个可执行程序
ID:fuchen1994 实验要求: 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态 ...
- 谢宝友 LINUX 内核专家-----LINUX内核注释
http://download.csdn.net/user/xiebaoyou http://blog.chinaunix.net/uid/25845340.html
- [转帖]Linux内核系统体系概述
Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...
- Linux内核系统体系概述
Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来负责控制进程对 CPU 资源的使用.所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作. 内存 ...
随机推荐
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
- OVS local network 连通性分析 - 每天5分钟玩转 OpenStack(132)
前面已经创建了两个 OVS local network,今天详细分析它们之间的连通性. launch 新的 instance "cirros-vm3",网络选择 second_lo ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- 【转】外部应用和drools-wb6.1集成解决方案
一.手把手教你集成外部应用和drools workbench6.1 1. 首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...
- 2016/12/31_Python
今天学习主要内容: Python: 1.with语句(补充昨天的文件操作) 用with打开的文件在脚本结束会自动关闭,以防普通打开方式忘记关闭文件连接 语法: with open("demo ...
- AndroidStudio — Error:Failed to resolve: junit:junit:4.12错误解决
原博客:http://blog.csdn.net/u013443865/article/details/50243193 最近使用AndroidStudio出现以下问题: 解决:打开app下的buil ...
- Atitit.如何建立研发体系
Atitit.如何建立研发体系 组织,流程,prj..Mana oppm 发管理是一个完整的管理体系,从结构上来讲,它主要由四个方面的内容构架而成:组织结构与岗位设置 管理流程与工作流程..项目及管 ...