- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
命令的执行分析 run_command()函数是查找并执行用户输入的命令,分析器代码如下: 解析用户输入的字符串; 经过解释后,用户输入的命令 以及命令后面的参数分割成独立 的字符串,并保存在argv数组中 argc是命令+参数的个数 以命令名字查找对应的cmd_tbl_t结构体; cmdtp指向命令对应的该结构体; 通过指针cmdtp,执行命令对应的函数 cmdtp-cmd(); cmd_tbl_t类型的定义如下 命令的执行分析 通过上面的分析,我们知道执行命令的关键是: 通过find_cmd()函数找到命令对应的cmd_tbl_t结构变量; 然后调用这个变量中的cmd函数; 命令的执行分析 现在,关键的问题是这个全局的数组在哪里定义呢? u-boot采用的一种特殊的方法来处理这个全局数组,就是将这个全局数组用一个独立的数据段保存。 查看链接脚本(board/samsung/tiny4412/u-boot.lds)如图: 链接脚本中,有一个数据段, 段名为.u_boot_cmd, 符号__u_boot_cmd_start=段的开头地址; 符号__u_boot_cmd_end=段的结束地址; 命令的执行分析 总的来说,用户输入命令后,u-boot执行过程如下: main_loop()函数: 调用readline()接收用户的输入,保存到全局变量console_buffer中; 将console_buffer的内容拷贝到lastcommand; 调用run_command (lastcommand);run_command ()函数如下: 解析用户输入的字符串; 调用find_cmd()函数查找命令对应的cmd_tbl_t结构体变量; 然后通过指向该结构变量的指针cmdtp,执行相应的函数: (cmdtp-cmd) (cmdtp, flag, argc, argv); 添加自定义命令 从上面命令的执行分析可以知道,要在u-boot中添加自定义命令的方法如下: 在u-boot源码的common命令定义一个命令实现的文件,文件名以cmd_开头,文件的实现分两部分: 一是命令对应的执行函数; 另一部分是使用宏U_BOOT_CMD定义一个cmd_tbl_t结构体变量 修改common目录下的Makefile,将上面自定义的文件添加到编译目标中; 配置编译内核 内核提供了各种不同的工具来简化内核配置。 最简单的一种是一个基于文本的命令行工具: $make config 该工具会挨个遍历所有配置项,要求用户选择yes、no或是module(如果是三选一的话)。 用基于ncurse库编制的图形界面工具: $make menuconfig 用基于x11的图形工具: $make xconfig 用基于gtk+图形工具: $make gconfig 配置内核 将内核配置成默认: 查看默认配置: $ ls arch/arm/configs/ 在内核源码下面的arch/arm/configs的配置文件都是内核支持平台的默认配置; 配置成默认: $ make exynos_defconfig 通过这条命令为你的体系结构创建一个默认的配置。 linux内核配置菜单的选项由各个目录下的Kconfig文件提供,对内核的配置结果保存在隐藏文件.config中,对源码的编译组织工作由各个目录下的Makefile文件负责。 编译内核 内核配置好了,就可以编译它了: $ make 减少编译的垃圾信息 $ make ../some_other_flie # 将屏幕上的信息写入到文件中 $ make /dev/null 有时,想查看编译过程中的详细信息 $ make V=1 可以使用多线程进行编译,使用以下命令: $ make -jn 这里,n是要衍生的作业数,在实际中,每个处理器上一般衍生一个或者两个作业。例如,在一个双处理器上,可以输入如下命令: $ make -j2 Linux内核的生成示意图 zImage 压缩内核映像的生成 启动linux内核 先了解Linux的内核启动的条件 zImage是linux的标准内核映像; uImage是u-boot特有的内核映像,是使用mkimage工具在zImage头部加入64bytes数据生成。 u-boot启动uImage的过程就是分析uImage的64bytes头部,然后启动uImage除去64bytes头部的zImage; 而启动zImage需要一些条件: 设置启动参数 设置CPU的状态 设置启动参数 设置启动参数 默认的启动参数的起始地址一般是(内存起始地址+0x100)处,如tiny4412的的启动参数的起始地址是(00x100)。 启动参数
文档评论(0)