Chinaunix首页 | 论坛 | 博客
  • 博客访问: 453569
  • 博文数量: 72
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-07 16:53
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(5)

2010年(10)

2009年(56)

我的朋友

分类: LINUX

2010-02-09 14:47:26

说明:linux kernel 源代码顶层目录下的README文件
     个人翻译,并未一句一句的抠。一些不知如何翻译的句子直接引原文进来。
     水平有限,请路过指正……
Linux kernel 2.6.xx 发行注记 <

本篇是Linux 2.6 版本的发行注记。仔细阅读本篇文章,你将知道下面这些小节都说了
些什么、如何安装内核,也会了解到出错时该做些什么。

什么是Linux?
  Linux是Unix操作系统的一个克隆版本,由Linux Torvalds和网络上的骇客团队共同完
  成的,旨在建立一个符合POSIX和Single UNIX Specification complicance.

  它拥有现代成熟Unix操作系统的所有特性,包括真正的多任务、虚拟内存、共享库、加
  载器、可执行程序的写时复制、内存管理,还有多网络协议如IPv4和IPv6。

  它在GNU公共许可证的保护下发行 - 详情请查看附带的COPYING文件

它在什么样的硬件下运行?
 
  虽然Linux最初开发时只是为了在32位的x86机器上运行,但现在的Linux至少能在以下
  架构的处理器上运行:
  Compaq Alpha AXP, Sun SPARC and UltraSPARC, Motorola 68000, PowerPC,
  PowerPC64, ARM, Hitachi SuperH, Cell, IBM S/390, MIPS, HP PA-RISC,
  Intel IA-64, DEC VAX, AMD x86-64, AXIS CRIS, Xtensa, AVR32 ,
  Renesas M32R.

  只要满足以下两个条件,Linux就能很容易的移植到大多数流行的32位或64位体系结构、
  的处理器上:该架构(的处理器)有分页机制的内存管理单元(PMMU), 有针对该架构的
  GNU C 编译器移植版本。Linux现在已经成功移植到了许多没有PMMU的架构上,当然,
  这样会带来一些性能的损耗。
  Linux也已成功移植到了它自己上面。意思是说可以像运行用户空间的应用程序一样来
  运行内核, 这叫做”用户模式“的Linux(UserMode Linux, UML)。

文档:
 - 已经有大量针对Linux而写的或针对通用Unix的文档,或以电子档的形式在网络上,
   或以书本的形式发行。这里建议在Linux FTP的各子目录里相看有关Linux的文章。
   This README is not meant to be documentation on the system: there are much
   better sources available.

 - Documentation/ 目录下有许多不同的README文件,比如其中会有关于一些驱动的内
   核安装说明。查看 Documentation/00-INDEX ,这是关于各文件内容的索引。也请查
   看Changes 文件,其中有关于升级内核的一些信息。

 - Documentation/DocBook/ 子目录下有一些内核开发人员和用户的指南。这些指南有多
   种格式:PostScript (.ps), PDF, HTML, & man-pages 等。内核代码安装好之后,
   使用 "make psdocs", "make pdfdocs", "make htmldocs"或"make mandocs" 来把这
   些文档转成相应格式。

安装内核源码:

 - 安装所有的源代码,将压缩包放在某个目录下(用户需要对这个目录有相应权限,如放
   在自己的家目录下就可以了),然后解压:

gzip -cd linux-2.6.XX.tar.gz | tar xvf -
      

   或
       
bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -

   其中“XX”指对应的内核版本(一本升级时我们都选择最新的内核版本)

   请不要使用 /usr/src/linux 这个路径。这个路径有大量的库头文件需要使用的内核头
   文件。它们必须与库相匹配,and not get messed up by whatever the
   kernel-du-jour happens to be

 - 在2.6版本内核之间升级还可以使用补丁。补丁一般以gzip的格式发布,较新的也会以
   bzip2的格式发布。打补丁时,先下载所有新的补丁文件,进入内核源码的顶层目录,
   然后执行以下命令:

       
gzip -cd ../patch-2.6.xx.gz | patch -p1

   或

       
bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1

   (xx 表示比现在内核源码版本更大的版本数).
   这样补丁就打好了。如果想要删除备份文件(xxx~或xxx.orig),确认没有打失败的补
   丁(xxx# 或 xxx.rej)。如果有,则说明出错了。

   与2.6.x内核补丁不同,2.6.x.y内核补丁的版本号并不是递增but instead apply
   directly to the base 2.6.x kernel.详情请阅读
   Documentation/applying-patches.txt 文件。

   另外,内核补丁的脚本文件会动自的完成打补丁这一步骤。这会取决于当前的内核版
   本以及提供的补丁。

        linux/scripts/patch-kernel linux

   第一个参数linux是当前内核源码的路径。补丁文件都在当前的目录里,但也可以用
   第二个参数来指定。

 - If you are upgrading between releases using the stable series patches
   (for example, patch-2.6.xx.y), note that these "dot-releases" are
   not incremental and must be applied to the 2.6.xx base tree.
   比如,如果当前的内核源码是2.6.12版本的,要打2.6.12.3的补丁,则不需要打
   2.6.12.1 和2.6.12.2 这两个补丁。同样,如果现在是2.6.12.2要升级到2.6.12.3,
   则需要先卸掉2.6.12.2的补丁(patch -R)。
   详情请阅读 Documentation/applying-patches.txt文件。

 - 确认没有桌的 .o 文件和依赖关系:
       
        cd linux
        make mrproper

   现在就已经正确地安装好了内核源码了。

需要的软件

    编译并运行2.6.xx内核需要一些较新的软件。查阅 Documentation/Changes,其中有
    关于所需软件的最低版本要求,以及如何升级这些软件。注意,使用一些较老版本的
    软件可能会导致间接的错误,且这些错误非常难去跟踪,所以当出现各种问题时请
    确认使用的软件是较新的。

构建内核路径:

    默认情况下,编译内核源代码所生所的一些文件会与内核源代码在同个目录下。
    使用 “make O=output/dir" ,这样就可以在指定的路径下编译内核。
    例:
      内核代码的目录    /usr/src/linu=2.6.N
      编译目录          /home/name/build/kernel

    使用下面的命令来配置和编译内核
cd /usr/src/linux-2.6.N
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel moudules_install install


    请注意:一旦使用了'O=output/dir'这个选项,则后面的命令都要使用这个选项。

配置内核:

    千万不要跳过这一步,即使你是在升级一个次要的版本。每个发行的内核都会有新的
    配置选项加入,也会有一些并不安设想来配置文件的问题被修正。如果只是将以前的
    配置文件放到新版本内核中(这样配置工作就少了很多),然后"make oldconfig",这
    样配置时只需要回答新的问题。

  - 修改配置文件的命令如下:
    "make config"      文字界面
    "make menuconfig"  有颜色的菜单的文字模式,有提示和对话框
    "make xconfig"     图形界面,其于Qt
    "make gconfig"     图形界面,其于Gtk
    "make oldconfig"   有一个./.config文件,这是一个配置文件,它其中包
                           括了大多数内核配置的选项,此时配置内核只会问一些
                           新的配置问题。
    "make silentoldconfig"
               Like above, but avoids cluttering the screen
               with questions already answered.
               Additionally updates the dependencies.
    "make defconfig"   Create a ./.config file by using the default
               symbol values from either arch/$ARCH/defconfig
               or arch/$ARCH/configs/${PLATFORM}_defconfig,
               depending on the architecture.
    "make ${PLATFORM}_defconfig"
                          使用arch/$ARCH/configs/${PLATFORM}_defconfig来创建
                          一个新的 ./.config 文件。使用 make help 来查看所有
                          支持的平台和架构。
    "make allyesconfig"
               Create a ./.config file by setting symbol
               values to 'y' as much as possible.
    "make allmodconfig"
               Create a ./.config file by setting symbol
               values to 'm' as much as possible.
    "make allnoconfig" Create a ./.config file by setting symbol
               values to 'n' as much as possible.
    "make randconfig"  Create a ./.config file by setting symbol
               values to random values.

    可以在 Documentation/kbuild/kconfig.txt 中找到更多关于Linux内核配置工具的
    信息。

        注意 "make config":
        - 将不必要的驱动程序编译进内核会使得最终的内核变大,也可能会造成一些
          其他的问题:移植到一个不存在的控制卡可能与其他控制器相冲突。
        - 编译时指定非386处理器类型,会使得编译后得到的内核映像不能运行于386处
          理器。内核会在引导时检测到这个问题,然后放弃引导内核。
        - 如果存在协处理器的话,内核编译时仍会将协处理器作为数学仿真器来使用。
          内核中是不会使用到数学仿真器的。内核也许会大一点,但是可以在不同类
          别的机器上运行而不必去关心是否有一个数学协处理器。
        - "kernle hacking"这个配置项选中的话会导致编译处的内核大一些或慢一些,
          或两者都有,还有可能使得内核变得不稳定...
          and can even make the kernel
      less stable by configuring some routines to actively try to
      break bad code to find kernel problems (kmalloc()).  Thus you
      should probably answer 'n' to the questions for
          "development", "experimental", or "debugging" features.

编译内核:

 - 确认gcc至少为3.2版本。在 Documentation/Changes 中可查阅到更多的信息。
  
   请注意当前的内核然能够运行 a.out 格式的应用程序。

 - "make" 命令用来生成一个已压缩的内核映像。It is also
   possible to do "make install" if you have lilo installed to suit the
   kernel makefiles, but you may want to check your particular lilo setup first.

   真正安装时需要root权限,其他的动作不需要。在不需要root权限时请不要使用
   root身份来执行命令。

 - 如果将某个部份编译成了模块`modules',还需要"make modules_install"

 - 内核编译/构建时的详细输出信息:

   一般编译内核时都是在一个相对安静的模式(不是绝对的安静)。但有些时候也需要看
   到编译、连接或其他命令的具体执行过程。此时,使用"verbose"编译模式,在编译
   命令"make"时插入"V=1"即可:
       
        make V=1 all

   To have the build system also tell the reason for the rebuild of each
   target, use "V=2".
   默认是"V=0"。

 - 保留旧内核的备份以防新内核安装时出现错误。特别是对于开发版本来说,
   因为新发布的内核包含新的未调试的代码。同时也确认保留了与旧内核相匹配的各模
   块备份。在"make modules_install"之前进行备份。
   另外,在编译之前,使用内核配置选项"LOCALVERSION"在规则的内核版本后面添加唯
   一的后缀。LOCALVERSION在"General Setup"菜单中设置。

 - 为了能够引导新的内核,需要将内核映像复制到可以成功引导的内核存放的地方。

 - 不通过引导程序如LILO而直接从软盘启动内核,这种特性现在已经不支持。

   如果从硬件起动,使用LILO时,内核映像是在/etc/lilo.conf中指定的。通常的内
   核映像文件是/vmlinuz, /boot/vmlinuz, /bzImage 或 /boot/bzImage。使用新的内
   核,请保留旧内核的备份,然后将新内核覆盖旧内核即可。接着,必须返回到LILO中
   来更新加载映射,如果这一步没有做,则不能引导新的内核。

   重新安装LILO通常只需要运行/sbin/lilo。用户还可以编辑/etc/lilo.conf,来为旧
   内核指定一个入口,使得在新内核不能正常工作时还有旧内核可以使用。更多的信息
   请查阅 LILO 的相关说明。

   重装完LILO之后,所有的工作都作完了。然后关掉系统,重启即可。

   如果还需要更改内核中默认的根设备、视频模式、ramdisk的大小等,使用'rdev'程序
   ,而不必重新编译内核来改变这些参数。

如果出现了错误:

 - 如果问题看起来像是内核的bug,请检查MAINTAINERS来查看出错的部份是否有专门的
   人来维护,如果没有,请向torvalds@linux-foundation.org发邮件,如果可能的话,
   也可向相关的邮件列表发邮件。

 - 在报告bug时,请详细描述你所用的是什么内核、如何重现你所遇到的问题、你做了哪
   设置(你感觉会是什么问题)。如果是新问题,告诉我这些,如果是旧问题(该问题以前
   可能被讨论过), 请告诉我你是什么时候开始注意该问题的。

 - 如果bug产生的消息如下

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


   屏幕上或系统log里记录了类似上面的信息,请准确地将它们复制下来。这些可能看
   起来毫无意义,但其中却可能包含了用于调试该问题的信息。它上部的字符也很重要
   :它记录了内核崩溃代码(上面的例子里的错误代码表示出错的原因是错误的内核指
   针)。更多关于这类的信息可查看 Documentation/oops-tracing.txt。

 - If you compiled the kernel with CONFIG_KALLSYMS you can send the dump
   as is, otherwise you will have to use the "ksymoops" program to make
   sense of the dump (but compiling with CONFIG_KALLSYMS is usually preferred).
   This utility can be downloaded from
   ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ .
   Alternately you can do the dump lookup by hand:

 - 在调试类似上面的出错信息时,如果能看懂EIP的意思,那帮助可就大了。这个十六进
   制值此时显得毫无用处,它的值取决于内核的具体设置。而我们应该做的就是将EIP这
   一行的这个十六进制值取出(不包括0010),然后在内核列表中查看哪个函数占用了这
   段内存地址。

   To find out the kernel function name, you'll need to find the system
   binary associated with the kernel that exhibited the symptom.
   这个文件是'linux/vmlinux'。提取名字列表,然后将其与崩溃内核的EIP相比较:

                nm vmlinux | sort | less

   这将给出一个排序好了的内核地址列表,从该列表中就很容易找到出错的地址。注意
   :内核调试信息给出的地址并不与函数地址匹配(事实上也不太可能匹配),所以不能
   使用'grep'。尽管如此,这个列表给出了内核中每个函数的起始地址,所以只需要找
   到一个函数的起始地址小于EIP中给出的地址,但紧跟着的函数地址大于EIP中给出的
   址(那么就定位到了该地址是在哪个函数中地,即出错在哪个函数中)。事实上,在提
   交问题是给出一些"上下文"是非常不错的主意。

   如果因为某些原因不能按照上面所的来提交信息,那将你的设置步骤告诉我,越多越
   好。更多细节请阅读 REPORTING-BUGS 文档。

 - 另外,也可使用gdb来在运行中高试内核。(只读,不能改变变量的值,不能设置断点)
   编译时使用 -g 来编译内核;编辑 arch/i386/Makefile 文件,然后 "make clean"。
   当然还需要使能 CONFIG_PROC_FS 。

   重新启动新内核后,"gdb vmlinux /proc/kcore"。接着就可以使用一般的gdb命令了
   。查看系统崩溃处的命令是"l *0xXXXXXXXX"。(XXXes换成EIP的值)

   使用gdb调试一个不在运行的内核会失败,因为gdb忽视内核编译时指定的起始地址。
 
阅读(2189) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~