u-boot(四)命令实现

目录

  • u-boot(四)命令实现

    • 分析run_command
    • 小结
    • 自定义一个命令
      • 代码
      • makefile


title: u-boot(四)命令实现

tags: linux

date: 2018-09-25 23:13:05

---

u-boot(四)命令实现

命令是如何实现的?

  1. 输入命令
  2. 执行函数,根据命令去寻找函数

所以会有一个命令的结构体[name,fun]

分析run_command

函数原型如下 int run_command (const char *cmd, int flag)

  1. 处理, 空格,;
  2. 解析参数parse_line (finaltoken, argv)
    example: md.w 0 ------>argv[0]= "md.w", argv[1]=" 0"
    
    ?```
    /* Extract arguments */
    if ((argc = parse_line (finaltoken, argv)) == 0) {
        rc = -1; /* no command at all */
        continue;
    }
    ?```
  3. 命令搜索if ((cmdtp = find_cmd(argv[0])) == NULL),可以发现结构体
    struct cmd_tbl_s {
     char        *name;      /* Command Name         */
     int     maxargs;    /* maximum number of arguments  */
     int     repeatable; /* autorepeat allowed?      */
                     /* Implementation function  */
     int     (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
     char        *usage;     /* Usage message    (short) */
    #ifdef   CFG_LONGHELP
     char        *help;      /* Help  message    (long)  */
    #endif
    #ifdef CONFIG_AUTO_COMPLETE
     /* do auto completion on the arguments */
     int     (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
    #endif
    };
    • repeatable 可重复,指的是直接按回车是否继续执行上次命令
    • usage,短的help,指的是直接输入help查看的所有命令显示的帮助
    • help,具体的help,指的是help cmd 查看的具体的信息

    查看函数,可以发现是在__u_boot_cmd_start__u_boot_cmd_end中遍历,这个地址是在链接脚本中定义的,也就是命令这个东西,有一个特殊的属性,定位到某个地址.

     . = .;
     __u_boot_cmd_start = .;
     .u_boot_cmd : { *(.u_boot_cmd) }
     __u_boot_cmd_end = .;

    搜索这个段属性.u_boot_cmd,在include\command.h有这么一个宏

    #define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))

    再搜索下这个宏

    #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}

    再搜索一下这个U_BOOT_CMD,可以发现其实就是命令了,搜索下命令bootm,在common\cmd_bootm.c

    U_BOOT_CMD(
         bootm,  CFG_MAXARGS,    1,  do_bootm,
         "bootm   - boot application image from memory\n",//注意,下面的几个是没有逗号,是整体
         "[addr [arg ...]]\n    - boot application image stored in memory\n"
         "\tpassing arguments ‘arg ...‘; when booting a Linux kernel,\n"
         "\t‘arg‘ can be the address of an initrd image\n"
    );

    尝试着展开这个宏,可以发现就是定义了一个段属性特殊的结构体,也就是命令结构体

    cmd_tbl_t  __u_boot_cmd_bootm  Struct_Section=
    {
        "bootm",
        CFG_MAXARGS,
        1,
        do_bootm,
        "bootm   - boot application image from memory\n",
        //下面的字符串是一个整体
        "[addr [arg ...]]\n    - boot application image stored in memory\n"
         "\tpassing arguments ‘arg ...‘; when booting a Linux kernel,\n"
         "\t‘arg‘ can be the address of an initrd image\n"
    }

小结

  1. U-boot 的命令是用结构体存储的,这些结构体是用特殊的段属性集合到一块区域里面去,分散在各个文件中
  2. 命令解析的时候是去这个段去搜索的,这个段属性的地址是从__u_boot_cmd_start__u_boot_cmd_end,在链接脚本中定义的.
  3. 命令结构体
    struct cmd_tbl_s ;

自定义一个命令

参考common/cmd_bootm.c的头文件,编写源代码cmd_hello.c

代码

#include <common.h>
#include <watchdog.h>
#include <command.h>
#include <image.h>
#include <malloc.h>
#include <zlib.h>
#include <bzlib.h>
#include <environment.h>
#include <asm/byteorder.h>
int do_hello (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int i ;
    printf ("hello world %d \n,", argc);
    //打印下参数
    for(i=0;i<argc;i++)
    {
        printf ("argv[%d] is %s \n",i,argv[i]);
    }
    return 0;
}

U_BOOT_CMD(
    hello,  CFG_MAXARGS,    1,  do_hello,
    "this is short help for hello  just test\n",
    "this is long help for hello  just test\n"
);

makefile

修改commonmakefile,只需要在COBJS上加上cmd_hello.o

原文地址:https://www.cnblogs.com/zongzi10010/p/10023679.html

时间: 2025-01-15 15:00:00

u-boot(四)命令实现的相关文章

Spring Boot通过命令行启动发生FileNotFoundException

Spring Boot + Jersey 通过命令行启动会发生错误FileNotFoundException异常 异常信息如下: ERROR o.a.c.c.C.[Tomcat].[localhost].[/] - StandardWrapper.Throwable org.glassfish.jersey.internal.ServiceConfigurationError: org.glassfish.jersey.internal.spi.AutoDiscoverable: : java.

Spring Boot (四):打包部署

springboot 打包与部署 一.jar 包 pom文件中packaging: 1.编译 进入项目目录,使用如下命令: //命令打包(-Dmaven.test.skip=true 跳过测试) mvn clean package -Dmaven.test.skip=true或者执行Maven install 2.运行 当前目录的target 就有一个.jar 文件 #启动命令 nohub java -jar xxxx.jar >/dev/null 2>&1 & 二.war 包

spring boot(四) 多数据源

前言 前一篇中我们使用spring boot+mybatis创建了单一数据源,其中单一数据源不需要我们自己手动创建,spring boot自动配置在程序启动时会替我们创建好数据源. 准备工作 application.yml中配置connection的4个属性 spring: datasource: read: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.80.129:3306/test username:

Linux启动Spring boot项目命令

#不指定日志文件nohup java -jar csd-admin.jar --spring.profiles.active=prod & #指定日志文件nohup java -jar /projects/farinfo-csd/csd-api/csd-api.jar --spring.profiles.active=test2 >/projects/logs/CSD_api/log_info.log & 原文地址:https://www.cnblogs.com/lihaoyang/

dump和restore备份和还原备份命令

继续记录自己的学习笔记,昨天学习的是备份和还原 课程大纲 1 备份概述 2 dump和restore命令 要做实验前请先查看是否安装了dump服务包 命令是:rmp -q dump 如果没有请安装 yum -y install dump 我们实验的目录如下 Linux 系统需要备份的数据 /root /home /vra/spool/mail /etc/ 安装服务的数据 apache需要备份的数据 1配置文件 2网页主目录 3日志文件 mysql需要备份的数据 1源码包安装的mysql:/usr

Spring Boot入门,一步一步简化,实现Spring Web项目开发

一. Spring Boot介绍 Spring Boot诞生的目的就是用来简化Spring应用开发过程.该框架使用了特定的方式来进行配置,从而使得开发人员不在需要定义一系列样板化的配置文件,而专注于核心业务开发.帮助开发人员快速的构建出基于Spring的应用.它会在后台整合项目所需的第三方依赖类库或框架,不再需要编写复杂的XML配置文件,仅通过几行代码就能实现一个可运行的Web应用. 直接嵌入 Tomcat 或 Jetty 服务器,不需要部署 WAR 文件. 提供许多基于Maven的 POM配置

烽火2640路由器命令行手册-01-基础配置命令

基本配置命令 目  录 第1章 系统管理命令... 1 1.1 配置文件管理命令... 1 1.1.1 copy. 1 1.1.2 delete. 2 1.1.3 dir 3 1.1.4 download c0. 3 1.1.5 eraserom.. 4 1.1.6 more. 5 1.1.7 upload c0. 6 1.1.8 download. 6 1.1.9 upload. 7 1.2 基本系统管理命令... 8 1.2.1 boot flash. 9 1.2.2 cd. 10 1.2.

Linux基础——bash基础应用及文件系统基础命令

(一).命令别名 alias用于获取当前用户可用的别名定义 [[email protected] ~]# alias alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' 定义别名:~]# alias  NAME='COMMAND'(生命周期:当前shell进程) 撤消别名:~]# unalias NAME 注意:如果别名和

Spring Boot 基础

Spring Boot 基础 Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot 不会降低学习成本,甚至增加了学习成本,但显著降低了使用成本并提高了开发效率.如果没有Spring基础不建议直接上手. 1.基础项目 这里只关注基于Maven的项目构建,使用Spring Boot CLI命令行工具和Gradle构建方式请参考官网. (1)创建项目: 创建类型为quickstart的