首页 > 其他 > 详细

内核启动分析

时间:2019-09-24 11:04:27      阅读:98      评论:0      收藏:0      [点我收藏+]

一、编译试验

1.1、目标

  • 给内核打补丁
  • 配置
  • 编译
  • 重启并烧写文件系统

1.2、步骤详细

1.2.1、给内核打补丁

  1)通过FTP将Windows里system目录下linux-2.6.22.6.tar.bz2和linux-2.6.22.6_jz2440.patch文件拷贝到linux里/work/system下
  2)使用 tar xjf linux-2.6.22.6.tar.bz2 命令解压linux-2.6.22.6.tar.bz2(tar命令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7009245.html)
  3)进入linux-2.6.22.6目录下,使用 patch -p1 <../linux-2.6.22.6_jz2440.patch 命令对linux-2.6.22.6文件进行打补丁。(patch命令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7009706.html)

1.2.2、配置(3种配置方法)

  1)直接输入 make menuconfig 命令,从头到尾重新配置菜单 (非常复杂)。
  make menuconfig时修改配置项,最终的配置结果会保存在.config文件中,这主要是Kconfig的功能,再执行make menuconfig时就可以回去读取.config文件。这是内核配置的过程。
  2)通过make xxx_defconfig命令在默认的配置上进行修改,然后再输入make menuconfig配置菜单
    2.1)首先找defconfig位置, linux-2.6.22.6目录下,使用 find –name *defconfig 命令查找所有带fconfig名字的文件.(find命令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7160677.html)
    发现defconfig文件都在arch架构目录下,如下图所示:
    技术分享图片
    2.2)我们的是arm架构,所以 cd arch/arm/configs 进入configs目录,如下图所示,发现与2440相像的就只有s3c2410_deconfig。
    2.3)返回到linux-2.6.22.6顶层目录下,通过make s3c2410_defconfig 命令来配置,配置完后可以看出最后出现“configuration written to .config”,表示将所有config配置都写入到.config文件中。
    2.4)最后执行make menuconfig时就可以回去读取.config文件,不同的.config文件,menuconfig都不同
  3)使用厂家提供的配置config_ok文件
  在linux-2.6.22.6目录下,使用cp config_ok .config将config_ok复制覆盖新的.config隐藏文件(通过 ls -la 命令可以查看.config隐藏文件),最后执行make menuconfig时就可以回去读取.config文件
  make menuconfig菜单使用说明

Arrow keys navigate the menu.    //箭头键导航菜单
<Enter> selects submenus --->.   //Enter键选择菜单——>。
Highlighted letters are hotkeys. //粗体的开头字母是热键,例如上图中按B键,跳到Block layer
Pressing <Y> includes,           //Y键,编译在内核里运行        
<N> excludes,                    //N键,不编译在内核中
<M> modularizes features.        //M键,进行模块化
Press <Esc><Esc> to exit,        //Esc键退出
<?> forHelp,                     //?键帮助
</> for Search.                  // /键搜索
Legend:                          //显示:
[*] built-in                     //[*]:已经内置在内核中
[ ] excluded                     //[ ]:不编译在内核中
<M> module                       //<M>:已经模块化
< > module capable               //< >:表示这选项能被模块化(按下M键有响应)

1.2.3、编译(2种配置方法)

  1)输入 make 命令直接编译
  2)输入 make uImage 命令生成uImage内核文件(头部uImage+真正的内核),可以直接烧写给uboot直接使用(因为uboot支持的内核需要有头部uImage, uImage位置在linux中work/system/linux-2.6.22.6/arch/arm/boot)
  注意:要想“ make uImage”成功,必须把编译 u-boot 时得到的 mkimage 工具复制到/usr/bin 目录下去。 mkimage 工具在 u-boot 源码下u-boot-1.1.6/tools 目录里
  将编译出的uImage文件在uboot菜单中输入k键,通过dnw发送uImage文件到uboot进行烧写
  其中k键是对应于cmd_menu.c中menu_shell()函数,代码如下:

