有道云笔记地址:
详情看这里链接,记录太多,就不一一排版了。
本节我们选择linux 2.6.35.7版本kernel进行实践。使用的是九鼎X210的移植版本
补充.内核的子系统(参考A8实验指导书)
Linux 内核主要由 5 个子系统组成:进程调度,内存管理,虚拟文件系统, 网络接口,进程间通信。
进程调度控制进程对 CPU 的访问。选择下一个进程运行时,由调度程序选择 最值得运行的进程。可运行进程实际上是等待 CPU 资源的进程,如果某个进程在 等待其他资源,则该进程是不可运行进程。 Linux 使用了比较简单的基于优先级 的进程调度算法选择新的进程。
内存管理允许多个进程安全的共享主内存区域。 Linux 的内存管理支持虚拟 内存,即在计算机中运行的程序,其代码、数据、堆栈的总量可以超过实际内存 的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留 在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑 上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内 存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
3.虚拟文件系统( Virtual File System, VFS)
虚拟文件系统隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口, VFS 提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和 设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如 EXT2, FAT 等;设 备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
网络接口提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可 分为网络协议和网络设备驱动程序。网络协议部分负责实现每一种可能的网络传 输协议。网络设备驱动程序负责与硬件设备通信,每一种可能的硬件设备都有相 应的设备驱动程序。
进程间通信支持进程间各种通信机制。这些通信机制主要有以下部分:管道 ( Pipe)及有名管道( named pipe);信号( Signal);报文( Message)队列(消 息队列);共享内存;信号量( semaphore);套接口( Socket)。
这些子系统虽然实现的功能相对独立,但存在着较强的依赖性(调用依赖模
块中相应的函数),所以说 Linux 内核是单块结构( monolithic)的。
① 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境 下,程序要运行的话必须为之创建进程,而创建进程的第一件事情就是将程 序和数据装入内存。
② 进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享 内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存 取共同的内存区域。
③ 虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络 文件系统( NFS),也利用内存管理支持 RAMDisk 设备。
④ 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换, 交换进程( swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的 唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出 请求,同时挂起当前正在运行的进程。 除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这 些资源包括所有子系统都用到的“过程”,例如:分配和释放内存空间的过程, 打印警告或错误信息的过程,还有系统的调试过程等等。
一.linux内核源码目录结构
mk,是九鼎在移植时自己添加的,不是linux内核本身的东西
arch,体系架构,arch目录下的子目录存放的是不同种类的架构。譬如arm这种cpu的所有文件都在arch/arm目录下
block,块设备,一般是存储设备,存放的块设备管理的相关代码。譬如说SD卡、iNand、Nand、硬盘等都是块设备。block目录下放的是一些linux存储体系中关于块设备管理的代码。
drivers,设备驱动模块,存放各种设备类型驱动模块源代码
firmware,固件。什么是固件?固件其实是软件,不过这个软件是固话到IC里面运行的叫固件。就像S5PV210里的iROM代码
fs,文件系统,里面列出了linux支持的各种文件系统的实现。
lib,通用的库函数。这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的。在内核编程中是不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代那些标准库函数的。譬如在内核中要打印信息时不能用printf,而要用printk,这个printk就是我们这个lib目录下的。
mm,mm是memory management,内存管理。linux的内存管理代码都在这里