整理的Linux内核版本编译原理和相关的注意事项

 刚开始学习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(错误地)
   忽略编译内核的起始偏移量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值