linux内核的组成,王明学learn

                 linux内核的组成

一、linux内核源代码目录结构

  1. arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386、ARM、PowerPC、MIPS 等。
  2. block:块设备驱动程序 I/O 调度。
  3. crypto:常用加密和散列算法(如 AES、SHA 等) ,还有一些压缩和 CRC 校验算法。
  4. Documentation:内核各部分的通用解释和注释。
  5. drivers:设备驱动程序,每个不同的驱动占用一个子目录,如 char、block、net、mtd 、i2c 等。
  6. fs:支持的各种文件系统,如 EXT、F AT、NTFS、JFFS2 等。
  7. include:头文件,与系统相关的头文件被放置在 include/linux 子目录下。
  8. init:内核初始化代码。
  9. ipc:进程间通信的代码。kernel:内核的最核心部分,包括进程调度、定时器等,而和平台相关的一部分代码放在 arch/*/kernel 目录下。
  10. lib:库文件代码。
  11. mm:内存管理代码,和平台相关的一部分代码放在 arch/*/mm 目录下。
  12. net:网络相关代码,实现了各种常见的网络协议。
  13. scripts:包含用于配置内核的脚本文件。
  14. security:主要包含 SELinux 模块。
  15. sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动。
  16. 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 个组成部分之间的依赖关系如下:

  1. 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,必须为程序创建进程,而创建进程的第一件事情就是将程序和数据装入内存。
  2. 进程间通信与内存管理的关系: 进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。
  3. 虚拟文件系统与网络接口之间的关系: 虚拟文件系统利用网络接口支持网络文件系统(NFS) ,也利用内存管理支持 RAMDISK 设备。
  4. 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程 (swapd) 定期由调度程序调度, 这也是内存管理依赖于进程调度的惟一原因。 当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

  除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的例程,如分配和释放内存空间的函数、打印警告或错误信息的函数及系统提供的调试例程等。

二、linux内核空间与用户空间

CPU 内部往往实现了不同的操作模式(级别)

如:ARM 处理器有以下 7 种工作模式:

  1. 用户模式(usr) :大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。
  2. 快速中断模式(fiq) :用于高速数据传输或通道理。
  3. 外部中断模式(irq) :用于通用的中断理。
  4. 管理模式(svc) :操作系统使用的保护模式。
  5. 数据访问终止模式(abt) :当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
  6. 系统模式(sys) :运行具有特权的操作系统任务。
  7. 未定义指令中止模式(und) :当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

如:X86 处理器包含 4 个不同的特权级,称为 Ring0~Ring3。Ring0 下,可以执行特权级指令,对任何 I/O 设备都有访问权等,而 Ring3 则有很多操作限制。

    Linux 系统充分利用 CPU 的这一硬件特性, 但它只使用了两级。在 Linux 系统中,内核可进行任何操作,而应用程序则被禁止对硬件的直接访问和对内存的未授权访问。例如,若使用 X86 处理器,则用户代码运行在特权级 3,而系统内核代码则运行在特权级 0。

  内核空间和用户空间这两个名词被用来区分程序执行的这两种不同状态,它们使用不同的地址空间。Linux 系统只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移

时间: 2024-10-19 01:13:08

linux内核的组成,王明学learn的相关文章

信号通讯编程,王明学learn

信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示),其中常见的信号有: SIGKILL:杀死进程 SIGSTOP:暂停进程 SIGCHLD:子进程停止或结束时用来通知父进程 二.函数学习 2.1 发送信号 2.1.1 函数名 kill 2.1.2 函数原形 int kill(pid_t pid,int sig); 2.1.3 函数功能 向进程发送信号

管道通信,王明学learn

管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4.进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变. 二.通讯发展 Linux进程间通信(IPC:interprocesscommunication)由以下几部分发展而来: 1.UNIX进程间通信 2.基于Sy

信号量互斥,王明学learn

信号量互斥 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源(进程互斥).进程可以根据它判定是否能够访问某些共享资源.除了用于访问控制外,还可用于进程同步. 一.信号量分类 二值信号灯:信号灯的值只能取0或1 计数信号灯:信号灯的值可以取任意非负值. 二.函数学习 2.1创建/打开信号量 2.1.1 函数名 semget 2.1.2 函数原形 int semget(key_t key,int nsems,int semflg); 2.1.3 函数功能 获取信号量集合标示

多进程程序设计,王明学learn

多进程程序设计 一.函数学习 1.1 创建进程fork 1.1.1 函数原形 pid_t fork(void); 1.1.2 函数功能 创建一个子进程 1.1.3 所属头文件 <unistd.h> 1.1.4 返回值 成功:父进程返回创建成功的子进程pid子进程返回 0 失败:父进程返回 1.1.5 参数说明 无 1.2 创建进程vfork 1.2.1 函数原形 Pid_t  vfork(); 1.2.2 函数功能 创建一个子进程,并阻塞父进程 1.2.3 所属头文件 <sys/type

进程控制理论,王明学learn

进程控制理论 一.进程 进程是一个具有一定独立功能的程序的一次运行活动. 1.1进程特点 1.动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的 2.并发性:任何进程都可以同其他进程一起并发执行 3.独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位 4.异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的.不可预知的速度向前推进 结构特征:进程由程序.数据和进程控制块三部分组成. 1.2进程状态图 1.3进程ID 进程ID(PID)

ARM寻址方式,王明学learn

ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操作数被称为立即数,对应的寻址方式也就叫做立即数寻址.:立即数不能作为指令中的第二操作数.该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致.例如以下指令: ADD  R0,R0,#0x3f:R0←R0+0x3f 立即数,要求以“#”为前缀. 二.寄存器寻址 寄存器寻址就是利用寄存器中的数值作

协处理器,王明学learn

协处理器 协处理器用于执行特定的处理任务,如:数学协处理器可以控制数字处理,以减轻处理器的负担.ARM可支持多达16个协处理器,其中CP15是最重要的一个. CP15提供16组寄存器 通过提供的16组寄存器访问CP15 一.协处理器访问 ARM微处理器可支持多达16个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM处理器和其他协处理器的指令.     ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器

ARM伪指令,王明学learn

ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编程序作各种准备工作,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成. 伪指令本身并没有所对应的机器码,它只是在编译的时候起作用,或者转化为其他的实际指令来运行. 在ARM的汇编程序中,有几种伪指令:符号定义伪指令.数据定义的伪指令.汇编控制的伪指令.宏指令以及其他伪指令. 一.符号

十天学Linux内核之第十天---总结篇(kconfig和Makefile &amp; 讲不出再见)

原文:十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见) 非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的话少,没办法煽情了,,,,,,,冬天的风,吹得伤怀,倒叙往事,褪成空白~学校的人越来越少了,就像那年我们小年之后再回家的场景一样,到处荒芜,然而我们的激情却不褪去,依然狂躁在实验室凌晨两点半的星空里,也许今天又会是这样的一年,不一样的是身边的人变成学弟学妹了,而我们几个大三老家伙依然在,为自己喜欢的事情,为