Linux内核裁剪移植——内核的主要组成部分
Linux课程介绍-第五章(1)
2.进程系统堆栈 每个进程都有一个系统堆栈,用来保存中断现场信息和进 程进入内核模式后执行子程序(函数)嵌套调用的返回现 场信息。 每个进程的系统堆栈和task_struct数据结构之间存在 紧密联系,因而二者物理存储空间也连在一起 系统堆栈的大小静态确定,用户堆栈可在运行时动态扩展
5.2.3 对进程的操作 1.进程的创建 各个进程构成了树形的进程族系 内核在引导并完成了基本的初始化以后,就有 了系统的第一个进程(即初始化进程,实际上 是内核线程)。除此之外,所有其他的进程和 内核线程都由这个原始进程或其子孙进程所创 建。 除初始化进程外,其他进程都是用系统调用 fork( )和clone( )创建的。 fork( )是全部复制 ,而clone( ) 有选择地 复制
●进程控制系统用于进程管理、进程同步、进程通 信、进程调度和内存管理等。 ●内存管理控制内存分配与回收。
●文件系统管理文件、分配文件空间、管理空闲空 间、控制对文件的访问并为用户检索数据。 ●Linux系统支持三种类型的硬件设备:字符设备、 块设备和网络设备。 ●核心底层的硬件控制负责处理中断以及与机器通 信。
• 内核所在的地址空间称作内核空间 • 其他应用程序称为外部管理程序,大部分是对外围设 备进行管理和界面操作,外部管理程序和用户进程所 占据的地址空间成为外部空间
Linux内核概述
Unix内核用C语言写成 单一内核:所有的操作系统功能均被封装 在内核中,与外部程序处于不同的地址空 间。外部程序智能通过功能调用来访问内 核 微内核:内核只提供最基本、最核心的一 部分操作,如创建和删除任务、中断管理、 进程管理、存储器管理、进程间通信等, 而其他功能如文件系统、网络协议栈则在 内核外操作。
3.进程的终止
linux内核的裁剪与移植
1,获得源码,解压,进入解压后的目录;命令;2,修改makefile;为了能让此目录被执行所以在顶级目录的makefile中同时也进行修改;3,得到.config文件;命令;编译内核时对.config文件的依赖比较大,我们需要一个自己的.config文件,又因为我们的板子和smdk2410的很像,仅需将smdk2410的.config 文件复制到顶级目录即可不用修改;4;修改nandflash 分区;此系统启动时从nandflash 中启动而我们的板子不是的所以对其进行必要的修改;5,添加网卡驱动;arch/arm/mach-s3c2410/mach-smdk2410.c开发板上已经配置要的相应的网卡,并且内核中也有相应的实现代码我们只需做一下简单的修改;6添加yaffz文件系统支持将yaffz 源码包考到和linux-2.6.24 同一级目录下解压;在给内核打上补丁;命令是;7、配置和编译内核到现在,一个简单的内核就准备好了,我们还需要做一些配置,然后编译,内核才能正常使用。
在内核源代码的根目录下运行make menuconfig命令,进入配置界面:8,用u-boot启动内核;编译U-Boot时在源代码的tools目录下会生成一个mkimage可执行文件,用这个工具可以对前面编译内核时生成的zImage进行处理,以供U-Boot启动。
cd linux-2.6.24.4/arch/arm/bootcp /up-Star2410/kernel/linux-2.6.24.4/mkimage . 获取mkimage工具./mkimage -A arm -T kernel -C none -O linux -a 0x30008000 -e 0x30008040 -d zImage -n 'Linux-2.6.24' uImage9,最后把生成的uimage 放到主机tftp同目录下,启动开发板;用u-boot的tftp命令下载到sdram;。
基于ARM的嵌入式linux内核的裁剪与移植
—
3 内核 配置 过 程
提供 用 户程 序所 使 用 的一些
自行 搭建 交叉 编译 环境 通 常 比较 复 杂 ,而 且 很 容易 出错 。本 文使 用 的是 开 发板 自带 的交 叉 编 译 器 ,即cos 33 交 叉 编译 器 ,该 编 译 只 需 将 rs一 .. 4
光 盘 中 的 am—iu 33 . r z 用 tr xf n — r l x一 .. b . 2 a v n n 4 ab i a
及 下 栽 内核 映像 到 开发 板 等设 计 ,给 出了以sc 4 O 3 2 l 为核 心 的嵌 入 式Ln x iu 内核 的裁 剪 与移植
过程。
关键词 :AR M;嵌 入式Ln x 3 2 1 ;裁剪 ;移植 iu ;¥ C 4 0
0 引 言
微 处 理 器 的产 生 为价 格 低 廉 、结 构 小 巧 的 C U和外 设 的 连接 提 供 了稳 定 可靠 的硬 件 架构 。 P 这 样 。限制嵌 入式 系统 发展 的瓶 颈就 突 出表 现在
第 1卷 1
第 1期 1
电手元 器 件 盔 用
Elcr n cCo o e t D v c p ia in et i o mp n n & e i eAp l t s c o
V . 1 I1 No 1 .l
NO V.2 9 0o
2 0 年 1 Y 09 ll
d i O3 6 /i n1 6 - 7 5 0 91 .2 o: .9 9js .5 3 4 9 . 0 .10 0 l .s 2
以在 另 一个 平 台上执 行 的程 序代 码 。不 同的C U P
需要 有 不 同 的编译 器 。交叉 编 译 如 同 翻译 一 样 ,
Linux操作系统内核裁剪的分析
Ln x操 作 系统进 行裁剪 修 改 ,使 之能在 嵌入 i u 式 系统 上 运 行 的操 作 系 统 。 目前嵌入式 Ln x i u 操作系统在移动 电话 、个人数字助理 ) 、媒体 播放器 、工业控制 以及航空航天等领域有着广泛
的应用 。Ln x操作 系统 内核 的裁剪 是嵌 入式 系统 iu 开 发的重要 环节 ,对 嵌入式 系统 的开发具有 重要 意
VO . 1 . 1 No3 2
在 某 一 具 体 应 用 中 是 多 余 的 ,裁 剪 时只 需 保 留对
入 内核 ,也 可 以卸 载 释 放 所 占有 的 资源 。这 样 的 设计 方 式 可 以灵 活 、动 态 地 分 配 内核 空 间资 源 ,
嵌入式 系统应 用 程序 提供对 应 的系 统支 持 的功 能;最后是完整性和可靠性 ,裁剪后 的操作系统 在结构和功能上要具有完整性和可靠性 。
能 都 不 一 样 。 以Ln x 作 系 统 为例 ,Ln x .是 iu 操 iu 20 第一 个 支持 S 体 系 的内核版 本 ;L u 22 MP n i x .极大 地 提 升 了S MP系 统 性 能 , 同 时支 持 更 多 的 硬 件 ;
方 面 是 开 发它 的实 时 性 能 。对 标准 的操 作 系 统
第4章 Linux内核裁剪与移植 Linux系统移植(第2版) 教学课件
4.1 Linux内核结构 4.2 内核配置选项 4.3 内核裁剪及编译 4.4 内 核 升 级
4.1.2 内核源码目录介绍
Linux内核代码以源码树的形式存放,如 果在安装系统的时候已经安装了源码树, 其源码树就在/usr/src/linux下。
1.arch目录
禁用随机heap(heap堆是一个应用层的概念,即堆对CPU是不可见的,它 的实现方式有多种,可以由OS实现,也可以由运行库实现,也可以在一个 栈中来实现一个堆)
Choose SLAB allocator Profiling support Kprobes
选择内存分配管理器,建议选择 支持系统评测,建议不选 探测工具,开发人员可以选择,建议不选
5.init目录
init子目录包含核心的初始化代码(注意, 不是系统的引导代码)。它包含两个文件 main.c和version.c,这是研究核心如何工 作的一个非常好的起点。
6.ipc目录
ipc子目录包含核心进程间的通信代码。 Linux下进程间通信机制主要包括管道、 信号、消息队列、共享内存、信号量、套 接口。
Physical 选择XIP后,内核存放的物理地址
Kexec system call
Kexec系统调用
4.2.4 网络协议支持相关选项
菜单选项(Networking Support)的子菜 单中包含一些网络协议支持的选项。
选项名 Networking options Amateur Radio support
arch子目录包括了所有和体系结构相关的 核心代码。它的每一个子目录都代表一种 支持的体系结构,例如arm子目录是关于 ARM平台下各种芯片兼容的代码。
Linux内核裁剪与编译
创建一个用于编译的内核目录,并配置相应的环境变量。
内核配置与选择
配置内核
01
使用make menuconfig或其他配置工具进行内核配置,选择所
需的特性和功能。
定制内核
02
根据实际需求,禁用不必要的模块和功能,以减小内核体积。
配置参数
03
在编译过程中,根据需要设置编译参数,如优化级别、编译器
选项等。
编译过程与注意事项
执行编译
在配置完成后,执行make命令开始 编译内核。
等待编译完成
编译过程可能需要较长时间,取决于 系统性能和内核大小。
注意事项
在编译过程中,注意观察日志信息, 以便及时发现和解决问题。
内核安装
编译完成后,按照系统要求进行内核 安装和引导配置。
04
内核编译优化
编译优化简介
-O3
在`-O2`的基础上,进一步开启更多的编译器优化选项。
-Os
以最小化代码大小为目标进行优化,适用于嵌入式系统等资源受限的环境。
-fPIC
生成位置无关代码,便于动态链接。
编译优化实践
根据目标硬件平台和性能 需求,选择合适的编译选 项。
关注内核代码质量,避免 过度优化导致代码可读性 和维护性下降。
优化内核
针对特定需求进行内核优化,如调整调度 策略、优化内存管理等,以提高系统的性 能和响应速度。
定制内核
根据需求分析结果,定制内核的功能和参 数,如禁用不必要的模块、开启特定功能 等。
案例三:使用第三方工具进行内核裁剪与编译
总结词
选择合适的第三方 工具
配置工具链
导入内核源码
自动裁剪与编译
使用第三方工具进行内 核裁剪与编译,可以借 助第三方工具的自动化 和智能化功能,提高内 核裁剪与编译的效率和 准确性。
linux内核裁剪
Linux内核的裁剪和移植的过程就是:根据硬件平台资源等需求来修改一套完整linux源码,添加与硬件资源等相关的功能模块,除去与硬件资源等不相关的功能模块,然后经过交叉编译生成简化的功能齐全的linux内核zImage。
Linux内核裁剪的必备工具:1、make menuconfig,基于图形界面的内核配置工具,可使配置linux内核更加便捷,为此需要安装libncurses5-dev软件包,这个软件包可在root用户下利用apt-get install libncurses5-dev命令来下载并安装。
2、arm-linux-gcc,交叉编译工具,将配置好的linux内核经过交叉编译生成zImage,使其可以在arm平台上运行。
为此需下载arm-linux-gcc-4.3.2.tgz 软件包,使用tar zxvf arm-linux-gcc-4.3.2.tgz -C /命令解压安装,安装完整后为相gcc命令一样使用arm-linux-gcc,则需要在系统环境变量中添加arm-linux-gcc的路径。
方法在.bashrc文件中添加export PATH=$PATH: /usr/local/arm/4.3.2/bin。
准备好以上两个工具之后即可完成对linux内核的裁剪,移植就是一个download 的过程。
Linux内核配置选项:1、下载linux-2.6.39源码,首先修改内核源码根目录的Makefile文件,将第195行修改为ARCH ?= arm ,此处修改说明linux内核将运行在arm平台上,将第196行修改为CROSS_COMPILE ?= /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-, 此处指出使用arm-none-linux-gnueabi-对内核进行交叉编译,也可直接使用arm-linux-,但是在实际编译时提示无法找到arm-linux-编译不通过,原因暂时不明,因此将整个的编译器执行文件的路径给出。
linux操作系统的组成部分及功能
Linux操作系统的组成部分及功能如下:
1. 内核(Kernel):内核是Linux操作系统的核心,负责管理系统的软硬件资源。
它实现了进程调度、内存管理、中断处理、异常陷阱处理等功能,还负责进程管理、进程通信机制、虚拟内存管理、文件系统驱动以及USB、网络、声音等各类设备驱动子系统。
内核控制整个计算机的运行,提供相应的硬件驱动程序、网络接口程序,并管理所有应用程序的执行。
2. Shell:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
它接收用户输入的命令并把它送入内核去执行。
3. 文件系统:Linux文件系统是文件存放在磁盘等存储设备上的组织方法,主要体现在对文件和目录的组织上。
4. 应用程序:Linux应用程序辅助用户完成一些特定的任务,例如文本编辑器、编程语言、基于X Window架构的图形桌面系统、办公套装软件、Internet工具以及数据库等。
总的来说,Linux操作系统由内核、Shell、文件系统和应用程序四个部分组成,各部分协同工作,使得Linux能够高效地运行和管理计算机资源。
linux操作系统的基本体系结构
linux操作系统的基本体系结构一、内核(Kernel)Linux操作系统的核心是内核,它负责管理系统资源、控制硬件设备、调度进程和提供基本的系统服务。
Linux内核采用单内核结构,包含了操作系统的大部分核心功能和驱动程序。
内核是操作系统的核心组件,它提供了操作系统运行所必须的基本功能。
Linux内核具有以下特点:1、多任务处理:Linux内核支持多任务处理,可以同时运行多个程序,并实现多个程序之间的切换和管理。
2、硬件管理:Linux内核负责管理硬件设备,与硬件设备交互,控制硬件设备的工作状态。
3、内存管理:Linux内核负责管理系统的内存,包括内存的分配、释放、映射和交换等操作。
4、文件系统:Linux内核支持多种文件系统,包括ext4、NTFS、FAT等,负责文件的读写、管理和保护。
5、进程管理:Linux内核管理系统进程,包括进程的创建、调度、挂起、唤醒和终止等操作。
6、网络通信:Linux内核支持网络通信功能,包括TCP/IP协议栈、网卡驱动等,实现网络数据传输和通信。
二、ShellShell是Linux操作系统的命令解释器,用户通过Shell与操作系统进行交互。
Shell接受用户的命令,并将其转换为对应的系统调用,最终由内核执行。
Linux系统中常用的Shell有Bash、Zsh等,用户可以根据自己的喜好选择不同的Shell。
Shell具有以下功能:1、命令解释:Shell接受用户输入的命令,并将其翻译为操作系统可以执行的命令。
2、执行程序:Shell可以执行各种程序、脚本和命令,包括系统工具、应用程序等。
3、环境控制:Shell可以设置环境变量、别名和路径等,帮助用户管理系统环境。
4、文件处理:Shell可以处理文件操作,包括创建、删除、复制、移动等。
5、脚本编程:Shell支持脚本编程,用户可以编写Shell脚本来自动执行一系列操作。
三、系统工具Linux操作系统提供了丰富的系统工具,帮助用户管理系统和执行各种任务。
linux内核编译与裁剪
Linux内核编译内幕详解内核,是一个操作系统的核心。
它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/l inux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。
全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。
而Linux的内核则是这些特点的最直接的代表。
想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。
通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。
其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。
在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。
再次,我们可以对内核进行修改,以符合自己的需要。
这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。
在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。
内核版本号由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。
Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。
一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(d evelopment tree)。
一些新特性、实验性改进等都将首先在开发树中进行。
如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。
linux内核原理
linux内核原理Linux内核是一种开源的操作系统内核,它是操作系统最底层的部分,负责管理计算机的各种硬件资源并提供给其他软件运行所需的服务。
本文将介绍Linux内核的原理,包括其架构、进程管理、内存管理和文件系统等方面。
Linux内核的架构是以模块化的方式设计的,主要由核心模块、设备驱动程序、文件系统和网络协议栈等组成。
核心模块是内核的主要部分,负责处理系统调用、进程管理和内存管理等功能。
设备驱动程序用于管理和控制计算机的硬件设备,文件系统用于管理计算机上的文件和目录,而网络协议栈则是负责处理网络通信的部分。
进程管理是Linux内核的核心功能之一、进程是指在运行中的程序,Linux内核通过进程管理功能来创建、调度和终止进程。
每个进程都有自己的进程控制块(PCB),内核利用PCB保存进程的状态信息,包括进程的代码、数据、堆栈和打开的文件等。
内存管理是Linux内核的另一个重要功能。
内核通过内存管理功能来为进程分配和管理内存。
Linux内核使用虚拟内存技术,将物理内存分成固定大小的页,并为每个进程分配虚拟地址空间。
内核通过页表来管理虚拟地址空间和物理内存之间的映射关系,以实现进程之间的隔离和保护。
文件系统是Linux内核的一个重要组成部分。
Linux内核支持多种文件系统,包括常见的ext4、NTFS和FAT等。
文件系统管理计算机上的文件和目录,通过文件系统接口提供对文件的读写和操作。
Linux内核利用文件描述符来标识打开的文件,并通过虚拟文件系统层将文件系统的具体实现与应用程序解耦。
除了上述功能,Linux内核还负责处理中断和系统调用等事件。
中断是计算机硬件的一种机制,用于通知内核有特定的事件发生,如硬件故障或外部设备的输入。
内核通过注册中断处理程序来响应中断事件,并进行相应的处理。
系统调用是应用程序与内核之间的接口,应用程序可以通过系统调用请求内核执行特定的操作。
总结来说,Linux内核是一种开源的操作系统内核,负责管理计算机的各种硬件资源并提供给其他软件运行所需的服务。
基于ARM的嵌入式linux内核的裁剪与移植
基于ARM的嵌入式linux内核的裁剪与移植前言嵌入式系统一直是计算机行业中的领域之一。
在许多应用程序中,嵌入式系统越来越流行。
嵌入式系统通常使用嵌入式芯片,如ARM芯片,并且它们通常运行Linux内核。
Linux内核是一个开放源代码的操作系统内核。
在嵌入式领域,Linux 内核可以被用于实现各种应用程序。
本文将重点介绍如何基于ARM平台的嵌入式Linux内核进行裁剪和移植。
ARM平台ARM处理器是一种RISC(Reduced Instruction Set Computer)处理器。
这种类型的处理器可用于嵌入式系统开发,因为它具有较低的功耗和高效的性能。
ARM处理器有许多版本,其中包括ARMv6和ARMv7。
ARMv6通常用于嵌入式系统,而ARMv7则用于智能手机和平板电脑等高端设备。
Linux内核的裁剪在嵌入式系统中,Linux内核需要进行裁剪,以适应嵌入式设备的需求。
与桌面计算机相比,嵌入式系统拥有更少的资源,包括RAM、闪存和存储空间。
因此,在将Linux内核移植到嵌入式系统之前,必须将内核进行裁剪。
在裁剪内核之前,您必须确定哪些内核模块是必需的。
一些模块可以从内核中移除,以减少内核的大小。
通常,将不必要的模块和其他功能从内核中移除可以使内核变得更小并具有更好的性能。
另外,裁剪内核时应确保其他组件与内核兼容。
例如,在新内核中可能需要更改驱动程序或实用程序以适应修改后的内核。
裁剪内核可能是一项比较困难的工作,需要深刻了解Linux内核的各个方面,以确保正确地裁剪内核。
移植Linux内核到ARM移植内核是将Linux内核适应新硬件的过程。
在开始移植内核之前,您必须了解嵌入式设备的硬件架构以及所需的内核组件。
移植Linux内核到ARM可以分为以下步骤:1.选择合适的ARM平台和处理器并确定所需的内核选项。
2.下载最新的内核源代码。
3.配置内核选项,并使其适应新硬件。
4.使用交叉编译器编译内核。
虚拟嵌入式开发环境中的Linux内核移植与裁剪
展 的瓶颈 问题 。文献【 给出了一种利用软件技术 4 仲
来搭 建一 个 虚拟 的嵌入 式 开发 环 境 的 方 法,在 此基 础 上 , 文通 过 对 Lnx内核 进 行 移植 和裁剪 , 其 本 iu 使
嵌 入式 中的移植 , 简单地 说就是 程序 写好 后 , 使 用 一种 特殊 的编译 器编译 源码并链接 成 可执行 二进
将 函 数 sc40 t rs u 中 的 i (n > 32 1_i me e p t f tt c 0f { xt 改成 i( n> x mf  ̄ ft t 0 f f e H )
2 nx内核 2 . . 编译 .l u 3i .2 2 60 0
是 REDHAT E E R S I X .+sy y .. NT RP I E L NU 54 k e e 32. 1
码。 在进行移植之前 , 我们必须对原始的 Lnx内 i u 核
进 行 简化 和部 分修 改 , 程如 下 : 过 首 先 下载 到 l u 一.. . . r z i x262 2 t . 2文件 ,然后 n 0 0ab 进 行解 压缩 。 jv l u 一..0 0 a. 2 xfi x26 . . r z n 22t b
22 i x原 始 内核 26 02 剪 和移植 .Ln u .. . 2 0裁
Lnx是 一 个 可 移 植 性 非 常 好 的操 作 系统 , i u 它
广泛支持 了 多不同体 系结构的计算机。通常情况 许 下L u i x内核仅仅 支持普通的计 算机体 系结构 , n 而
且体 积较 大。 了让 其 支持嵌入 式 系统 , 么就 必须 为 那 对 内核进行移 植 和裁 剪 ,减 少其 体 积和 不 需要 的代
#t rx z nn ln x— c 一 4_ C / a v fa -iu g c 4. 3一
linux内核裁剪及编译步骤
linux内核裁剪及编译步骤Linux内核裁剪及编译步骤Linux操作系统的内核是其最重要和核心的组成部分。
用户可以根据自己的需要对内核进行裁剪以减少内核代码的大小,以及支持特定的硬件和功能。
Linux内核的裁剪和编译步骤相对来说比较复杂,需要一定的技术和安装环境的支持。
下面将介绍Linux内核裁剪及编译的具体步骤,以供参考。
一、准备工作在开始进行Linux内核的裁剪及编译之前,需要进行一些准备工作。
首先,需要安装Linux操作系统的开发环境。
其次,需要下载Linux内核的源代码,可以从Linux 的官方网站或者其他开源社区下载。
二、配置内核选项安装好开发环境和下载好源代码之后,就可以开始进行内核的裁剪和编译了。
首先需要进行内核选项的配置。
可以使用make menuconfig命令进入配置界面。
在这个界面中,用户可以对内核进行不同程度的裁剪,包括去掉多余的硬件支持和功能选项。
在配置选项中,用户需要选择一些基本的配置选项,包括文件系统类型、设备驱动、协议栈、安全选项、虚拟化等。
用户可以根据自己的需要,进行选项的选择和配置。
三、编译内核在完成了内核的配置之后,下一步就是进行内核的编译。
可以使用make命令进行编译。
编译过程中需要耗费一定的时间和资源,因此建议在空闲时刻进行编译。
如果出现编译错误,需要根据错误提示进行排查和解决。
编译错误很可能是由配置选项不当造成的,因此要仔细检查配置选项。
四、安装内核编译完成后,就可以安装内核。
可以使用make install命令进行安装。
安装完成后,可以重启系统,以使新的内核生效。
在重启时,需要手动选择新的内核,可以选择自己编译的内核或者系统默认的内核。
五、总结对于不同的用户,对内核的需求和选择是不同的。
因此,在对内核进行裁剪时,需要根据自己的需求进行适当的选择,以提高系统性能和稳定性。
同时,在进行内核的编译时,也需要仔细检查配置选项和随时记录日志以便排除可能出现的问题。
linux内核裁剪基本步骤
linux内核裁剪基本步骤嘿,朋友们!今天咱就来聊聊 Linux 内核裁剪那些事儿。
你想想看啊,Linux 内核就像是一个超级大的宝库,里面啥都有,但咱有时候并不需要那么多东西呀,这时候就需要来一场“瘦身行动”啦!那怎么开始呢?首先,你得清楚自己到底要干啥。
就好比你要去旅行,你得知道自己想去哪儿,带啥东西,对吧?得明确自己的系统需要哪些功能,哪些是多余的。
这可不是随随便便就能决定的哦,得好好琢磨琢磨。
然后呢,就是了解内核的各种配置选项啦。
这就像你去超市买东西,得知道每个货架上都有啥呀。
这里面的门道可不少呢,什么驱动啊、模块啊,都得搞清楚。
可别小瞧了这些配置选项,它们就像是一个个小开关,决定着哪些功能会被启用,哪些会被关掉。
接下来,就是动手裁剪啦!这可真是个精细活儿,就跟雕刻大师在雕琢一件艺术品似的。
小心翼翼地去掉那些不需要的部分,留下精华。
这过程可得有耐心,不能着急,不然一不小心剪错了可就麻烦啦。
再之后,就是编译啦!把裁剪好的内核重新编译一下,让它变成适合你的那个独一无二的版本。
这就好比给你的系统穿上了一件量身定制的衣服,合身又舒适。
裁剪的过程中,你可能会遇到各种各样的问题。
哎呀,这就跟你走路会遇到小石子一样正常。
别慌,冷静下来慢慢解决。
也许会花费你一些时间和精力,但当你看到裁剪后的内核完美运行的时候,那种成就感,简直无与伦比!你说这是不是很有趣呢?就像给自己的电脑来了一次大改造。
而且通过裁剪内核,还能让系统运行得更高效、更稳定呢!总之呢,Linux 内核裁剪可不是一件简单的事儿,但也绝对不是什么难到登天的事儿。
只要你有耐心、有决心,再加上一点点技巧,肯定能把它搞定。
还等什么呢?赶紧去试试吧,让你的系统变得更加强大、更加适合你!。
Linux内核组成和架构
统 是 如 何 实现 的 。
低
进程管理
Li x 内核 支 持 所 谓 的 多任 务 运 行 nu ( lirga mut o rmmig ,即 可以 有 多个 用 户 p n) 程 序 同时 运 行 ,用 户 可 以 一 边 听 音乐 一 边 写 文档 。为 了 在一 个 单 C U的 系 统 中 支持 P 多任 务 , iu Ln x内核 使 用 了进 程 的概 念 ( 内
(hr u h u ) t o g p t。
增 加 而 线 性 增 加 。 在 2. 开 发 版 本 中 , 5
S f a r 0785 即 ow rWol 20.. t e d
维普资讯
o p ue eS r 圃 n。C
Ln x内核 采 用 了 由 Ig la 开 发 的 0 L iu n o Mon r () 调 实 现 了 sl 分 配 器 很 好 地 解 决 了 这 些 问题 。 ab 度 器 。 O 1调 度 器采 用 一 个链 表 数 组 ,根据 进 程 S a () l b分 配 器以 对 象 为单 位进 行 管 理 ,把 不 同的 的 优 先 级 把 进 程 放 进 不 同 的 链 表 中 ,每 次 调 度 对 象 组织 在 不 同 的 C c e 。这 种 方式 很 好地 解 ah 中 时 ,总是 从 优先 级 最 高 的链 表 中取 出第 一 个 进 程 决 了内 存浪 费 的 问 题 ,同时 又 能快 速 的分 配 各 种 来 运 行 。 同时 使用 一 个位 图表 (i p bt ma )来记 录 不 同大 小 的 对 象 。 每 一 个 优先 级 链表 中是 否 有可 运 行 的 进程 ,搜 寻 这 张 位 图表 就 可 以找 到 优先 级 最 高 的 链表 。0() 1
Linux系统裁剪、自定义内核、busybox系统定制
Linux系统裁剪、⾃定义内核、busybox系统定制字体颜⾊:T_RED="\\033[1;31m" # bold+redT_GREEN="\\033[1;32m" # bold+greenT_YELLOW="\\033[1;33m" # bold+yellowT_BLUE="\\033[1;34m" # bold+blueT_CYAN="\\033[1;36m" # cyanT_BOLD="\\033[1;37m" # bold+whiteT_NORM="\\033[0;39m" # normal系统启动流程:POST-->BIOS(Boot Sequence)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab)⾸先加电⾃检,加电⾃检是怎么完成的,计算机本⾝不会执⾏程序,由此先去载⼊⼀段程序,系统刚刚启动的时候,它能够实现将某个RAM中的程序映射到CPU可以寻址的地址空间中去,并且让CPU能够执⾏其中的指令,这些指令⽆法是完成系统检测,当检测完成以后,如果所有的硬件或基本硬件、核⼼硬件没有问题的话,接下来进⼊下⼀步根据BIOS当中所设定的系统启动流程去找那个对应设备上的MBR,根据引导次序去挨个逐个的去找那个对应的存储设备上的MBR,如果说MBR存在的话,则回去读取MBR中的bootloader,bootloader是⼀段程序,对于早些的设备来讲这个bootloader空间,或者MBR留给bootloader空间⼀共是512bytes,但是⽤于bootloader有446bytes,在bootloader当中配置了所要引导的操作系统的内核的位置,因此BIOS被载⼊内存以后,当它实现将控制权限转交给bootloader以后,那么bootloader就接收了整个系统的控制权限,⽽后根据⽤户的选择去读取相应操作系统的内核,将内核装载进内存当中合适的位置,解压缩,并完成内核初始化以后,接下来bootloader会将控制权限转交给内核,内核在初始化时主要完成硬件探测、装载驱动、这个驱动程序可能在内核当中,也可能在另外⼀个辅助⽂件当中initrd(RHEL 5 ramdisk、RHEL 6 ramfs),在RHEL 6中叫initramfs,这⾥⾯有内核所需要依赖到的额外的其他的设备驱动,尤其是根⽂件系统的驱动,接下来挂载根⽂件系统,当根⽂件系统挂载完成之后,接下来启动⽤户空间中的第⼀个进程叫init,这是内核初始化的基本任务,如果内核要完成初始化,它需要依赖于驱动程序,这些驱动程序如果没有被直接做在内核当中,那就需要到某个⽂件系统路径下去装载这个驱动程序,但是在真正根⽂件系统被挂载之前就出现⼀个难题,如果内核访问这个根⽂件系统那个设备,需要⽤到某个驱动程序的话,内核中没有,它就需要到⽂件系统当中找这个驱动程序,但是这个⽂件系统本⾝⼜没有挂载,所以要想访问⽂件系统得先找到驱动,要访问驱动得先找到⽂件系统,所以出现这样的难题,就是借助与initrd为内核提供访问真正的根⽂件系统所需要基本驱动程序,所以initrd是个辅助性的、过渡性的中间层,它能够实现将kernel和真正的根⽂件系统连接起来,所以当连接完成之后,它就没有意义了,当kernel初始化完成以后接下来执⾏init进程,⽽init本⾝的配置⽂件是/etc/inittab,在RHEL 6上不再是传统的init,⽽是upstart,⽽upstart的配置⽂件是/etc/inittab和/etc/init*.conf,upstart是个项⽬名称,这个程序为了兼容它依然较Init,也就意味着RHEL 6上的init不再是传统的init了,它是⼀个被称作较upstart的init程序,这个程序和传统的有着巨⼤的区别,⽽upstart本⾝它的配置⽂件/etc/inittab和/etc/init/*.conf⽂件,依然以RHEL 5来讲,init主要完成那些⼯作,这主要取决于inittab⽂件;RHEL 6:upstart(项⽬名称) --> init /etc/inittab /etc/init*.conf内核初始化: 硬件探测 装载驱动 挂载根⽂件系统(rootfs) 启⽤⽤户空间中的第⼀个进程init/etc/inittab: 设定默认运⾏级别 系统初始化(/etc/rc.d/rc.sysinit) 运⾏指定级别的服务脚本 /etc/rc.d/init.d/ /etc/rc.d/rc#.d rc0.d--rc6.d K* S* 00-99:运⾏次序 启动虚拟终端 启动图形终端/etc/rc.d/rc.sysinit: 系统初始化脚本 检测并以读写⽅式重新挂载根⽂件系统; 设定主机名; 检测并挂载/etc/fstab中的其它⽂件系统; 启动swap分区; 初始化外围硬件设备的驱动; 根据/etc/sysctl.conf设定内核参数; 激活udev和selinux; 激活LVM和RAID设备; 清理过期锁和PID⽂件; 装载键映射;/etc/inittabid:3:initdefault: (默认运⾏级别)si::sysinit:/etc/rc.d/rc.sysinit (系统初始化脚本)/etc/rc.d/rc.sysinitechoinsmodifconfig/bin/bashshutdown -r -hhalt 关机reboot 重启poweroff 关机init 0 关机init 6 重启1、关机和重启;2、主机名;3、运⾏对应服务脚本;4、启动终端;5、运⾏⽤户;6、定义单⽤户级别;7、装载⽹卡驱动,启⽤⽹络功能;8、提供⼀个web服务器;9、设定内核参数;busybox: ⼆进制程序,1M⼤⼩,能模拟数百个命令的使⽤;Kernel:RHEL5, RHEL6定制安装: ⾃动化安装 定制引导盘mount -n: 挂载时不更新/etc/mtab⽂件;cat /proc/mounts脚本编程知识点:1、变量中字符的长度:${#VARNAME}⼩Linux制作过程:在现有linux虚拟机增加⼀块20G的IDE硬盘,并对磁盘进⾏分区和创建⽂件系统,将创建的⽂件系统挂载到/mnt/boot和/mnt/sysroot⽬录;[root@localhost ~]# fdisk -l(查看系统上磁盘及分区情况)Disk /dev/hda: 21.4 GB, 21474836480 bytes15 heads, 63 sectors/track, 44384 cylindersUnits = cylinders of 945 * 512 = 483840 bytesDisk /dev/hda doesn't contain a valid partition tableDisk /dev/sda: 53.6 GB, 53687091200 bytes255 heads, 63 sectors/track, 6527 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/sda1 * 1 13 104391 83 Linux/dev/sda2 14 2624 20972857+ 83 Linux/dev/sda3 2625 2755 1052257+ 82 Linux swap / Solaris[root@localhost ~]# fdisk /dev/hda(管理磁盘分区,进⼊交互式模式)Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel. Changes will remain in memory only,until you decide to write them. After that, of course, the previouscontent won't be recoverable.The number of cylinders for this disk is set to 44384.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs(e.g., DOS FDISK, OS/2 FDISK)Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)Command (m for help): n(创建分区)Command actione extendedp primary partition (1-4)p(主分区)Partition number (1-4): 1(分区编号)First cylinder (1-44384, default 1):Using default value 1Last cylinder or +size or +sizeM or +sizeK (1-44384, default 44384): +20M(创建20M分区)Command (m for help): n(创建分区)Command actione extendedp primary partition (1-4)p(主分区)Partition number (1-4): 2(分区编号)First cylinder (43-44384, default 43):Using default value 43Last cylinder or +size or +sizeM or +sizeK (43-44384, default 44384): +512M(创建512M分区)Command (m for help): w(保存退出)The partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.[root@localhost ~]# partprobe /dev/hda(让内核重新扫描分区表)[root@localhost ~]# fdisk -l /dev/hda(查看/dev/hda分区情况)Disk /dev/hda: 21.4 GB, 21474836480 bytes15 heads, 63 sectors/track, 44384 cylindersUnits = cylinders of 945 * 512 = 483840 bytesDevice Boot Start End Blocks Id System/dev/hda1 1 42 19813+ 83 Linux/dev/hda2 43 1101 500377+ 83 Linux[root@localhost ~]# mke2fs -j /dev/hda1(将/dev/hda1创建为带⽇志的⽂件系统,即ext3⽂件系统)mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)4968 inodes, 19812 blocks990 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=204472323 block groups8192 blocks per group, 8192 fragments per group1656 inodes per groupSuperblock backups stored on blocks:8193Writing inode tables: doneCreating journal (1024 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.[root@localhost ~]# mke2fs -j /dev/hda2(将/dev/hda2创建为带⽇志的⽂件系统,即ext3⽂件系统)mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)125488 inodes, 500376 blocks25018 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=6763315262 block groups8192 blocks per group, 8192 fragments per group2024 inodes per groupSuperblock backups stored on blocks:8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409Writing inode tables: doneCreating journal (8192 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.[root@localhost ~]# mkdir /mnt/{boot,sysroot}(创建/mnt/boot⽬录和/mnt/sysroot⽬录,花括号{}展开)[root@localhost ~]# mount /dev/hda1 /mnt/boot/(将/dev/hda1挂载到/mnt/boot/⽬录)[root@localhost ~]# mount /dev/hda2 /mnt/sysroot/(将/dev/hda2挂载到/mnt/boot/⽬录)[root@localhost ~]# mount(查看系统所有挂载的⽂件系统)/dev/sda2 on / type ext3 (rw)proc on /proc type proc (rw)sysfs on /sys type sysfs (rw)devpts on /dev/pts type devpts (rw,gid=5,mode=620)/dev/sda1 on /boot type ext3 (rw)tmpfs on /dev/shm type tmpfs (rw)none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)/dev/hda1 on /mnt/boot type ext3 (rw)/dev/hda2 on /mnt/sysroot type ext3 (rw)[root@localhost ~]# tree /mnt/(查看/mnt⽬录树)/mnt/|-- boot| `-- lost+found`-- sysroot`-- lost+found4 directories, 0 files提供内核:[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz(复制vmlinuz-2.6.18-308.el5到/mnt/boot/⽬录叫vmlinuz)制作initrd⽂件:[root@localhost ~]# mkdir test(创建test⽬录)[root@localhost ~]# cd test/(切换到test⽬录)[root@localhost test]# zcat /boot/initrd-2.6.18-308.el5.img | cpio -id(不解压initrd⽂件查看内容将结果送给管道,通过cpio展开到当前⽬录)12218 blocks[root@localhost test]# ls(查看当前⽬录⽂件及⼦⽬录)bin dev etc init lib proc sbin sys sysroot[root@localhost test]# vim init(编辑init程序)mkrootdev -t ext3 -o defaults,ro /dev/hda2(以只读⽅式挂载根⽂件系统)#echo "Loading dm-mem-cache.ko module"#insmod /lib/dm-mem-cache.ko#echo "Loading dm-mod.ko module"#insmod /lib/dm-mod.ko#echo "Loading dm-log.ko module"#insmod /lib/dm-log.ko#echo "Loading dm-region_hash.ko module"#insmod /lib/dm-region_hash.ko#echo "Loading dm-message.ko module"#insmod /lib/dm-message.ko#echo "Loading dm-raid45.ko module"#insmod /lib/dm-raid45.ko#echo Waiting for driver initialization.#stabilized --hash --interval 1000 /proc/scsi/scsi(没有scsi盘,所以也注释掉)#resume LABEL=SWAP-sda3(注释掉交换分区):.,+20s@^@#@g(搜索当前⾏向下加20⾏,搜索所有⾏⾸的添加#号)提⽰:装载dm(Device Mapper逻辑卷设备)模块其实对我们都没有⽤,因为我们并没有把根⽂件系统做在⼀个所谓的逻辑卷上;[root@localhost test]# cd lib/(切换到lib⽬录)[root@localhost lib]# ls(查看当前⽬录⽂件及⼦⽬录)ahci.ko dm-mem-cache.ko dm-raid45.ko ext3.ko libata.ko mptspi.ko scsi_transport_spi.koata_piix.ko dm-message.ko dm-region_hash.ko firmware mptbase.ko ohci-hcd.ko sd_mod.kodm-log.ko dm-mod.ko ehci-hcd.ko jbd.ko mptscsih.ko scsi_mod.ko uhci-hcd.ko[root@localhost lib]# rm -f dm-*(强制删除dm开头的所有⽂件)[root@localhost lib]# lsahci.ko ehci-hcd.ko firmware libata.ko mptscsih.ko ohci-hcd.ko scsi_transport_spi.ko uhci-hcd.koata_piix.ko ext3.ko jbd.ko mptbase.ko mptspi.ko scsi_mod.ko sd_mod.ko[root@localhost test]# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz(查找当前⽬录的所有⽂件,将结果通过管道送给cpio归档,-H指定备份时欲使⽤的⽂件格式,newc指cpio归档⽂件⽬录结构,把当前⽬录下每⼀个⽂件包括它的⼦⽬录整个映射路径统统给它按原有的路径格式进⾏保存,并且能够⽀持多于512200个⽂件,默认情况下cpio归档所⽀持的⽂件个数⾮常少,newc表⽰新规范的⽅式来进⾏归档,⽀持更多的⽂件数量,--quie表⽰静默模式,不输出信息,-o表⽰创建归档⽂件,将结果送给管道通过gzip进⾏压缩,-9指定压缩级别,保存⾄/mnt/boot/⽬录较initrd.gz)[root@localhost lib]# ls -lh /mnt/boot/(查看/mnt/boot⽬录⽂件详细信息,并进⾏单位换算)total 2.3M-rw-r--r-- 1 root root 374K Dec 2 02:48 initrd.gzdrwx------ 2 root root 12K Dec 2 02:14 lost+found-rw-r--r-- 1 root root 1.9M Dec 2 02:17 vmlinuz安装grub:[root@localhost ~]# grub-install --root-directory=/mnt/ /dev/hda(安装grub,根⽬录/mnt,设备/dev/hda)Probing devices to guess BIOS drives. This may take a long time.Installation finished. No error reported.This is the contents of the device map /mnt//boot/grub/device.map.Check if this is correct or not. If any of the lines is incorrect,fix it and re-run the script `grub-install'.(fd0) /dev/fd0(hd0) /dev/hda(hd1) /dev/sda[root@localhost ~]# ls /mnt/boot/(查看/mnt/boot⽬录⽂件及⼦⽬录)grub initrd.gz lost+found vmlinuz提⽰:检测/mnt/boot⽬录有没有刚安装的grub;提供grub配置⽂件:[root@localhost ~]# vim /mnt/boot/grub/grub.conf(编辑grub.conf配置⽂件)default=0timeout=3title Smoke Linux(2.6.18)root(hd0,0)kernel /vmlinuzinitrd /initrd.gz提供真正的根⽂件系统:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# mkdir -pv etc/rc.d/init.d bin sbin proc sys dev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home opt boot(添加系统所需要的⽬录)mkdir: created directory `etc'mkdir: created directory `etc/rc.d'mkdir: created directory `etc/rc.d/init.d'mkdir: created directory `bin'mkdir: created directory `sbin'mkdir: created directory `proc'mkdir: created directory `sys'mkdir: created directory `dev'mkdir: created directory `lib'mkdir: created directory `root'mkdir: created directory `mnt'mkdir: created directory `media'mkdir: created directory `var'mkdir: created directory `var/log'mkdir: created directory `var/run'mkdir: created directory `var/lock'mkdir: created directory `var/lock/subsys'mkdir: created directory `var/tmp'mkdir: created directory `usr'mkdir: created directory `usr/bin'mkdir: created directory `usr/sbin'mkdir: created directory `usr/local'mkdir: created directory `tmp'mkdir: created directory `home'mkdir: created directory `opt'mkdir: created directory `boot'提⽰:etc/{rc.d/init.d} bin sbin proc sys dev是最核⼼的,var usr可以独⽴分区,未必是必须的,lib得有,tmp home可以单独分区,root不能单独分区,管理员家⽬录此时没有管理员的概念,所以不是核⼼的,usr可以单独分区,所以也不是核⼼的,mnt media不能分区,是挂载点,boot是在真正的根上挂载hda1的;[root@localhost sysroot]# ls(查看你当前⽬录⽂件及⼦⽬录)bin boot dev etc home lib lost+found media mnt opt proc root sbin sys tmp usr var创建配置⽂件:[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:(启动默认级别)si::sysinit:/etc/rc.d/rc.sysinit(初始化脚本)[root@localhost sysroot]# vim etc/rc.d/rc.sysinit(边界初始化脚本)#!/bin/bash#echo -e "\tWelcome to \033[34Smoke\033[0m Linux"(\t缩进⼀个TAB键)/bin/bash[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysinit(给rc.sysinit⽂件执⾏权限)通过脚本抑制命令和命令依赖的库⽂件:[root@localhost ~]# cat bincopy.sh(查看bincopy.sh脚本)#!/bin/bash#DEST=/mnt/sysrootlibcp() {LIBPATH=${1%/*}[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."}bincp() {CMDPATH=${1%/*}[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATHfor LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`;dolibcp $LIBdone}read -p "Your command:" CMDuntil [ $CMD == 'q' ];do! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continueCOMMAND=`which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`bincp $COMMANDecho "copy $COMMAND finishd."read -p "Continue:" CMDdone[root@localhost ~]# ./bincopy.sh(执⾏移植命令和依赖的库⽂件脚本)Your command:init/sbin/initcopy lib /lib/libsepol.so.1 finished.copy lib /lib/libselinux.so.1 finished.copy lib /lib/libc.so.6 finished.copy lib /lib/libdl.so.2 finished.copy lib /lib/ld-linux.so.2 finished.copy /sbin/init finishd.Continue:bash/bin/bashcopy lib /lib/libtermcap.so.2 finished.copy /bin/bash finishd.Continue:ls/bin/lscopy lib /lib/librt.so.1 finished.copy lib /lib/libacl.so.1 finished.copy lib /lib/libpthread.so.0 finished.copy lib /lib/libattr.so.1 finished.copy /bin/ls finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)测试通过切换根⽂件系统:[root@localhost ~]# chroot /mnt/sysroot/(切换根⽂件系统)bash-3.2# lsbin boot dev etc home lib lost+found media mnt opt proc rc.d root sbin sys tmp usr varbash-3.2# ls /etc/inittab rc.dbash-3.2# exitexit测试:将虚拟机挂起,将制作好的⼩Linux系统的IDE的硬盘添加到新创建的虚拟机系统;通过echo⼀段话保存到/tmp/a.txt⽂件⾥⾯,提⽰只读⽂件系统,所以根⽂件系统是只读的;切换到宿主机:[root@localhost ~]# ./bincopy.sh(当前⽬录执⾏bincopy.sh脚本,复制命令及命令依赖的库⽂件)Your command:touch/bin/touchcopy /bin/touch finishd.Continue:mkdir/bin/mkdircopy /bin/mkdir finishd.Continue:rm/bin/rmcopy /bin/rm finishd.Continue:mv/bin/mvcopy /bin/mv finishd.Continue:cp/bin/cpcopy /bin/cp finishd.Continue:cat/bin/catcopy /bin/cat finishd.Continue:mount/bin/mountcopy lib /lib/libblkid.so.1 finished.copy lib /lib/libuuid.so.1 finished.copy lib /lib/libdevmapper.so.1.02 finished.copy /bin/mount finishd.Continue:umount/bin/umountcopy /bin/umount finishd.Continue:vi/bin/vicopy /bin/vi finishd.Continue:vim/usr/bin/vimcopy lib /usr/lib/libncurses.so.5 finished.copy lib /usr/lib/libgpm.so.1 finished.copy lib /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so finished.copy lib /lib/libresolv.so.2 finished.copy lib /lib/libutil.so.1 finished.copy lib /lib/libm.so.6 finished.copy lib /lib/libnsl.so.1 finished.copy lib /lib/libcrypt.so.1 finished.copy /usr/bin/vim finishd.Continue:chmod/bin/chmodcopy /bin/chmod finishd.Continue:chown/bin/chowncopy /bin/chown finishd.Continue:ping/bin/pingcopy /bin/ping finishd.Continue:ifconfig/sbin/ifconfigcopy /sbin/ifconfig finishd.Continue:insmod/sbin/insmodcopy /sbin/insmod finishd.Continue:modprobe/sbin/modprobecopy /sbin/modprobe finishd.Continue:rmmod/sbin/rmmodcopy /sbin/rmmod finishd.Continue:route/sbin/routecopy /sbin/route finishd.Continue:halt/sbin/haltcopy /sbin/halt finishd.Continue:reboot/sbin/rebootcopy /sbin/reboot finishd.Continue:shutdown/sbin/shutdowncopy /sbin/shutdown finishd.Continue:hostname/bin/hostnamecopy /bin/hostname finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)挂载宿主机,切换到⼩Linux系统:注意:启动⼩Linux系统完成之后,它没法⾃动完成将根⽂件系统重新挂载为可读写,所以应该编写rc.sysinit配置⽂件,让它可读写;挂载为可读写:mount -o remount,rw / :读写⽅式挂载根⽂件系统,-o指定额外的挂载选项,也即指定⽂件系统启⽤的属性,⼤部分选项都可以使⽤no option进⾏关闭此功能,如果指定多个功能属性,选项之间通过逗号隔开即可,remount重新挂载当前⽂件系统,把卸载和挂载⼀块来使⽤,先卸载再挂载,重新挂载可以不指定挂载点,rw读写挂载;提⽰:报错,/etc/mtab追踪当前系统挂载每⼀个⽂件系统,不带任何选项的mount命令所显⽰的内容被保存在/etc/mtab当中,以后挂载的每⼀个⽂件系统只要挂载都会保存到/etc/mtab当中,卸载⼀个⽂件系统,它会从/etc/matb当中删除,但是此时整个根都是只读的,所以挂载⽂件系统,不能将挂载的内容写⼊到/etc/mtab当中,那怎么办,mount 有个-n选项,在挂载的时候不更新/etc/mtab⽂件,mount -n: 挂载时不更新/etc/mtab⽂件;cat /proc/mounts:mounts⽂件也会显⽰当前系统上所挂载的所有⽂件系统;通过mount -n -o remount,rw /重新挂载根⽂件系统:不让报can't create locak file /etc/mtab~520: Read-only file system (use -n flag ride)错误;提⽰:⼜报错,读取不到/etc/fastab⽂件,说明重新挂载也会读取/etc/fstab⽂件,但是挂载已经完成了;提⽰:创建/tmp/a.txt⽂件成功,但是/tmp⽬录的权限应该是1777的;测试halt命令关机:提⽰:halt命令会⾃动完成切换到级别0,只是把当前进程关掉了,它没办法完成切断电源的,如何切断电源halt有个-p选项,在执⾏关机的时候,能够直接切断电源的;但是切断电源以后,它仍然⽆法把bash进程,halt命令是在bash进程中提⽰执⾏的,那就意味着halt是bash的⼦进程,所以使⽤halt命令只能关闭⼦进程⾃⾝,对⽗进程没有关系,如果让⽗进程⼀并关掉的话,有个命令叫exec查看exec命令帮助:提⽰:执⾏Exec⽂件,⽽且执⾏的时候是以当前bash直接替换为那个进程(简单来讲,默认情况下,我们所谓在bash命令下执⾏halt进程,它就在bash下执⾏⼀个⼦进程,⽽当我们使⽤exec的时候,不是这样的,当在命令提⽰符执⾏halt命令以后,halt进程⼀起来,这个⽗进程就没有了,它以⼦进程直接替换⽗进程的,⽽不是成为⽗进程的⼦进程,exec表⽰让启动的⼦进程直接替换原有的进程,⽽不是作为它的⼦进程来执⾏的,这样⼀来halt⼀结束,这样的bash也就结束了)exec halt -p:让exec命令启动halt命令⽽且直接替换原有的bash进程;提⽰:还是不⾏,事实上当指定halt命令它会切换到0级别下去了,根当前级别没有关系,所以还要执⾏对应级别下的操作才可以,那于是应该把halt命令放到对应级别下可执⾏⽂件⾥⾯,并且执⾏halt命令的时候,或者执⾏关机命令的时候,它能够⾃动去完成那个执⾏对应级别下的K*开头的脚本和S*开头的脚本,把S*开头的脚本都start起来,把K*开头的脚本都stop掉,所以还要修改它的执⾏流⾏,由此可见使⽤命令关机是关不掉的;切换到宿主机:给⼩Linux系统提供⼀个脚本:关机:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# ls(查看当前⽬录⽂件及⼦⽬录)bin boot dev etc home lib lost+found media mnt opt proc root sbin sys tmp usr var[root@localhost sysroot]# vim etc/rc.d/rc.sysdone(编辑rc.sysdone脚本)#!/bin/bash#sync(当执⾏关键命令时候,如果此前写⼊⼀些内容进去,需要将这些内容从内存同步到磁盘上去)sleep 2(睡眠2秒)sync(再同步⼀次,确保所有的⽂件都同步完成)exec /sbin/halt -p(使⽤halt绝对路径,不使⽤绝对路径可能找不到,因为不登录,它可能没有path环境变量)[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysdone(给rc.sysdone⽂件执⾏权限)[root@localhost sysroot]# cd(切换到根⽤户家⽬录)通过脚本移植sync和sleep命令:[root@localhost ~]# ./bincopy.sh(当前⽬录执⾏bincopy.sh脚本)Your command:sync/bin/synccopy /bin/sync finishd.Continue:sleep/bin/sleepcopy /bin/sleep finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)提⽰:此时还没有做完整,还需要编辑etc/inittab⽂件[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc.sysdone(运⾏在0级别的时候执⾏/etc/rc.d/rc.sysdone脚本)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;使⽤init 0可以正常关机;重启:[root@localhost ~]# cd /mnt/sysroot/(切换到/mntsysroot⽬录)[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc.sysdonel6:6:wait:/etc/rc.d/rc.reboot(在6级别下执⾏rc.reboot脚本)[root@localhost sysroot]# vim etc/rc.d/rc.reboot(编辑rc.reboot脚本)#!/bin/bash#syncsleep 1syncexec /sbin/reboot[root@localhost sysroot]# chmod +x etc//rc.d/rc.reboot(给rc.reboot脚本执⾏权限)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;使⽤init 6可以正常重启;提⽰:如果在此处修改⼩Linux系统,再回到宿主机可能会出现⽂件系统崩溃的,因为两个主机改⼀个磁盘,⽽且那个主机是挂起的,所以刚才改的内容,宿主机不知道;实现对应级别下的服务脚本实现关机和重启:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# vim etc/rc.d/init.d/halt(编辑halt脚本)#!/bin/bash#case $0 in ($0取得脚本路径名称,通过脚本名称来判断重启还是关机)*reboot)COMMAND=`/sbin/reboot ;;*halt)COMMAND=`/sbin/halt -p ;;*)echo "Only call this script by *reboot OR *halt;";;esaccase $1 instart);;stop);;*)echo "Usage: `basename $0` {start|stop}" (basename $0获取脚本名称);;esacexec $COMMAND[root@localhost sysroot]# chmod +x etc/rc.d/init.d/halt(给halt脚本执⾏权限)[root@localhost sysroot]# cd etc/rc.d/(切换到etc/rc.d⽬录)[root@localhost rc.d]# mkdri rc0.d rc6.d(创建rc0.d和rc6.d⽬录)[root@localhost rc.d]# cd rc0.d/(切换到rc0.d⽬录)[root@localhost rc0.d]# ln -sv ../init.d/halt S99halt(给../init.d/halt⽂件创建软连接叫S99halt,并显⽰创建过程,99代表最后关机)create symbolic link `S99halt' to `../init.d/halt'提⽰:S99halt,S代表start在相应级别下启动该脚本,,当执⾏S99halt,脚本取得halt选择关机[root@localhost rc0.d]# ll(查看当前⽬录⽂件及⼦⽬录)total 1lrwxrwxrwx 1 root root 14 Nov 22 04:07 S99halt -> ../init.d/halt[root@localhost rc0.d]# cd ../rc6.d/(切换到rc6.d⽬录)[root@localhost rc6.d]# ln -sv ../init.d/halt S99reboot(给../init.d/halt⽂件创建软连接叫S99reboot,并显⽰创建过程,99代表最后重启)create symbolic link `S99reboot' to `../init.d/halt'提⽰:S99reboot,S代表start在像应级别下启动该脚本,当执⾏S99reboot,脚本取得reboot选择重启;[root@localhost rc6.d]# cd ..(切换到上级⽬录)[root@localhost rc.d]# rm -f rc.reboot rc.sysdone(强制删除rc.reboot和rc.sysdone脚本)[root@localhost rc.d]# ls(查看当前⽬录⽂件及⼦⽬录)init.d rc0.d rc6.d rc.sysinit[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# vim rc(编辑rc脚本)#!/bin/bash#RUNLEVEL=$1(接受⼀个参数,相当于运⾏级别)for I in /etc/rc.d/rc$RUNLEVEL.d/K*;do$I stopdonefor I in /etc/rc.d/rc$RUNLEVEL.d/S*;do$I startdone提⽰:当RUNLEVEL参数为0执⾏/etc/rc.d/rc0.d/K*所有脚本停⽌,执⾏/etc/rc.d/rc0.d/S*所有脚本启动,当RUNLEVEL参数为6执⾏/etc/rc.d/rc6.d/K*所有脚本停⽌,执⾏/etc/rc.d/rc6.d/S*所有脚本启动;[root@localhost rc.d]# chmod +x rc(给rc脚本执⾏权限)[root@localhost rc.d]# cd ..(切换到上级⽬录)[root@localhost etc]# vim inittab(编辑inittab脚本)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6[root@localhost etc]# sync(同步磁盘写⼊)[root@localhost etc]# sync(同步磁盘写⼊)[root@localhost etc]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;测试重启,可以正常重启;测试关机,可以正常关机;提⽰:由于没有K*开头的脚本所以提⽰报错;如何实现在对应级别下启动服务:[root@localhost sysroot]# vim etc/inittab(编辑etc/inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6l3:3:wait:/etc/rc.d/rc 3[root@localhost sysroot]# cd etc/rc.d/(切换到etc/rc.d⽬录)[root@localhost rc.d]# mkdir rc3.d(创建rc3.d⽬录)[root@localhost rc.d]# ls(查看当前⽬录⽂件及⼦⽬录)init.d rc rc0.d rc3.d rc6.d rc.sysinit[root@localhost rc.d]# vim init.d/tserver(编辑tserver脚本)#!/bin/bash#prog=`basename $0`(取得脚本路径的基名,也就是脚本名称)lockfile=/var/lock/subsys/$progstart() {echo "Starting $prog ..."touch $lockfile}stop () {echo "Stopping $prog ..."rm -f $lockfile}status() {if [ -f $lockfile ];thenecho "Running..."elseecho "Stopped..."fi}usage() {echo "Usage: $prog {start|stop|status|restart}"}case $1 instart)start ;;stop)stop ;;restart)stopstart;;status)status;;*)usageexit 1;;esac提⽰:如果tserver⽂件存在说明服务启动,不存在说明服务没启动,关闭服务删除tserver⽂件;[root@localhost rc.d]# chmod +x init.d/tserver(给tserver执⾏权限)[root@localhost rc.d]# init.d/tserver start(执⾏tserver脚本)Starting tserver ...[root@localhost rc.d]# ls /var/lock/subsys/tserver(查看/var/lock/subsys/tserver⽂件存在)/var/lock/subsys/tserver[root@localhost rc.d]# init.d/tserver stop(执⾏tserver脚本)Stopping tserver ...[root@localhost rc.d]# ls /var/lock/subsys/tserver(查看/var/lock/subsys/tserver⽂件不存在)ls: /var/lock/subsys/tserver: No such file or directory[root@localhost rc.d]# init.d/tserver status(执⾏tserver脚本)Stopped...[root@localhost rc.d]# init.d/tserver statuss(执⾏tserver脚本)Usage: tserver {start|stop|status|restart}将脚本做成chkconfig调⽤的脚本:[root@localhost rc.d]# vim init.d/tserver#!/bin/bash## chkconfig: 35 66 33 (chkconfig调⽤的服务脚本,35代表3和5级别启动,66代表启动优先次序,33代表关闭优先次序)# description: test service script (描述信息)prog=`basename $0`lockfile=/var/lock/subsys/$progstart() {}stop () {echo "Stopping $prog ..."rm -f $lockfile}status() {if [ -f $lockfile ];thenecho "Running..."elseecho "Stopped..."fi}usage() {echo "Usage: $prog {start|stop|status|restart}"}case $1 instart)start ;;stop)stop ;;restart)stopstart;;status)status;;*)usageexit 1;;esac让脚本在3级别启动起来:[root@localhost rc.d]# cd rc3.d/(切换到rc3.d⽬录)[root@localhost rc3.d]# ln -sv ../init.d/tserver S66tserver(创建软连接,并显⽰创建过程,创建为S66tserver)create symbolic link `S66tserver' to `../init.d/tserver'提⽰:S66tserver中的S代表启动,66代表启动优先次序,其中66要和服务脚本中chkconfig 35 66 33中的启动优先次序的数字要⼀样;[root@localhost rc3.d]# ll(查看当前⽬录⽂件及⼦⽬录详细信息)total 1lrwxrwxrwx 1 root root 17 Nov 22 05:08 S66tserver -> ../init.d/tserver[root@localhost rc3.d]# cd ..(切换到上层⽬录)[root@localhost rc.d]# cd rc0.d/(切换到rc0.d⽬录)[root@localhost rc0.d]# ln -sv ../init.d/tserver K33tserver(创建软连接,并显⽰创建过程,创建为K33tserver)create symbolic link `K33tserver' to `../init.d/tserver'提⽰:K33tserver中的K代表停⽌,33代表停⽌优先次序,其中33要和服务脚本中chkconfig 35 66 33中的停⽌优先次序的数字要⼀样;[root@localhost rc0.d]# cd ../rc6.d/(切换到上层⽬录下的rc6.d⽬录)[root@localhost rc6.d]# ln -sv ../init.d/tserver K33tserver(创建软连接,并显⽰创建过程,创建为K33tserver)create symbolic link `K33tserver' to `../init.d/tserver'提⽰:K33tserver中的K代表停⽌,33代表停⽌优先次序,其中33要和服务脚本中chkconfig 35 66 33中的停⽌优先次序的数字要⼀样;[root@localhost rc6.d]# ll(查看当前⽬录⽂件及⼦⽬录)total 2lrwxrwxrwx 1 root root 17 Nov 22 05:16 K33tserver -> ../init.d/tserverlrwxrwxrwx 1 root root 14 Nov 22 04:10 S99reboot -> ../init.d/halt[root@localhost rc6.d]# sync(同步磁盘写⼊)[root@localhost rc6.d]# sync(同步磁盘写⼊)[root@localhost rc6.d]# sync(同步磁盘写⼊)提⽰:此时3级别仍然没有⽤的;[root@localhost rc6.d]# cd ../../(切换到上层⽬录的上层⽬录)[root@localhost etc]# ls(查看当前⽬录⽂件及⼦⽬录)inittab rc.d[root@localhost etc]# vim inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6l3:3:wait:/etc/rc.d/rc 3提⽰:当执⾏到si的时候,会执⾏etc/rc.d/rc.sysinit脚本,这个脚本直接启动了/bin/bash,因此3级别的脚本不会执⾏,为什么0级别和6级别会执⾏,我们使⽤init切换过去⽽已,所以此时3级别不可能会随系统启动的,因为执⾏流程不到这⾥,到si::sysinit:/etc/rc.d/rc.sysinit已经完成系统启动了,因为在rc.sysinit脚本已经直接执⾏了/bin/bash了,那么RHEL 5的系统是如何启动的,为什么它会执⾏呢,它不是在/etc/rc.d/rc.sysinit登录的系统,⽽是在inittab⽂件⾥⾯还有⼏个tty终端,所以它们的执⾏流程是正常的,我们此时执⾏流程不正常,那该怎么办?[root@localhost etc]# man mingetty(查看mingetty的man帮助⽂档)[root@localhost etc]# cat /etc/inittab(查看inittab⽂件)## inittab This file describes how the INIT process should set up# the system in a certain run-level.## Author: Miquel van Smoorenburg, <miquels@># Modified for RHS Linux by Marc Ewing and Donnie Barnes## Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)#id:3:initdefault:# System initialization.si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now# When our UPS tells us power has failed, assume we have a few minutes# of power left. Schedule a shutdown for 2 minutes from now.# This does, of course, assume you have powerd installed and your# UPS connected and working correctly.pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"# If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm -nodaemon提⽰:系统的/etc/inittab⽂件在不同级别下的脚本执⾏完成以后开始执⾏1:2345:respawn:/sbin/mingetty tty1-6:2345:respawn:/sbin/mingetty tty6(在2345级别下,都启动了6个终端),使⽤/sbin/mingetty命令启动的,所以当执⾏完si::sysinit:/etc/rc.d/rc.sysinit脚本以后,它会继续往下执⾏3级别下的l3:3:wait:/etc/rc.d/rc 3这个脚本的,⽽si::sysinit:/etc/rc.d/rc.sysinit脚本⾥⾯是没有启动/bin/bash的,我们让它启动了/bin/bash这是不合理的;[root@localhost etc]# vim inittab(编辑inittab⽂件)id:3:initdefault:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
接口。 虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口,
VFS提供了十多种不同类型的文件系统。
Linux内核裁剪移植——内核的主要组成部分 5
网络接口提供了对各种网络标准的存取和各种网络硬件的支持。 进程通信部分用于支持进程间各种不同的通信机制。 进程调度处于核心位置,内核的其他子系统都要依赖它,因为每个子系统都存在进程挂起或恢
Linux内核裁剪移植 ——内核的主要组成部分
Linux内核裁剪移植——内核的主要组成部分 2
内核,即操作系统。它为底层的可编程部件提供服务,为上层应用程序提供执行环境。 内核裁剪就是对这些功能进行裁剪,选取满足特定平台和需求的功能。不同的硬件平台对内核
要求也不同,因此从一个平台到另一个平台需要对内核进行重新配置和编译。 操作系统从一个平台过渡到另一个平台称为移植。 Linux是一款平台适应性且容易裁剪的操作系统,因此Linux在嵌入式系统得到了广泛的应用。
Linux内核裁剪移植——内核的主要组成部分 3
Linux内核主要的5个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系 统移植的时候,它们是内核的基本元素。
Linux内核裁剪移植——内核的主要组成部分 4
进程调度部分负责控制进程对CPU的访问。 内存管理允许多个进程安全地共享主内存区域。内存管理从逻核的主要组成部分 7
虚拟文件系统与网络接口之间的关系: ➢ 虚拟文件系统通过依赖网络接口支持网络文件系统(NFS) ➢ 也通过依赖内存管理支持RAMDISK设备。
内存管理与虚拟文件系统之间的关系: ➢ 内存管理利用虚拟文件系统支持交换 ➢ 交换进程定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。 ➢ 当一个进程存取的内存映射被换出时,内存管理将会向文件系统发出请求,同时,挂起当 前正在运行的进程。
复过程。
Linux内核裁剪移植——内核的主要组成部分 6
进程调度与内存管理之间的关系: ➢ 这两个子系统为互相依赖关系。 ➢ 在多道程序环境下,程序要运行必须为之创建进程,而创建进程首先就是要将程序和数据 装入内存。 ➢ 另外,内存管理子系统也存在进程的挂起和恢复过程。
进程间通信与内存管理之间的关系: ➢ 进程间通信子系统要依赖内存管理支持共享内存通信机制 ➢ 通过对共同的内存区域进行操作来达到通信的目的。