Linux内核裁剪和定制方法
内核配置与裁剪

内核配置与裁剪1. Linux内核配置内核配置的方法很多,make config、make xconfig、make menuconfig、make oldconfig 等等,它们的功能都是一样的。
这里用的是make menuconfig。
过去基于2.x的内核为用户提供了四种基本的内核设置编辑器:✧. config 服务于内核设置的一个冗长的命令行界面;✧. oldconfig 一个文本模式的界面,主要包含一个已有设置文件,对用户所发现的内核资源中的设置变量进行排序;✧. menuconfig 一个基于光标控制库的终端导向编辑器,可提供文本模式的图形用户界面;✧. xconfig 一个图形内核设置编辑器,需要安装X-Window系统。
前三种编辑器在设置2.6内核时仍可使用,在运行“make xconfig”后,原有的界面被两个新的图形设置编辑器所代替。
这需要具体的图形库和X-Window系统的支持。
另外,用户还可以通过“make defconfig”命令,利用所有内核设置变量的缺省值自动建立一个内核设置文件。
下面具体介绍Linux内核配置选项:. 代码成熟度选项Code maturity level options --->[*] Prompt for development and/or incomplete code/drivers[*] Select only drivers expected to compile cleanly在内核中包含了一些不成熟的代码和功能,如果我们想使用这些功能,想打开相关的配置选项,就必需打开这一选项。
. 通用设置选项General setup --->() Local version - append to kernel release[*] Automatically append version information to the version string[*] Support for paging of anonymous memory (swap)[*] System V IPC[*] POSIX Message Queues[*] BSD Process Accounting[*] BSD Process Accounting version 3 file format[*] Sysctl support[ ] Auditing support[*] Support for hot-pluggable devices[*] Kernel Userspace Events[*] Kernel .config support[*] Enable access to .config through /proc/config.gz() Initramfs source file(s)[*] Configure standard kernel features (for small systems) ---> --- Configure standard kernel features (for small systems) [ ] Load all symbols for debugging/kksymoops[ ] Do an extra kallsyms pass[ ] Enable support for prinlk[ ] BUG()support[ ] Enable full-sinzed data structures for core[*] Enable futex support[*] Enable eventpoll support[*] Optimize for size[*] Use full shmem filesystem(0) Function alignment(0) Label alignment(0) Loop alignment(0) Jump alignmentLocal version - append to kernel release:这里填入的是64字符以内的字符串,在这里填上的字符串可以用uname -a命令看到。
Linux内核裁减

Linux内核裁减及根文件系统定制目录:一、内核编译二、根文件系统定制三、内核选项说明一、内核编译1、准备工作(1)整理出系统需要支持的硬件、文件系统类型以及网络协议等内容。
(2)建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/lib/modules下的内容备份,否则将来的make modules_install 步骤产生的文件会覆盖这个路径下的内容。
(3)下载并解压linux内核。
以下假设你已经下载了内核的为linux-x-y-z.tar.gz。
一般都将linux内核源代码放在/usr/src下,这里仍然遵守这个习惯,如果你的这个路径下已经存在这个版本的内核,建议将已有的改个名称。
2、开始编译(1)make mrproper确保源代码目录下没有不正确的.o文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。
如果你是下载的内核源码,而且是第一次编译,就没有必要执行这一步操作(2)make menuconfig以文本菜单方式选择内核选项(与它功能相同的命令还有makeconfig;make xconfig;make oldconfig),不同版本的内核,选项可能会有一些差异。
{注:#make config(基于文本的最为传统的配置界面,不推荐使用)#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐你使用这个命令。
}这一步是内核编译的关键,根据需要支持的硬件、文件系统和协议等内容,选择不同的选项。
配置选项时,有三种选择方式,它们代表的含义如下:Y-将该功能编译进内核N-不添加功能M-将该功能编译成模块,在需要时动态加载到内核选择的原则:是与内核关心紧密而且经常使用的部分功能代码直接编译到内核中;将与内核系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选。
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;。
LINUX内核裁减及根文件系统定制(之二)--------根文件系统定制

