@[TOC]

uboot启动内核分析

进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm():int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])

{

boot_os_fn *boot_fn; //boot_fn是个数组函数

... ..

boot_fn(0, argc, argv, &images); //调用数组函数

... ...

}

boot_os_fn是个typedef型,如下图所示:

由于定义了宏CONFIG_BOOTM_LINUX,最终会跳转到do_bootm ->do_bootm_linux()

代码如下所示:int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)

{

/* No need for those on ARM */

if (flag & BOOTM_STATE_OS_BD_T || flag & BOOTM_STATE_OS_CMDLINE)

return -1;

if (flag & BOOTM_STATE_OS_PREP) {

boot_prep_linux(images);

return 0;

}

if (flag & BOOTM_STATE_OS_GO) {

boot_jump_linux(images);

return 0;

}

boot_prep_linux(images); //该函数会将各个tag参数保存在指定位置,比如:内存tag、bootargs环境变量tag、串口tag等

boot_jump_linux(images); //该函数会跳转到内核起始地址

return 0;

}

最终跳转到do_bootm ->do_bootm_linux-> boot_jump_linux()static void boot_jump_linux(bootm_headers_t *images)

{

unsigned long machid = gd->bd->bi_arch_number; //获取机器ID

char *s;

void (*kernel_entry)(int zero, int arch, uint params);

unsigned long r2;

kernel_entry = (void (*)(int, int, uint))images->ep; //设置kernel_entry()的地址为0x30000000

s = getenv("machid"); //判断环境变量machid是否设置,若设置则使用环境变量里的值

if (s) {

strict_strtoul(s, 16, &machid); //重新获取机器ID

printf("Using machid 0x%lx from environment\n", machid); //使用环境变量的machid

}

... ...

r2 = gd->bd->bi_boot_params; //获取tag参数地址, gd->bd->bi_boot_params在setup_start_tag()函数里被设置

kernel_entry(0, machid, r2); //跳转到0x30000000,r0=0,r1=机器ID,r2=tag参数地址

}

上面的machid默认值为MACH_TYPE_SMDK2410(也就是193),我们也可以在环境变量里设置machid变量

最终,便跳到内核执行代码,步骤如下所示:

1)根据R1(机器ID),来判断内核是否支持该机器,若支持则初始化机器相关函数

2)解析TAG参数,初始化串口,设置内存等

3)挂载根文件系统,并执行应用程序

简单配置内核

修改Makefile,修改配置tar xjf linux-3.4.2.tar.bz2

cd linux-3.4.2/

vi Makefile

改为ARCH ?= arm

CROSS_COMPILE ?= arm-linux-

配置编译cd arch/arm/configs //由于我们板子是arm板,进入该目录

ls *2440* //找到有mini2440_defconfig、

ls *2410* //找到有s3c2410_defconfig

cd ../../..

make s3c2410_defconfig //配置2410, 更新.config配置文件

make uImage //编译,生成uImage

cp arch/arm/boot/uImage /work/nfs_root/ //拷贝

cd /work/nfs_root/

mv uImage uImage_new

进入.config查看支持的CPUvi .config

如上图所示,有我们的2440

编译内核make uImage

报错如下Can't use 'defined(@array)'(Maybe you should just omit the defined? )at kernel/timeconst pl line 373

/root/working/Hi3520D SDK V2.0.3.0/osdrv/kernel/linux-30y/kernel/Makefile:140

recipe for target kernel/timeconst h failed make【1】:*** 【kernel/timeconst h】 Error 255

Makefile:945:recipe for target kernel ' failed

【kernel】 Error 2

解决办法:

将 kernel/timeconst.pl中第373行的 defined0去掉只留下@val就可以了vim kernel/timeconst.pl +373

进入uboot烧写nfs 32000000 192.168.2.106:/work/nfs_root/uImage_new

bootm 32000000

如下图所示,发现串口输出乱码:

设置机器ID

uboot传递进来的机器ID可以通过环境变量machid来设置

所以任意设置一个ID,这样再次启动内核时,内核识别不出来,就会打印出所有设备对应的机器ID。下面开始测试机器ID是否正确,进入uboot,输入:set machid 33333

tftp 32000000 uImage

bootm 32000000

如下图所示,由于内核不支持这个机器ID,所以打印出内核能支持的ID表:

ID所对应的文件为arch/arm/mach-s3c24xx/Mach-smdk2440.c

MACHINE_START为一个结构体,根据不同的机器ID找到对应的MACHINE_START,调用初始化函数。

由于我们板子是2440,所以测试7cf(mini2440)以及16a(smdk2440)这两个机器ID,是否支持我们开发板。

但是依旧乱码,可能是波特率设置不正确。重新设置下环境变量的波特率set bootargs root=/dev/mtdblock3 console=ttySAC0,115200

再次烧写启动,发现7cf(mini2440)这个ID,有串口输出正常。下面看下16a(smdk2440)为什么串口乱码,进入mach-smdk2440.c( 位arch/arm/mach-s3c24xx)找到问题出在smdk2440_map_io():static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

