linux内核的组成,王明学learn
linux内核的组成
一、linux内核源代码目录结构
- arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386、ARM、PowerPC、MIPS 等。
- block:块设备驱动程序 I/O 调度。
- crypto:常用加密和散列算法(如 AES、SHA 等) ,还有一些压缩和 CRC 校验算法。
- Documentation:内核各部分的通用解释和注释。
- drivers:设备驱动程序,每个不同的驱动占用一个子目录,如 char、block、net、mtd 、i2c 等。
- fs:支持的各种文件系统,如 EXT、F AT、NTFS、JFFS2 等。
- include:头文件,与系统相关的头文件被放置在 include/linux 子目录下。
- init:内核初始化代码。
- ipc:进程间通信的代码。kernel:内核的最核心部分,包括进程调度、定时器等,而和平台相关的一部分代码放在 arch/*/kernel 目录下。
- lib:库文件代码。
- mm:内存管理代码,和平台相关的一部分代码放在 arch/*/mm 目录下。
- net:网络相关代码,实现了各种常见的网络协议。
- scripts:包含用于配置内核的脚本文件。
- security:主要包含 SELinux 模块。
- sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动。
- usr:实现了用于打包和压缩的 cpio 等。
1.1Linux 内核的组成部分
Linux 内核主要由进程调度(SCHED) 、内存管理(MMU) 、虚拟文件系统(VFS) 、网络接口(NET)和进程间通信(IPC)等 5 个子系统组成。

1.1.1进程调度
精度调度控制系统中的多个进程对 CPU 的访问使得多个进程能在 CPU 中微观串行,宏观并行地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。
Linux 的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使驱动对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。睡眠分为可被打断的睡眠和不可被打断的睡眠,两者的区别在于可被打断的睡眠在收到信号的时候会醒来。

设备驱动中,如果需要几个并发执行的任务,可以启动内核线程,启动内核线程的函数为:
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
1.1.2内存管理
内存管理的主要作用是控制多个进程安全地共享主内存区域。 当 CPU 提供内存管理单元 (MMU)时, Linux 内存管理完成为每个进程进行虚拟内存到物理内存的转换。
一般而言, Linux 的每个进程享有 4GB 的内存空间, 0~3GB 属于用户空间, 3~4GB 属于内核空间, 内核空间对常规内存、 I/O 设备内存以及高端内存存在不同的处理方式。
1.1.3虚拟文件系统
Linux 虚拟文件系统(VFS)隐藏各种了硬件的具体细节,为所有的设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象,它使用超级块 super block 存放文件系统相关信息,使用索引节点 inode存放文件的物理信息,使用目录项 dentry 存放文件的逻辑信息。

1.1.4网络接口
网络接口提供了对各种网络的标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序,网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信, 每一种可能的硬件设备都有相应的设备驱动程序。
1.1.5进程通信
Linux 支持进程间的多种通信机制,包含信号量、共享内存、管道等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。
Linux 内核的 5 个组成部分之间的依赖关系如下:
- 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,必须为程序创建进程,而创建进程的第一件事情就是将程序和数据装入内存。
- 进程间通信与内存管理的关系: 进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。
- 虚拟文件系统与网络接口之间的关系: 虚拟文件系统利用网络接口支持网络文件系统(NFS) ,也利用内存管理支持 RAMDISK 设备。
- 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程 (swapd) 定期由调度程序调度, 这也是内存管理依赖于进程调度的惟一原因。 当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。
除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的例程,如分配和释放内存空间的函数、打印警告或错误信息的函数及系统提供的调试例程等。
二、linux内核空间与用户空间
CPU 内部往往实现了不同的操作模式(级别)
如:ARM 处理器有以下 7 种工作模式:
- 用户模式(usr) :大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
- 快速中断模式(fiq) :用于高速数据传输或通道理。
- 外部中断模式(irq) :用于通用的中断理。
- 管理模式(svc) :操作系统使用的保护模式。
- 数据访问终止模式(abt) :当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
- 系统模式(sys) :运行具有特权的操作系统任务。
- 未定义指令中止模式(und) :当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
如:X86 处理器包含 4 个不同的特权级,称为 Ring0~Ring3。Ring0 下,可以执行特权级指令,对任何 I/O 设备都有访问权等,而 Ring3 则有很多操作限制。
Linux 系统充分利用 CPU 的这一硬件特性, 但它只使用了两级。在 Linux 系统中,内核可进行任何操作,而应用程序则被禁止对硬件的直接访问和对内存的未授权访问。例如,若使用 X86 处理器,则用户代码运行在特权级 3,而系统内核代码则运行在特权级 0。
内核空间和用户空间这两个名词被用来区分程序执行的这两种不同状态,它们使用不同的地址空间。Linux 系统只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移
linux内核的组成,王明学learn的更多相关文章
- linux设备驱动概述,王明学learn
linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...
- usb设备驱动描述,王明学learn
usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...
- OK6410移植madplay播放器,王明学learn
对于ok6410的madplay移植主要包括三部分.声卡驱动移植,播放器的移植,以及alsa库的移植. 一.首先移植声卡驱动以及播放器 ok6410采用WM97系列的声卡芯片,要使得内核支持该驱动,首 ...
- linux驱动程序设计的硬件基础,王明学learn
linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...
- linux应用程序地址布局,王明学learn
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...
- 消息队列通信,王明学learn
消息队列通信 消息队列就是一个消息(一个结构)的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以从中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息. 每一个消息都是一个结构体 ...
- 信号通讯编程,王明学learn
信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示), ...
- 共享内存同行,王明学learn
共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...
- 信号量进程同步,王明学learn
信号量进程同步 一组并发进程进行互相合作.互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步. 信号量在进程同步时初始值为:0 信号量在进程互斥时初始值为:大于0的 本章节主要使用信号量,使的 ...
随机推荐
- SQL Server OBJECT_ID() 函数
OBJECT_ID 返回架构范围内对象的数据库对象标识号. 重要提示 使用 OBJECT_ID 不能查询非架构范围内的对象(如 DDL 触发器).对于在 sys.objects 目录视图中找不到的对象 ...
- spring + myBatis 常见错误:@Autowired注解失败
今天配置spring+myBatis的时候,使用注解@Autowired把持久层dao注入service层的时候总是报错. 查了好久才发现,居然是配置文件路径写错了.basepackge的路径一定要正 ...
- centos7精简版(minimal)killall: command not found
centos7精简版(minimal)运行killall命令提示 command not found 是由于没有安装psmisc所致 Psmisc软件包包含三个帮助管理/proc目录的程序. 安装下列 ...
- Django~static files (e.g. images, JavaScript, CSS)
django.contrib.staticfiles settings.py django.contrib.staticfiles is included in your INSTALLED_APPS ...
- Effective C++ -----条款34:区分接口继承和实现继承
接口继承和实现继承不同.在public继承之下,derived classes总是继承base class的接口. pure virtual函数只具体指定接口继承. 简朴的(非纯)impure vir ...
- Games:取石子游戏(POJ 1067)
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37662 Accepted: 12594 Descripti ...
- codeforces 505A. Mr. Kitayuta's Gift 解题报告
题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母 ...
- ajax+json+Struts2实现list传递实例讲解
由于学习需要,需要通过ajax来获取后台的List集合里面的值.由于前面没有接触过,所以今天就来研究下了. 一.首先需要下载JSON依赖的jar包.它主要是依赖如下: json-lib-2.2.2-j ...
- 【leetcode】Binary Tree Zigzag Level Order Traversal (middle)
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- 【leetcode】Number of Islands(middle)
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...