# mknod ram0 b 1 0
# chmod 600 ram0
建立 null 设备
建立一般终端机设备
# mknod tty c 5 0
# mkdir console c 5 1
# chmod 666 tty console
建立 VGA Display 虚拟终端机设备
# mknod tty1 c 4 0
# chmod 666 tty0 源自建立 RAM disk 设备
2、 创建基本的目录结构 # cd /mnt/initrd
#mkdir dev proc etc etc/rc.d sbin bin lib mnt tmp var usr #chmod 755 dev etc etc/rc.d sbin bin lib mnt tmp var usr #chmod 555 proc
3、 添加设备
你可以使用mknod创建,也可以从现有的系统中拷贝过来,拷贝的时候一定要注意,最好使用-dfR,这样有两个好处:1、拷贝路径下的所有文件,如果有文件夹,则嵌套拷贝整个文件夹下的内容;2、保持文件(设备)的属性不变。 这里采用mknod创建的方式,以下设备是必须的console、kmem、mem、null、ram0、tty等。
Linux内核裁减及根文件系统定制(之二)--------根文件系统定制 二、根文件系统定制
1、 创建一个全新的根文件系统
你可以用mkinitrd来创建,这里介绍另外一种方式,用dd命令:
# mkdir -p /mnt/initrd 创建一个设备点,用于临时挂载根文件系统。
创建一个名为initrd的根文件 # cd /tmp 在tmp下创建根文件系统 # dd if=/dev/zero of=/tmp/initrd bs=512 count=40960
Linux内核安装、裁剪图文教程

目录Practice1 (4)一编译过程 (4)1 安装必要的软件 (4)2 下载linux内核源文件 (4)3 解压缩源文件 (5)4 复制config文件 (6)5 进行menucofig配置 (6)6 menuconfig配置页面 (7)7 对驱动设置进行简单配置 (8)8 选择cpu类型 (8)9 设置完成保存退出 (9)10 开始编译内核 (9)11 内核编译过程 (10)12 内核编译过程(3小时后) (11)13 内核编译成功 (12)14 安装新内核 (12)15 新内核安装过程 (13)16 比较两个内核 (14)17 重新启动系统 (14)18 登录新内核 (15)19 新内核登录成功 (15)20 查看新内核版本号号 (16)二、编译过程中遇到的问题 (16)1 错误VFS:Unable to mount root (16)2错误Driver ‘mdio-gpio’ (18)Practice2 (20)一、内核选项翻译及选择理由 (20)1. General setup 常规设置 (20)二、裁剪过程 (21)1.进入设置界面 (21)2. General setup页设置 (22)3. Enable the block layer页设置 (23)4. Processor type and features页设置 (24)5. Power Management and ACPI options页设置 (28)6. Bus options页设置 (29)7. Executable file formats页设置 (30)8. Networking options页设置 (31)9. Device Drivers 页设置 (34)10. Firmware Drivers页设置 (37)11. File systems页设置 (38)12. Kernel hacking页设置 (40)13 CryptographicAPI页设置 (41)14. 裁剪后内核运行截图 (42)15. 内核大小9.6M (43)感受和体会 (44)Practice1一编译过程1 安装必要的软件代码: $sudo apt-get install build-essential kernel-package libncurses5-dev2 下载linux内核源文件/下载2.6.38.8full版3 解压缩源文件代码:$ mkdir src && tar jfx linux-2.6.25.10.tar.bz2 -C src/4 复制config文件命令:cp /boot/config-`uname -r` ./.config5 进行menucofig配置代码:$sudo make menuconfig6 menuconfig配置页面7 对驱动设置进行简单配置8 选择cpu类型9 设置完成保存退出10 开始编译内核代码:$ sudo make-kpkg -initrd --initrd --append-to-version=bo100 kernel_image kernel-headers11 内核编译过程12 内核编译过程(3小时后)13 内核编译成功14 安装新内核代码:$ sudo dpkg -i linux-image-2.6.38bo10015 新内核安装过程16 比较两个内核17 重新启动系统18 登录新内核19 新内核登录成功20 查看新内核版本号号二、编译过程中遇到的问题1 错误VFS:Unable to mount root描述:内核安装成功后,启动内核出现如下图错误原因:在执行内核安装的时候,initrd可能没有被安装出现以下错误如图,新版本的initrd并没有安装成功,vmlinu有两份,而initrd只有一份。
第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平台下各种芯片兼容的代码。
8.Linux内核裁剪

常用选项 options: 1.Code maturity level options:代码成 熟等级。 熟等级。
1.1.prompt for development and/or incomp lete code/drivers. 如果要试验现在仍处于实验阶段的功能, 如果要试验现在仍处于实验阶段的功能, 比如khttpd IPv6等 就必须把该项选择为Y khttpd、 比如khttpd、IPv6等,就必须把该项选择为Y 否则可以把它选择为N 了;否则可以把它选择为N。 默认情况下是选择的, 默认情况下是选择的,这将会在设置界面中显 示还在开发或者还没有完成的代码与驱动. 示还在开发或者还没有完成的代码与驱动.不 选。
setup:常规内核选项。 4.General setup:常规内核选项。
4.1. Networking support. 通常每个人都会选择“ support”, 通常每个人都会选择“Networking support”,因为 你通常需要它,比如Internel Internel。 Linux有很重的 有很重的Internet 你通常需要它,比如Internel。 Linux有很重的Internet 偏向, 偏向,而且它在没有联网的情况下无法充分发挥优 势。 另外,许多其他的操作也网络支持——即使它们看 另外,许多其他的操作也网络支持——即使它们看 —— 上去跟网络没多大关系。 上去跟网络没多大关系。 内核在没有网络支持选项的情 况下甚至无法编译。简而言之: 况下甚至无法编译。简而言之:一定要打开 support”选项 选项。 “Networking support”选项。 4.2. PCI support. 现在的所有系统都使用PCI总线, PCI总线 现在的所有系统都使用PCI总线,所以你应该选择相 关选项。 关选项。
linux2.6内核裁剪说明

