Linux内核解析
一、Linux内核
一个完整可用的操作系统主要由 4 部分组成:硬件、操作系统内核、操作系统服务和用户应用程序,如下图所示:

用户应用程序:是指那些自处理程序、 Internet 浏览器程序或用户自行编制的各种应用程序;
操作系统服务程序:是指那些向用户所提供的服务被看作是操作系统的部分功能的程序。在 Linux 操作系统上,这些程序包括 X 窗口系统、 shell 命令解释系统以及那些内核编程接口等系统程序。
操作系统内核程序:它主要用于对硬件资源的抽象和访问调度。Linux 内核的主要用途就是为了与计算机硬件进行交互,实现对硬件部件的编程控制和接口操作,调度对硬件资源的访问,并为计算机上的用户程序提供一个高级的执行环境和对硬件的虚拟接口。
二、Linux 内核模式
目前,操作系统内核的结构模式主要可分为【整体式的单内核模式】和【层次式的微内核模式】。而 Linux 0.11 内核,则是采用了单内核模式。
单内核模式的主要优点是内核代码结构紧凑、执行速度快,不足之处主要是层次结构性不强。
在单内核模式的系统中,操作系统所提供服务的流程为:应用主程序使用指定的参数值执行系统调用指令(int x80),使 CPU 从用户态( User Mode)切换到核心态( Kernel Model),然后操作系统根据具体的参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再底层的一些支持函数以完成特定的功能。在完成了应用程序所要求的服务后,操作系统又从核心态切换回用户态,返回到应用程序中继续执行后面的指令。
因此概要地讲,单内核模式的内核也可粗略地分为三个层次:调用服务的主程序层、执行系统调用的服务层和支持系统调用的底层函数。如下图所示:

三、Linux 内核系统体系结构
Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。
【进程调度模块】用来负责控制进程对 CPU 资源的使用。所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作。
【内存管理模块】用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得 Linux 支持进程使用比实际内存空间更多大的内存容量。并可以利用文件系统把暂时不用的内存数据块会被交换到外部存储设备上去,当需要时再交换回来。
【文件系统模块】用于支持对外部设备的驱动和存储。虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。从而提供并支持与其它操作系统兼容的多种文件系统格式。
【进程间通信模块子系统】用于支持多种进程间的信息交换方式。
【网络接口模块】提供对多种网络通信标准的访问并支持许多网络硬件。
若从单内核模式结构模型出发,我们还可以根据 linux 0.11 内核源代码的结构将内核主要模块绘制成下图所示的框图结构:

