赞
踩
刚开始学习linux内核时,不知道怎么编译linux内核,对相关的原理不是很理解,从各个网站上收集整理的相关编译知识,适合入门级的。
Linux 内核版本 3.x < http://kernel.org/ >
这些是 Linux 版本 3 的发行说明。仔细阅读它们,
当他们告诉你这是怎么一回事时,解释如何安装
内核,以及如果出现问题该怎么办。
什么是 Linux?
Linux 是操作系统 Unix 的克隆,由
Linus Torvalds 在一个松散的黑客团队的帮助下
通过互联网完成的。它旨在符合 POSIX 和单一 UNIX 规范。
它具有您在现代成熟的 Unix 中所期望的所有功能,
包括真正的多任务、虚拟内存、共享库、需求
加载,共享的写时复制可执行文件,适当的内存管理,
和多栈网络,包括 IPv4 和 IPv6。
它是根据 GNU 通用公共许可证分发的 - 请参阅
随附的版权文件以获取更多详细信息。
它在什么硬件上运行?
尽管最初是为基于 x86 的 32 位 PC(386 或更高版本)开发的,
今天,Linux 还(至少)在 Compaq Alpha AXP、Sun SPARC 和
UltraSPARC、摩托罗拉 68000、PowerPC、PowerPC64、ARM、日立 SuperH、Cell、
IBM S/390、MIPS、HP PA-RISC、英特尔 IA-64、DEC VAX、AMD x86-64、AXIS CRIS、
Xtensa、Tilera TILE、AVR32 和 Renesas M32R 架构。
Linux 可轻松移植到大多数通用 32 位或 64 位架构
只要它们有分页内存管理单元 (PMMU) 和
GNU C 编译器 (gcc)(GNU 编译器集合,GCC 的一部分)。Linux
也有被移植到许多没有 PMMU 的架构中,尽管
功能显然有些受限。
Linux 也被移植到它自己。您现在可以将内核当作为
用户空间应用程序运行 - 这称为用户模式 Linux (UML)。
文件:
- 有很多文件都以电子形式提供在
互联网和书籍中,包括特定于 Linux 和与
一般 UNIX 问题。我建议查看文档
LDP(Linux Documentation
Project)书籍 通过在任何 Linux FTP 站点上的子目录
。README文档不仅仅是关于
系统的文档:有更好的资源可用。
- 在 Documentation/ 子目录中有各种 README 文件:
这些通常包含某些特定于内核的安装说明
以驱动为例。请参阅 Documentation/00-INDEX 以获取内容列表
包含在每个文件中。请阅读更改文件,因为它
包含有关问题的信息,问题可能由升级
你的内核导致的。
- Documentation/DocBook/ 子目录包含几个为内核开发人员和用户准备的指南
。这些指南可以呈现多种
格式:PostScript (.ps)、PDF、HTML , man-pages和其它等。
安装后,“make psdocs”、“make pdfdocs”、“make htmldocs”、
或“make mandocs”将以请求的格式呈现文档。
安装内核源代码:
- 如果您安装完整的源代码,请将内核 tarball 放在
您拥有权限的目录(例如您的主目录)和
解压它:
gzip -cd linux-3.X.tar.gz | tar xvf -
或者
bzip2 -dc linux-3.X.tar.bz2 | tar xvf -
将“X”替换为最新内核的版本号。
不要使用 /usr/src/linux 区域!这个区域有一个(通常
不完整)库头文件使用的一组内核头文件
集合。他们应该与库相匹配,而不是被弄混乱通过
无论 kernel-du-jour 是什么。
- 您还可以通过修补在 3.x 版本之间进行升级。补丁是
以传统的 gzip 和较新的 bzip2 格式分发。
通过补丁安装,获取所有较新的补丁文件,输入
内核源代码(linux-3.X)的顶级目录并执行:
gzip -cd ../patch-3.x.gz | patch-p1
或者
bzip2 -dc ../patch-3.x.bz2 | patch-p1
将“x”替换为大于当前版本“X”的所有版本
源代码树,_in_order_,你应该没问题。您可能想要删除
备份文件(some-file-name~ 或 some-file-name.orig),并确保
没有失败的补丁(some-file-name# 或 some-file-name.rej)。
如果有,你或我都犯了一个错误。
与 3.x 内核的补丁不同,3.xy 内核的补丁
(也称为 -stable 内核)不是增量的,而是应用的
直接到基本 3.x 内核。例如,如果您的基本内核是 3.0
并且要打3.0.3补丁,一定不能先打3.0.1
和 3.0.2 补丁。同样,如果您正在运行内核版本 3.0.2 和
想跳转到3.0.3,必须先反转3.0.2补丁(即
patch -R) _before_ 应用 3.0.3 补丁。您可以在此阅读更多内容
文档/应用补丁.txt
或者,可以使用脚本补丁内核来自动执行此操作
过程。它确定当前内核版本并应用任何
找到补丁。
linux/scripts/patch-kernel linux
上面命令中的第一个参数是
内核源码。补丁是从当前目录应用的,但是
可以将替代目录指定为第二个参数。
- 确保周围没有陈旧的 .o 文件和依赖项:
cd linux
make mrproper
您现在应该正确安装了源。
软件要求
编译和运行 3.x 内核需要最新版本
各种软件包的版本。咨询
所需最低版本号的文档/更改
以及如何获取这些软件包的更新。请注意,使用
这些软件包的过旧版本可能会导致间接
很难追踪的错误,所以不要假设
您可以在出现明显问题时更新软件包
构建或运行。
内核的BUILD目录:
编译内核时,所有输出文件默认为
与内核源代码一起存储。
使用选项“make O=output/dir”允许您指定一个备用
放置输出文件(包括 .config)。
例子:
内核源代码:/usr/src/linux-3.X
构建目录:/home/name/build/kernel
要配置和构建内核,请使用:
cd /usr/src/linux-3.X
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install
请注意:如果使用了 'O=output/dir' 选项,那么它必须是
用于所有的 make 调用。
配置内核:
即使只升级一个次要版本,也不要跳过此步骤
。每个版本都添加了新的配置选项,并且
如果没有设置配置文件,就会出现奇怪的问题
正如预期的那样。如果您想将现有配置转移到
工作量最少的新版本,使用“make oldconfig”,这将
只问你新问题的答案。
- 替代配置命令是:
“make config” 纯文本界面。
“make menuconfig” 基于文本的颜色菜单、单选列表和对话框。
“make nconfig” 增强的基于文本的颜色菜单。
“make xconfig” 基于 X windows (Qt) 的配置工具。
“make gconfig” 基于 X windows (Gtk) 的配置工具。
“make oldconfig” 根据内容默认所有问题
您现有的 ./.config 文件并询问
新的配置符号。
“make silentoldconfig”
像上面一样,但避免使屏幕混乱
已经回答了问题。
另外更新依赖项。
“make olddefconfig”
像上面一样,但将新符号设置为默认值
没有提示的值。
"make defconfig" 使用默认创建一个 ./.config 文件
来自 arch/$ARCH/defconfig 的符号值
或arch/$ARCH/configs/${PLATFORM}_defconfig,
取决于架构。
“make ${PLATFORM}_defconfig”
使用默认创建一个 ./.config 文件
符号值来自
arch/$ARCH/configs/${PLATFORM}_defconfig。
使用“make help”获取所有可用的列表
您的架构平台。
“make allyesconfig”
通过设置符号创建一个 ./.config 文件
尽可能将值设置为“y”。
“make allmodconfig”
通过设置符号创建一个 ./.config 文件
尽可能将值设置为“m”。
"make allnoconfig" 通过设置符号创建一个 ./.config 文件
尽可能将值设置为“n”。
"make randconfig" 通过设置符号创建一个 ./.config 文件
值到随机值。
"make localmodconfig" 根据当前配置创建一个配置并
加载的模块(lsmod)。禁用任何模块
加载的模块不需要的选项。
要为另一台机器创建 localmodconfig,
将该机器的 lsmod 存储到文件中
并将其作为 LSMOD 参数传入。
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp
host$ make LSMOD=/tmp/mylsmod localmodconfig
以上在交叉编译时也适用。
"make localyesconfig" 类似于 localmodconfig,除了它会转换
内置 (=y) 选项的所有模块选项。
您可以找到有关使用 Linux 内核配置工具的更多信息
在文档/kbuild/kconfig.txt 中。
- 关于“make config”的注释:
- 拥有不必要的驱动程序会使内核变大,并且可以
在某些情况下会导致问题:探测一个
不存在的控制器卡可能会混淆您的其他控制器
- 编译内核时“Processor type”设置高于 386
将导致内核无法在 386 上运行。
内核将在启动时检测到这一点,然后放弃。
- 编译了数学仿真的内核仍将使用
如果存在协处理器:数学仿真将只是
永远不要在那种情况下使用。内核会稍大,
但将在不同的机器上工作,无论它们是否
有没有数学协处理器。
- “kernel hacking”配置细节通常会导致
更大或更慢的内核(或两者兼有),甚至可以使内核
通过配置一些例程来积极尝试降低稳定性
破解错误代码以查找内核问题 (kmalloc())。这样你
应该对“development”的问题回答“n”,
“experimental”或“debugging”功能。
编译内核:
- 确保您至少有 gcc 3.2 可用。
有关详细信息,请参阅文档/更改。
请注意,您仍然可以使用此内核运行 a.out 用户程序。
- 做一个“make”来创建一个压缩的内核映像。也是
"make install" 如果您安装了 lilo 以适应
内核 makefile,但您可能需要先检查您的特定 lilo 设置。
要进行实际安装,您必须是 root,但不是正常的
build 应该需要这个。不要徒然取root的名字 。
- 如果您将内核的任何部分配置为“modules”,您
还必须执行“make modules_install”。
- 详细的内核编译/构建输出:
通常,内核构建系统以相当安静的模式运行(但不是
完全沉默)。但是,有时您或其他内核开发人员需要
准确地查看编译、链接或其他命令的执行情况。
为此,请使用“verbose”构建模式。这是通过插入
“make”命令中的“V=1”。例如:
make V=1 all
让构建系统也告诉每个重建的原因
目标,使用“V=2”。默认值为“V=0”。
- 随时准备备份内核,以防出现问题 。这是
对于开发版本尤其如此,因为每个新版本
包含尚未调试的新代码。确保你保留一个
备份与该内核对应的模块。如果你
正在安装与您的版本号相同的新内核
工作内核,在你之前备份你的模块目录
做一个“make modules_install”。
或者,在编译之前,使用内核配置选项
"LOCALVERSION" 为常规内核版本附加一个唯一的后缀。
LOCALVERSION 可以在“General Setup”菜单中设置。
- 为了启动你的新内核,你需要复制内核
映像(例如 .../linux/arch/i386/boot/bzImage 编译后)
到您的常规可引导内核所在的位置。
- 直接从软盘引导内核,无需帮助
不再支持 LILO 等引导加载程序。
如果您从硬盘驱动器启动 Linux,您可能会使用 LILO,它
使用文件 /etc/lilo.conf 中指定的内核映像。这
内核映像文件通常是 /vmlinuz、/boot/vmlinuz、/bzImage 或
/boot/bzImage. 要使用新内核,请保存旧映像的副本
并将新图像复制到旧图像上。然后,你必须重新运行 LILO
更新加载图!!如果不这样做,您将无法启动
新的内核映像。
重新安装 LILO 通常是运行 /sbin/lilo。
您可能希望编辑 /etc/lilo.conf 为您的
旧内核映像(例如 /vmlinux.old)以防新内核映像不存在
工作。有关更多信息,请参阅 LILO 文档。
重新安装 LILO 后,您应该一切就绪。关闭系统,
重启,享受!
如果您需要更改默认的根设备、视频模式、
内核映像中的 ramdisk 大小等,使用 'rdev' 程序(或
或者在适当的时候使用 LILO 引导选项)。无需
重新编译内核以更改这些参数。
- 使用新内核重新启动并享受。
如果出现问题:
- 如果您有似乎是由于内核错误引起的问题,请检查
文件 MAINTAINERS 以查看是否有关联的特定人员
与您遇到问题的内核部分有关。如果有
那里没有列出任何人,那么第二好的事情是邮寄
他们给我(torvalds@linux-foundation.org),也可能给任何其他人
相关的邮件列表或新闻组。
- 在所有错误报告中,*请*告诉您在谈论内核问题,
如何复制问题,以及您的设置是什么(使用您的常用
感觉)。如果问题是新问题,请告诉我,如果问题是
老问题,请试着告诉我你什么时候第一次注意到它。
- 如果错误导致类似的消息
unable to handle kernel paging request at address C0000010
Oops:0002
EIP: 0010:XXXXXXXX
eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx
esi:xxxxxxxx edi:xxxxxxxx ebp:xxxxxxxx
ds: xxxx es: xxxx fs: xxxx gs: xxxx
Pid:xx, process nr: xx
xx xx xx xx xx xx xx xx xx xx
或类似的内核调试信息在您的屏幕上或您的
系统日志,请复制它*完全*。转储可能看起来
您无法理解,但它确实包含可能
帮助调试问题。转储上方的文字也是
重要:它说明了为什么内核转储代码(在
上面的例子,这是由于内核指针错误)。更多信息
了解转储的意义在 Documentation/oops-tracing.txt
- 如果您使用 CONFIG_KALLSYMS 编译内核,您可以发送转储
照原样,否则你将不得不使用“ksymoops”程序来制作
转储的感觉(但通常首选使用 CONFIG_KALLSYMS 进行编译)。
该实用程序可以从
ftp://ftp.<country>.kernel.org/pub/linux/utils/kernel/ksymoops/。
或者,您可以手动进行转储查找:
- 在像上面这样调试转储时,如果可以的话,它会很有帮助
查看 EIP 值的含义。这样的十六进制值没有帮助
我或其他任何人:这将取决于你的具体情况
内核设置。您应该做的是从 EIP 中获取十六进制值
行(忽略“0010:”),并在内核名称列表中查找
查看哪个内核函数包含有问题的地址。
要找出内核函数名称,您需要找到系统
与表现出症状的内核相关联的二进制文件。这是
文件'linux/vmlinux'。提取名单并将其匹配
内核崩溃中的 EIP,请执行以下操作:
nm vmlinux | sort | less
这将为您提供按升序排序的内核地址列表
顺序,从中很容易找到包含
违规地址。注意内核给出的地址
调试消息不一定与
函数地址(事实上,这不太可能),所以你不能
只需“grep”列表:但是,列表将为您提供开始
每个核函数的点,所以通过寻找函数
起始地址低于您要搜索的地址,但
后跟一个地址更高的函数,你会找到那个
你需要的。事实上,包含一些
问题报告中的“context”,在
有趣的一个。
如果您由于某种原因无法执行上述操作(您有一个预编译的
内核映像或类似的),告诉我你的设置和
可能会有帮助。请阅读 REPORTING-BUGS 文档了解详细信息。
- 或者,您可以在正在运行的内核上使用 gdb。(只读;即你
不能更改值或设置断点。)为此,首先编译
带有-g的内核;适当地编辑 arch/i386/Makefile,然后执行“make
clean”。您还需要启用 CONFIG_PROC_FS(通过“make config”)。
使用新内核重新启动后,执行“gdb vmlinux /proc/kcore”。
您现在可以使用所有常用的 gdb 命令。查找的命令
系统崩溃的点是“l *0xXXXXXXXXX”。(替换 XXX
与 EIP 值。)
gdb'ing a non-running kernel 当前失败,因为 gdb(错误地)
忽略编译内核的起始偏移量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。