Linux内核裁剪与移植内核,即操作系统。
它为底层的可编程部件提供服务,为上层应用程序提供执行环境。
内核裁剪就是对这些功能进行裁剪,选取满足特定平台和需求的功能。
不同的硬件平台对内核要求也不同,因此从一个平台到另一个平台需要对内核进行重新配置和编译。
操作系统从一个平台过渡到另一个平台称为移植。
Linux是一款平台适应性且容易裁剪的操作系统,因此Linux在嵌入式系统得到了广泛的应用。
本章将详细讲解内核裁剪与移植的各项技术。
4.1 Linux内核结构Linux内核采用模块化设计,并且各个模块源码以文件目录的形式存放,在对内核的裁剪和编译时非常方便。
下面介绍内核的主要部分及其文件目录。
4.1.1 内核的主要组成部分在第1章中已经介绍了Linux内核主要的5个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。
在系统移植的时候,它们是内核的基本元素,这5个部分之间的关系,如图4.1所示。
图4.1 Linux内核子系统及其之间的关系进程调度部分负责控制进程对CPU的访问。
内存管理允许多个进程安全地共享主内存区域。
内存管理从逻辑上分为硬件无关部分和硬件相关部分。
硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关部分为内存管理硬件提供了虚拟接口。
虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口,VFS提供了十多种不同类型的文件系统。
网络接口提供了对各种网络标准的存取和各种网络硬件的支持。
进程通信部分用于支持进程间各种不同的通信机制。
进程调度处于核心位置,内核的其他子系统都要依赖它,因为每个子系统都存在进程挂起或恢复过程。
* 进程调度与内存管理之间的关系:这两个子系统为互相依赖关系。
在多道程序环境下,程序要运行必须为之创建进程,而创建进程首先就是要将程序和数据装入内存。
另外,内存管理子系统也存在进程的挂起和恢复过程。
* 进程间通信与内存管理之间的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,通过对共同的内存区域进行操作来达到通信的目的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.2
Linux 源码阅读工具
俗话说“工欲善其事,必先利其器” ,面对几百兆的 Linux 内核代码,要阅读、查看或 者搜索其中的代码,大部分初次接触到 Linux 内核代码的开发人员,都有无从下手的感觉。 下面推荐几个源码阅读和索引工具,能为后续内核开发提供一些便利。 1.2.1 SourceInsight Source Insight 是 Windows 平台下一款流行度极高的源码阅读和编辑工具。不少 Linux 开发人员还是习惯于在 Windows 下进行源码编辑,甚至查看和编辑 Linux 内核源码,依然 在 Source Insight 中完成。 说明:Source Insight 是一款版权软件,需要自行解决版权问题。 安装 Source Insight 软件后,新建一个工程,取名并指定数据存放位置,如图 0.1 所示。
图 0.4 在 Source Insight 中阅读源码
1.2.2 Eclipse Eclipse 是一个跨平台 IDE,既能运行于 Windows 平台,也能在 Linux 下运行。不少习 惯于图形界面操作的开发人员,在 Linux 下则习惯于用 Eclipse 来查看和编辑 Linux 源码。 如果仅仅是在 Eclipse 中查看 Linux 内核源码,则可以不必事先安装交叉编译器,否则 则须事先安装好交叉编译器。 创建内核源码工程。点击 FileNewProject,开始创建工程,在工程创建界面选择创 建 C 工程,如图 0.5 所示。
图 0.8Vi/Vim 的函数列表侧栏
如果在本地桌面,用 Gvim 打开 C 文件,使用起来比较接近 IDE 集成环境。用鼠标双 击函数即可跳转到函数定义的地方,CTRL+鼠标右键即可回退到原来所在位置。更多实用 特性,还需要在实际操作中体验。 1.2.4 LXR LXR 是 Linux Cross Referencer 的缩写,是一个比较流行的 Linux 源码查看工具,当然 也不仅仅局限于查看 Linux 源码。LXR 的下载地址为:,参考该网站 的安装说明,很容易在本机搭建一个本地 LXR 用于源码查看。 如果不想搭建本地 LXR,可以直接浏览已经搭好的 LXR 网站,推荐两个网站:一个是 开源中国网站提供的 Linux 源码在线阅读 ,另一个是 网站,前者速度较快,但是提供的 Linux 内核版本较少,后者则 提供的版本较多。网站提供了源码阅读、关键字搜索和自由文本搜索功能。两者的网页快照 分别如图 0.9 和图 0.10 所示。
图 0.1 新建工程
点击 OK 按钮,进入工程设置界面,如图 0.2 所示。
图 0.2 工程设置
然后添加源码。浏览选中 Linux 内核源码文件夹后,点击“Add Tree”按钮,将内核源 码树的全部文件添加到工程中,如图 0.3 所示。
图 0.3 添加内核源码
添加完成,即可在 Source Insight 中进行源码阅读和编辑了,如图 0.4 所示。
Linux 内核裁剪和定制
1.1 Linux 内核开发简介
这里所说的“Linux 内核开发”仅仅是指嵌入式 Linux 产品开发中内核和驱动相关开发 工作,与 Linus 所领导的内核开发团队的内核开发有很大不同。 产品开发中对内核进行二次开发,需要开发人员具备如下一些基本技能和背景知识: 具备操作系统的基本知识,理解操作系统原理,最好了解 Linux 操作系统; 内核绝大部分都是 C 语言编写的,C 语言是必备技能; 内核是用 GNU C 编写的, 尽管符合 ISO C89 标准, 但还是使用了一些 GNU 扩展, 所以对 GNU C 的一些扩展也必须有所了解; 对 Linux 内核源码基本分布有大致了解; 产品级的内核开发通常还包括一些内核驱动工作, 对外设工作原理和驱动编写也必 须有一定的了解。
图 网页快照
图 网页快照
$ sudo apt-get install exuberant-ctags
3. 源码阅读和跟踪 进入准备查看的源码所在目录,首先生成 tags 文件:
$ ctags -R
执行时间长短取决于源码数量的多少, 执行完毕, 在当前目录下可看到一个 tags 文件。 源码越多,执行时间越长,产生的 tags 文件也越大。 注意:如果修改了源码,代码行号发生了变化,需要重新生成 tags 文件。 (1)查看函数等定义。用 Vi/Vim 打开一个 C 文件。若想知道某个函数、变量、结构 或者宏定义在什么地方定义,先将光标移动到函数(变量、结构或者宏定义)上,然后按 CTRL+]即可。查看后,按 CTRL+o 可回到原来所在位置。 (2) 查看文件函数列表。 打开 C 文件后, 在 Vi/Vim 的命令状态下输入:TlistToggle (Vi/Vim 的命令输入支持补全) , 在 Vi/Vim 左边就会出现函数列表侧栏, 如图 0.8 所示。 按 CTRL+ww (2 次 w) ,可在列表和代码查看区间切换。
图 0.5 创建 C 工程
点击 Next, 在 C Project 界面的 Project name 栏中填写工程名称, 去掉 “Use default location” 的勾, 点击 Browse 将 Location 设置为 Linux 内核源码目录, 如图 0.6 所示。 如果不在 Eclipse 中编译内核,则使用 Linux GCC 即可,否则请使用安装好的 Cross GCC。
图 0.6 导入 Linux 内核源码
然后点击 Finish, 完成 Linux 内核源码导入, 在 Eclipse 中即可进行代码阅读和编辑了, 如图 0.7 所示。图 0Βιβλιοθήκη 7 在 Eclipse 中浏览内核源码
在 Eclipse 中进行源码跟踪,只需选择函数、变量或者宏定义后按 F3 即可。更多的操作 可在 Navigate 中找到。 1.2.3 vim+ctags+cscope Vi/Vim 是一个文本编辑器,在 Vim 中能高效的实现代码编辑。但 Vim 的功能不仅仅是 一个文本编辑器,借助 ctags 和 cscope 的配合,Vim 能实现堪比图形 IDE 环境的源码编辑和 阅读功能,在某种程度上甚至比图形 IDE 更方便。 Vi/Vim 的安装不再介绍了。如果不是通过远程登录在远程服务器上工作,而是在本地 桌面系统操作,还可以用 gvim 启动 Vi 编辑器。 1. Taglist Taglist 是 Vim 的一个源码浏览插件,可从 网站获得。下载到压缩包 后,在本地解压,然后将解压得到目录中的 plugin 目录复制到~/.vim 目录。如果用户主目录 下没有.vim 目录,则建立一个这样的目录即可。 2. Ctags Ctags 是一个用于产生 tags 文件的软件,可以下载源码进行编译安装,在 Ubuntu 下, 可通过 apt-get 进行安装: