(原)linux内核的编译



centos内核的下载和编译:

一:第一次编译内核实验过程:

1.linux下敲入命令查看系统版本号:
  cat /proc/version
  Linux version 3.10.0-327.el7.x86_64 ([email protected]) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015
  uname -r 
  3.10.0-327.el7.x86_64
  cat /etc/redhat-release
  CentOS Linux release 7.2.1511 (Core)
 
2.进入centos官网下载:http://vault.centos.org/
  找到路径:7.2.1511/os/Source/SPackages/kernel-3.10.0-327.el7.src.rpm
 
   解压:rpm2cpio kernel-3.10.0-327.el7.src.rpm | cpio -id
   到当前文件夹找到linux-3.10.0-327.el7.tar.xz(内核源码包)
   注意:如果使用rpm -ivh kernel-3.10.0-327.el7.src.rpm 按照会报错,我们为了使用该版本centos对应的内核源码,直接找到源码包即可。
   拷贝linux-3.10.0-327.el7.tar.xz到/usr/src
   xz -d linux-3.10.0-327.el7.tar.xz
   tar -xf linux-3.10.0-327.el7.tar
  
   
3.创建符号链接
  cd /usr/include
  mv scsi bk_scsi
  mv asm-generic bk_asm-generic
  mv linux bk_linux
  ln -s /usr/src/linux-3.10.0-327.el7/include/linux linux
  ln -s /usr/src/linux-3.10.0-327.el7/include/scsi scsi
  ln -s /usr/src/linux-3.10.0-327.el7/include/asm-generic asm-generic
 
  解释:/usr/include下的头文件包含是提供给用户程序引用的,非内核程序。因为正常情况下可能export的环境变量会设置成此路径。
        /usr/src/linux-3.10.0-327.el7/include下文件为我们编译linux-3.10.0-327.el7时使用。
  但当我们编译时如果源代码中没有引入内核宏,会自动引用/usr/include下的头文件,我们创建软连接,是为了所有的编译体系(内核程序、非内核程序)都引用我们待编译的内核头文件linux-3.10.0-327.el7/include。
  
  疑问:/usr/include下面还有一个asm汇编文件夹,但再/usr/src/linux-3.10.0-327.el7/include/下没有asm文件夹,这两者有啥区别吗?
 
  如果使用/usr/src/include链接下的文件夹,可能会报找不到limit.h这个头文件。这个头文件应该是第三方安装包按照到系统里的。所以请看下面总结。
 
  最终总结如下:因为我们找到是按照的linux系统对应的内核版本,所以编译内核时直接引用/usr/include文件夹下头文件也无所谓,因为该系统也是对应该内核安装时生成的。无论引用哪个文件夹都一样。
                用什么无所谓,确认一下export中的环境变量是哪个路径。PWD = ...
    
  综合第三点:只要环境变量路径设对就行(其他扫描创建软连接之类可以忽略):export path = ..
 
 
 4.裁剪编译选项
 /usr/src/linux-3.10.0-327.el7/中输入make menuconfig。
 在出现的菜单中选择需要裁剪的内核功能,然后save 退出
 
 5.编译
   make dep  //读取配置4过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要
   make clean //完成删除前面步骤留下的文件,以避免出现一些错误
   make bzImage //则实现完全编译内核
   或者make bzImage -p >>compile_kenal.txt //这个可以查看编译时makefile执行情况以及变量
      出现的问题:
    (1):
      这里出现/usr/include/linux 下某个文件的u32,u64定义错误。在types.h中增加报错的几个字段,问题解决。
    (2):
        In file included from include/linux/bitops.h:33:0,
         from arch/x86/purgatory/sha256.c:18:
    /usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h: 在函数‘constant_test_bit’中:
    /usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h:318:24: 错误:‘BITS_PER_LONG’未声明(在此函数内第一次使用)
      return ((1UL << (nr % BITS_PER_LONG)) &
          ^
    /usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h:318:24: 附注:每个未声明的标识符在其出现的函数内只报告一次
    /usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h: 在文件作用域:
    /usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h:504:37: 致命错误:asm-generic/bitops/find.h:没有那个文件或目录
     #include <asm-generic/bitops/find.h>
    
    
  查看该版本中/usr/src/include/asm-generic下并没有bitops文件夹,考虑到该文件夹带有通用的意思,所以从其他linux版本拷贝一个文件来尝试是否编译通过。
  再仔细查看发现整个asm-generic是空的,所以重新解压版本包。顺利编译通过。
  
  
  
二:内核编译总结
    1.下载源代码放入/usr/src/linux_xxx
    2. 环境变量设置:export PWD = "/usr/src/linux_xxx/include"; //该编译PWD路径变量是自动更新,和pwd命令目录一致。
 3. make menuconfig,进入裁减内核功能,一般情况下默认save即可。
 4. make dep
    make clean
     make bzImage 或者 make bzImage -p >>compile_kenal.txt
  
 5.编译完成。
  
 
  
   
  
 

猜你喜欢

转载自blog.csdn.net/m0_37570820/article/details/80361346