zoukankan      html  css  js  c++  java
  • 如何编译linux kernel

    其实build kernel很简单,首先参考kernel源代码目录下的README文件,基本上是这么几步:

    1. make mrproper -- 注意这一步走过之后,.config会被恢复成默认设置
    2. make menuconfig -- 在这里面check配置项,决定哪个打开,哪个关闭。哪些driver编译成module,哪些直接编译进内核
    3. make -- 首先会编译内核,完成后会自动编译modules

    几个Tips:
    1. 如果要做交叉编译,只需要定义CROSS_COMPILE环境变量就可以,比如:

    export CROSS_COMPILE=arm-none-linux-gnueabi-

    Linux kernel不依赖于glibc,只依赖于gcc, binutils(有ld, as这些软件)。所以,比如上面的例子,设置了CROSS_COMPILE之后,kernel就会用arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld这样的命令来编译和链接。所以,要确定这些命令在PATH中,能被kernel找到。平常我们做交叉编译,准备工具链也就是准备这些东西。

    2. 用O=<dir path>这样的方式来将编译产生的所有文件放入指定的目录,包括.config。比如:

    make O=./build

    这个很好用,可以不污染源代码目录,要重新编译直接删掉build目录下的所有东西即可。记住,每个命令都要带有O=<dir path>这个option。

    3. 一般嵌入式系统中使用u-boot,而uboot是不能引导标准的linux kernel的。现在linux kernel已经内置支持生成u-boot格式的内核文件,只需要make完成后,再执行:make uImage即可。

    4. 编译完成后,生成的linux kernel文件,包括uImage,都放在<build dir>/arch/<architecture, 如arm>/boot目录下。Image是没有压缩过的版本,zImage是压缩过的。

    5. 使用make clean清除已经生成的.o文件

    6. 每个源码目录下的Kconfig文件定义了在make menuconfig中我们看到的那些菜单和项目。所以,看到make menuconfig界面中的项目,想知道是哪儿的,可以参考Kconfig文件。至于哪些源文件编译出什么东西,那就要看每个目录下的Makefile了。

    7. 如果有已经配置好的config文件(别人通过make menuconfig生成的),那么,将config文件放在源码目录/arch/<architecture name,如arm>/configs目录下,然后在源码根目录下,执行make <config file name>就可以直接将指定config文件的内容导入(也就是在当前目录下生成一个.config)。这样,如果有时我们只是需要在别人的基础上修改一些配置的话,就很有用。

    OK, That's all. Kernel源码目录下/Documents目录下有很多很好的文档,描述了kernel的很多feature,API和原理。值得参考。
  • 相关阅读:
    在Dockerfile CMD一次执行多个命令
    文本中字符串替换
    centos登录密码正确但一直报login incorrect错误(错误赋予权限)
    kafka使用时的问题
    elasticsearch使用问题
    Redis常见问题
    tomcat常见问题
    JavaScript的BOM对象
    JavaScript的DOM操作
    JavaScript常用对象介绍
  • 原文地址:https://www.cnblogs.com/super119/p/1924408.html
Copyright © 2011-2022 走看看