嵌入式linux核心课笔记1

本文详细介绍了Uboot的基础知识,包括常用命令如printenv,setenv,ping,tftp等,以及如何设置环境变量和自动运行命令。同时涵盖了shell编程入门,如变量定义、语法、shell脚本和Makefile的基本概念,以及它们在项目管理和依赖关系中的应用。
摘要由CSDN通过智能技术生成

2. Uboot和系统移植

主要内容

uboot基础知识

shell基础知识

makefile基础知识

2.1 Uboot学习前传

2.1.5-9Uboot常用命令

  1. printenv/print

    不用带参数,作用是打印出系统中所有的环境变量

  2. setenv/set

    用法:

    1. set name value

      设置环境变量name的值为value

  3. saveenv/save

    不用带参数,作用是将内存中的环境变量的值同步到flash(硬盘)中的环境变量的分区

    彻底更改系统环境变量的值,先set再save;暂时更改环境变量,只set不save,下次开机还是会恢复到原来的值

  4. ping

    用法:

    1. ping IP地址

      测试与某IP地址的网络连接是否成功

  5. tftp

    用法:

    首先设置serverip地址为目标tftp服务器的IP地址

    1. tftp 内存地址 文件名称

      tftp 0X300000000 name.exe

  6. movi(mmc)

    用法:

    操作flash,读取内容到ddr中或写入内容到flash中,movi命令是一个命令集

    1. movi init/read/write

      movi read u-boot 0x30000000

      将inand、flash中的u-boot分区读入到ddr的0x30000000位置(uboot中的所有数字默认按照十六进制处理,不管加不加0x)

  7. 内存操作指令mm,mw,md

    用法:

    • md(memory display)

      md [.b/.w/.l] 地址 [显示长度(字节)]

      md .b 0x30000000 10

    • mw(memory write)

      mw [.b/.w/.l] 地址 值 []

      mw .b 0x30000000 55

    • mm(mempry modify)修改内存(如果需要批量逐个修改内存,这个比较方便)

      mm [.b/.w/.l] 地址

      mm .b 30000000

  8. 启动内核命令bootm,go

    用法:不管启动是否成功,uboot都会死掉

    bootm命令启动会给内核传参,go命令启动不会给内核传参

  9. nfs

    用法:启动内核命令(挂载根文件系统)

2.1.10-11 uboot常用环境变量

  1. 自动运行倒数时间:bootdelay

  2. 网络设置ipaddr serverip

    • ipaddr是开发板的本地IP地址
    • serverip是开发板的tftp目标服务器地址
    • gatewayip是开发板本地网关地址
    • netmask是子网掩码
    • ethaddr是开发板的本地网卡的mac地址
  3. 自动运行命令设置bootcmd

    倒计时结束后自动执行的命令集,

    set bootcmd ‘movi read kernel 30008000;bootm 30008000’

    注意单引号,如果没有单引号则后边bootm不会被写入环境变量

  4. uboot给内核传参bootargs

    linux内核可以接受uboot传递的启动参数,内核在这些启动参数的指导下完成启动过程

    在uboot的环境变量设置bootargs,bootm命令会自动将这些信息传入内核

2.1.12 uboot对flash和DDR的管理

  1. uboot对flash的分区

    uboot和kernel中有分区表,分区表就是做系统移植时对flash的整体管理分配方法。

    分区方法不是一定的,但是必须在一个移植中必须事先设计好并定死。定的标准是:

    • uboot必须从flash起始地址开始存放,取决于SoC的启动设计,uboot分区的大小必须保证肯定能放下uboot,一般设计为512KB或1MB。
    • 环境变量的分区一般紧贴着uboot存放,大小为32KB或以上。
    • kernel可以紧贴环境变量存放,大小一般为3MB,5MB或其他。
    • rootfs:自由设置
    • 剩下的就是自由分区,自由分区在kernel启动后挂载在rootfs下
    • uboot和kernel应使用同一个分区表。
  2. uboot对DDR的分区

    内核的分区主要是在kernel启动之前,kernel启动之后内核的内存管理模块会接管整个内存空间。

2.2 shell和makefile入门

2.2.1 shell介绍

  1. shell就是一个命令行界面,是一种人机交互的方式
  2. shell是一类编程语言,编写shell脚本时,用的就是shell语言
  3. shell程序是解释运行的

2.2.2 写一个shell程序

  1. 运行方法
    • ./XX.sh 直接运行,可用chmod添加可执行权限
    • source命令,source就是专门用来执行脚本程序的,这样执行不需要脚本具有可执行权限
    • bash xx.sh 使用可执行程序bash来解释运行脚本程序
  2. shell程序第一行一般都是#!+pathname,后面的pathname,就是指定shell程序执行时被哪个解释器执行
  3. 注释使用#,可以注释一行,如果注释多行需要每行都注释
  4. shell就是把以前在命令行下键入的命令写成了程序