s3c24xx_init_clocks(16934400); //初始化时钟clock

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

修改晶振

由于我们板子上的晶振是12Mhz,而mdk2440_map_io()里,初始化的时钟是基于16934400hz的晶振。所以将:s3c24xx_init_clocks(16934400); //初始化时钟clock

改为:s3c24xx_init_clocks(12000000); //初始化时钟clock

然后重新编译uImage:make s3c2410_defconfig //将mach-s3c2440.c配置进内核

make uImage

cp uImage /work/nfs_root/ uImage_new

进入uboot,输入:set machid 16a

nfs 32000000 192.168.1.30:/work/nfs_root/uImage_new

bootm 32000000

如遇到排版错乱的问题,可以通过以下链接访问我的CSDN。

**CSDN:[CSDN搜索“嵌入式与Linux那些事”]

linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改相关推荐

  1. S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

    文章目录 uboot启动内核分析 简单配置内核 编译内核 设置机器ID 修改晶振 移植Linux3.4.2内核其他文章链接: S3C2440移植linux3.4.2内核之内核框架介绍及简单修改 S3C ...

  2. 一、【s3c2440移植linux-3.5】移植准备

    (一)编译内核 1.修改Makefile book@ubuntu:~$ cd linux-3.5/ diff -urN linux-3.5/Makefile linux-3.5_s3c2440/Mak ...

  3. linux mpc boot 串口初始化,uboot移植阶段二--3串口终结篇

    2011-03-20 23:00:37 前天U-boot移植串口后,能成功显示数据. 今天的主要目的是再次进行U-boot移植.看是否成功.花了40分钟,很顺利. 接着就是要把之前有问题的U-boot ...

  4. s3c2440移植Linux内核,移植Linux-3.4.2内核到S3C2440

    一.BootLoader引导内核过程 1.Bootloader的工作 1.1.将内核读入内存 1.2.保存内核启动参数到指定位置,内核启动时去这个位置解析参数 1.3.启动内核.传入机器ID 二.内核 ...

  5. 支持v4l2 linux内核选项 s3c2440,linux内核移植-移植2.6.35.4内核到s3c2440

    原标题:linux内核移植-移植2.6.35.4内核到s3c2440 硬件平台:FL2440 主机平台:Ubuntu 11.04 交叉编译器: - -gcc 4.3.2 原创作品,转载请标明出处htt ...

  6. linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)

    忙乎了一个下午,总算忙乎出来了,不过前期大量的搜索工作别人已经完成. 大量参考:http://blog.csdn.net /huihui1988/archive/2010/08/09/5799500. ...

  7. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  8. 基于S3C2440的linux-3.6.6移植——LED驱动

    目前的linux版本的许多驱动都是基于设备模型,LED也不例外. 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动.设备模型会产生一个虚拟的文件系统--sy ...

  9. S3C2440移植Linux4.19.275内核以及过程中遇到的问题

    目录 1 问题一:内核移植时MTD分区问题 2 问题二:uboot的MTDPARTS_DEFAULT定义的MTD分区,bootargs中的文件系统分区,内核的mtd_partition smdk_de ...

最新文章

  1. L1-025 正整数A+B
  2. Java中深浅拷贝之List
  3. static关键字的使用
  4. postgresql-创建主键自增的表
  5. linux系统内核官网,五年26个版本:Linux系统内核全程回顾
  6. OOD之问题空间到解空间—附FP的建模
  7. Redis链表结构深入
  8. hadoop--完全分布式运行模式
  9. ecshop3.0.0注入
  10. 精通RPM之--制作篇(rpmbuild)
  11. oracle还原数据库及遇到的问题
  12. python统计字符串中字母个数字母无视大小写_python判断字符串是字母 数字 大小写(转载)...
  13. vector 简单使用
  14. mysql安装包及安装教程(附网盘地址)
  15. 电工学复习【7】-- 集成运算放大器
  16. 连肌肉颤动都清晰可见!3D人体模型自动生成算法,一作来自北大图灵班 | SIGGRAPH...
  17. Clock skew too great
  18. windows系统服务器巡检仪哪个工具,机械振动巡检仪功能概述
  19. Windows无法启动某个服务--错误2:系统找不到指定的文件
  20. Mysql 使用【information_schema.COLUMNS】批量修改表字段注释

热门文章

  1. Go 知识点(17)— go 工具链 go test 使用
  2. 命名实体识别学习笔记——使用Ltp
  3. Centos7上安装docker 详细教程
  4. LeetCode简单题之丢失的数字
  5. 合肥工业大学—SQL Server数据库实验八:使用聚集函数的SELECT语句
  6. TVM性能评估分析(五)
  7. 工具箱支持汽车质量人工智能
  8. 经纬度绘图_【知识科普】地形图图例汇总,测绘人识图绘图必备(含dwg版下载)...
  9. Ubuntu安装MongoDB
  10. DOS命令行操作MySQL常用命令