case 'k':
{
    strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)");
    run_command(cmd_buf, 0);
    break;
}

  其中实现了:用usb接收发送的数据下载到0x30000000,接着擦除内核分区,然后将0x30000000地址的东西烧写到nand flash内核分区中,方便下次重启使用,filesize接收文件的大小。
  在uboot中输入"mtd"可以查看内核分区位置
  0:bootloader 0X00040000 0X00000000 0
  1:params 0X00020000 0X00040000 0
  2:kernel 0X00200000 0X00060000 0
  3:root 0X0fda0000 0X00260000 0

1.2.4、重启并烧写文件系统

  1)在uboot菜单中按b按键重启内核。若显示VFS: Mounted root (nfs filesystem).字段,表示已安装文件系统
  2)输入”nand erase root”删除内存中root区0x0026000~0x0fffffff文件系统后,重启设备,就会无法启动内核。
  所以要想启动内核,必须需要文件系统!!!!!
  若编译模块,输入make modules即可,然后模块会编译成.ko文件

二、make menuconfig内核配置

2.1目标

  分析make menuconfig内核配置过程
在第一章中(内核编译试验)讲到了3中不同的配置:
  1)通过make menuconfig 直接从头到尾配置.config文件
  2)通过make s3c2410_deconfig 命令在默认的配置上进行自动修改.config文件
  3)使用厂家提供的配置config_ok文件覆盖.config文件
所以,所有的配置结果都是配置.config文件

2.2、查看.config内核配置文件

  在linux下通过vi指令查看.config内核配置文件,可以看到其内容就是一堆配置项:CONFIG_XXX=y/CONFIG_XXX=m/ CONFIG_XXX=n

  • =y:表示编进内核
  • =m:表示编译成模块,提供动态加载
  • =n:表示不参与编译

  输入grep “CONFIG_DM9000” -nwR (grep指令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7009706.html),可以看到4个地方在使用它
  1)include/linux/autoconf.h中定义宏DM9000
include/linux/autoconf.h:129:#define CONFIG_DM9000 1
  2)在C源码里通过判断autoconf.h的宏DM9000

arch/arm/plat-s3c24xx/common-smdk.c:46:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/plat-s3c24xx/common-smdk.c:162:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/plat-s3c24xx/common-smdk.c:250:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)

  3)在include/config/auto.conf中设置COMFIG_DM9000=y,供./drivers/net/ Makefile使用。

include/config/auto.conf:128:CONFIG_DM9000=y

  通过vi include/config/auto.conf如下图可以看出,和.config配置文件非常相似, 它被顶层Makefile包含,被子目录Makefile使用
  4)在./drivers/net/ 子目录Makefile中添加DM9000文件到obj-$(CONFIG_DM9000)中,其中CONFIG_DM9000=y,所以编译进内核中.

drivers/net/Makefile:197:obj-$(CONFIG_DM9000) += dm9dev9000c.o
drivers/net/Makefile:198:#obj-$(CONFIG_DM9000) += dm9000.o
drivers/net/Makefile:199:#obj-$(CONFIG_DM9000) += dm9ks.o

  因此, 当make uImage编译内核刚开始时,内核会根据.config自动生成auto.conf和autoconf.h这两个文件( 其中autoconf.h是供c源码使用(宏开关),而auto.conf被顶层Makefile包含,供子目录Makefile使用)

2.3、通过子目录makefile得出

如果auto.conf中CONFIG_xxx=y,对应的源码文件会被Makefile编译进内核;
如果auto.conf中CONFIG_xxx=m,对应的源码文件会被Makefile编译成xxx.ko模块文件;
如果auto.conf中CONFIG_xxx=n,对应的源码文件不会被makefile编译;
接下来分析Makefile来找到内核编译过程,明白make uImage做了什么。
三、make uImage编译内核
四、创建si工程和分析stext启动内核函数
五、start_kernel初始化函数
六、prepare_namespace()如何挂载根文件系统和mtd分区介绍

内核启动分析

原文:https://www.cnblogs.com/princepeng/p/11576385.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!