2.2.3-2.2.6 shell语法

  1. shell中定义变量的时候可以直接定义,不需要指定类型

  2. 变量定义可以初始化,使用“=”赋值,在shell中“=”两边不能有空格

  3. shell中语法非常严格,尤其对于空格

  4. 变量定义后可以再次赋值,新的赋值会覆盖老的

  5. shell中引用一个变量必须使用“$”可以$var也可以${var}

  6. shell中直接使用字符串可以不加双引号,但是不能输出双引号等转义字符

  7. 如果要输出特殊符号需要先用双引号包起来再用\转义

  8. 选择分支结构***(注意中括号里面前后都有空格)***

    • if [表达式];then

      ​ xxx

      else

      ​ yyy

      fi

    • if 的典型应用

      • 判断文件是否存在(-f)

        if [ -f a.c ]; then
        	echo"yes"
        else
        	echo"no"
            touch a.c
        fi
        
      • 判断目录是否存在(-d)

      • 判断字符串是否相等(“str1” = “str2”)注意用一个等于号不是两个

      • 判断数字是否相等(-eq),大于(-gt),小于(-lt),大于等于(-ge),小于等于(-le)

        equal,greater then,less then,greater or equal ,less or equal(12 -eq 12)

      • 判断字符串是否为空(-z)

      • 使用(-o)表示逻辑或

  9. 循环结构

    其逻辑与C语言逻辑类似

  10. echo指令创建文件和追加输入文件

    • echo “test” > a.txt

      在当前目录下创建a.txt文件并把test写入该文件

    • echo “test” >>a.txt

      在a.txt文件末尾追加test字符

  11. case语句

    • 演示注意两个分号

      var=2
      case $var in
      1) echo "1" ;;
      2) echo "2" ;;
      esac
      
    • case语句天生没有break,也不需要break,默认都带了break

  12. shell程序的传参

    • 可以在调用时给shell程序传参
    • $# 表示调用该shell时传参的个数
    • $0,$1,$2表示传参的各个参数
    • $0时执行这个shell程序的解析程序的名称
    • $1是第一个有效参数的值
  13. shell中的break语句是用来跳出循环的而不是用来跳出case语句的

2.2.7 Makefile学习

  1. makefile的作用和意义
    • 项目中的文件过多,管理不方便,用makefile来做项目管理方便编译链接过程。
    • uboot和kernel本质上都是C语言的项目,由很多文件组成,故需要通过makefile管理
  2. 目标,依赖和命令
    • 目标就是最终要生成的东西
    • 依赖就是生成目标的原料
    • 命令就是加工方法
    • makefile的过程就是使用命令将依赖加工成目标的过程
  3. 通配符%和makefile自动推导
    • %是makefile中的通配符,%.o代表所有以.o结尾的文件
    • 自动推导就是makefile的规则。当makefile需要某个目标时,会把这个目标去套规则说明,一旦套上了某个规则,makefile就会去寻找这个规则的依赖,如果能找到就执行这个规则用依赖生成目标
  4. makefile中定义和使用变量
    • 和shell脚本中非常相似,都没有变量类型,直接定义使用,引用时用$var
  5. 伪目标
    • 伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件,而是单纯为了执行这个目标下面的命令
    • 伪目标一般都没有依赖,不加依赖就是无条件执行
    • 伪目标可以直接写,不影响使用;为了明确声明这个目标是伪目标,要在前面加上(.PHONY)
  6. makefile的文件名
    • 合法的文件名一般有两个:Makefile或makefile
  7. makefile中引用其他makefile(include 指令)
    • 当总体比较复制的时候,分成好几个makefile写,在主makefile中引用其他的,用include引用,应用的效果也是原地展开,与c中的头文件类似

2.2.8 makefile补充学习

  1. makefie中注释使用#

  2. 在makefile的命令行前面的@表示静默执行。既不打印要执行的命令直接执行

  3. makefile中的变量赋值运算符

    • = 最简单的赋值

      在对=赋值的变量解析时,是按照最后一次赋值的值进行解析的

    • :=

      在对:=赋值的变量解析时,是按照解析前的最后第一次出现的值进行解析

    • ?= 如果变量前面并没有赋值过则执行这条命令,如果已经赋值过则本行被忽略

      所谓的没有赋过值,就是这个变量没有被定义过

    • += 用来给已经赋值过的变量接续赋值,意思就是把这次的值加到原来的值的后面,类似strcat。

      接续后的内容中间自动会有空格隔开

  4. makefile的环境变量

    • makefile中用export导出的就是环境变量,一般情况下要求环境变量用大写,普通变量用小写。
    • 环境变量和普通变量不同,环境变量类似整个工程所有的makefile之间可以共享的全局变量,普通变量只是本makefile可以用,定义了一个环境变量会影响到本工程中别的makefile文件,因此要小心
    • makefile中有一些环境变量是自己定义的内部环境变量,或者是当前的执行环境提供的环境变量。
  5. makefile中的通配符

    • * 若干个任意字符
    • ?一个任意字符
    • [] 将括号中的字符依次去和外面的匹配

    还有个**%**表示任意多个字符,但是一般只用在规则描述中,又叫做规则通配符

    还有一些比较复杂的如wildcard通配符

  6. 自动变量

    • 自动变量的含义:预定义的特殊意义的符号,类似C语言编译器中预置的宏
    • 常见的自动变量
      • $@ 规则的目标文件名
      • $< 规则的依赖中文件名
      • $^ 依赖的文件集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值