四、Linux 内核源代码的目录结构
由于 Linux 内核是一种单内核模式的系统,因此,内核中所有的程序几乎都有紧密的联系,它们之间的依赖和调用关系非常密切。所以在阅读一个源代码文件时往往需要参阅其它相关的文件。因此有必要在开始阅读内核源代码之前,先熟悉一下源代码文件的目录结构和安排。
这里我们首先列出 Linux 内核完整的源代码目录,包括其中的子目录。然后逐一介绍各个目录中所包含程序的主要功能,使得整个内核源代码的安排形式能在我们的头脑中建立起一个大概的框架,以便于后面开始的源代码阅读工作。当我们使用 tar 命令将 linux-4.9.tar.gz 解开时,内核源代码文件被放到了 linux 目录中。
其中的目录结构为:
linux———
|————arch 与架构相关,里面存放了许多CPU架构,比如arm,x86,MIPS,PPC等。
|————block 块设备(以块为单位来整体访问),譬如说SD卡、iNand、Nand、硬盘等都是块设备。你几乎可以认为块设备就是存储设备。
|————crypto 加密,这个目录下放了一些各种常见的加密算法的C语言代码实现。譬如crc32、md5、sha1等。
|————Documentation 里面放了一些文档。
|————drivers 驱动目录,分别列出了linux内核支持的所有硬件设备的驱动源代码 。
|————firmware 固件,固件其实是软件,不过这个软件是固化到I^2C里面运行的,就像S5PV210里的iROM代码。
|————fs 文件系统,里面列出了linux支持的各种文件系统的实现。
| |——asm 与CPU体系结构相关的部分
| |——linux linux内核专用部分
| |——sys 系统数据结构部分
|————include 头文件,公共的(各种CPU架构共用的)头文件都在这里。
|————init 内核初始化程序,这个目录下的代码就是linux内核启动时初始化内核的代码。
|————ipc ipc就是inter process commuication,进程间通信,里面都是linux支持的IPC的代码实现。
|————kernel 就是linux内核,所以这个文件夹下放的就是内核本身需要的一些代码文件。
| |——blk_drv 块设备驱动程序
| |——chr_drv 字符设备驱动程序
| |——math 数学协处理器仿真处理程序
|————lib 内核库函数,这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的。
|————mm 是memory management,内存管理,linux的内存管理代码都在这里。
|————net 该目录下是网络相关的代码,譬如TCP/IP协议栈等都在这里。
|————scripts 这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。我们并不会详细进入分析这个目录下的脚本,而是通过外围来重点学会配置和编译linux内核即可。
|————security 安全相关的代码。
|————sound 音频处理相关的。
|————tools 生成内核Image文件的工具程序
|————usr 目录下是initramfs相关的,和linux内核的启动有关,暂时不用去管。
|————virt 内核虚拟机相关的,暂时不用管。
|————Kbuild Kbuild是kernel build的意思,就是内核编译的意思。这个文件就是linux内核特有的内核编译体系需要用到的文件。
|————Makefile 这个是linux内核的总makefile,整个内核工程用这个Makefile来管理的。
Linux内核解析的更多相关文章
- Linux内核解析:进程间通信:管道
管道的定义管道的用途管道的操作管道非法read与write内核实现解析管道通信原理及其亲戚通信解析父子进程通信解析亲缘关系的进程管道通信解析管道的注意事项及其性质管道有以下三条性质shell管道的实现 ...
- Linux内核解析之标准I/O库
当Linux创建一个进程时,会自动创建3个文件描述符0,1,2,分别对应标准输入,标准输出,错误输出.C库中与文件描述符对应的是文件指针.查看C库头文件stdio.h中的源码 typedef stru ...
- linux内核编程笔记【原创】
以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...
- 基于tiny4412的Linux内核移植 --- aliases节点解析
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- Linux内核:sk_buff解析
sk_buff 目录 1 sk_buff介绍 2 sk_buff组成 3 struct sk_buff 结构体 4 sk_buff成员变量 4.1 Layout布局 4.2 General通用 4.3 ...
- Linux内核很吊之 module_init解析 (下)【转】
转自:https://blog.csdn.net/richard_liujh/article/details/46758073 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- linux内核启动参数解析及添加
1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...
- 深入解析Linux内核I/O剖析(open,write实现)
Linux内核将一切视为文件,那么Linux的文件是什么呢?其既可以是事实上的真正的物理文件,也可以是设备.管道,甚至还可以是一块内存.狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linu ...
- 基于tiny4412的Linux内核移植 --- aliases节点解析【转】
转自:https://www.cnblogs.com/pengdonglin137/p/5252348.html 阅读目录(Content) 作者信息 平台简介 正文 回到顶部(go to top) ...
随机推荐
- rails数据验证
@user1 = :name => "zhou" 与 @user2 = :name=> "ZHOU" 在为保存之前都有可能通过第一关validate ...
- 用cocos2d-html5做的消除类游戏《英雄爱消除》——概述
在bbs.html5china.com论坛学习了MV和老马的小熊蘑菇后我也自己模仿他们做了这样子一个游戏,权当技术交流学习,现在附上游戏截图和源码. 游戏截图: 1.系统菜单界面: 2.游戏界面 3. ...
- HTML 5 本地存储
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- samsung n143 brightness on linux mint
sudo vi /etc/default/grub Find the line which says GRUB_CMDLINE_LINUX="" enter acpi_backli ...
- MySQL的进程状态
通过show processlist查看MySQL的进程状态,在State列上面的状态有如下这些: Analyzing线程对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE ).c ...
- 关于HttpURLConnection测试servlet
把数据POST给服务端后,一定要读取服务端的响应,这是必须的,否则服务端不处理.其实发送的数据被服务端接收后在缓冲中,并不是立即处理的.然后服务端把响应码和内容等反回给客户端.如果客户端只发送不接受, ...
- 利用create-react-app从零开始搭建React移动端环境
一 开始 1 全局安装脚手架 npm install -g create-react-app 这有个坑,就是在window下安装一直会报错,报错信息如下: 解决办法:在开始菜单栏里打开cmd的时,右击 ...
- Java_数据交换_dom4j_01_解析xml
1.说明 详细原理以后再研究,先将例子存着 2.代码 2.1 xml内容 <?xml version="1.0" encoding="UTF-8"?> ...
- Linux-NoSQL之Redis(一)
1.Redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- OPcache
1.介绍 OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销 2.配置 2.1 opcac ...