• 系统移植知识点总结


    系统移植学习各知识点总结

    首先我们来了解一个设备要运行起来,要做的工作:

    请添加图片描述

    接下来我们了解一下常见的操作系统

    所谓的操作系统就是管理硬件,对用户提供统一的接口
    提供服务: 网络协议 打印服务 UI界面

    vxworks:  硬实时系统	军工   汽车  	   $1
    linux:	  软实时系统		民间    免费   服务器  嵌入式	 
    window:   非实时系统		民间	收费   PC
    其他: freeRTOS-stm32      51-osal    ucOS  xxx
    
    RTOS: real time os 实时系统
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    简单了解一下系统移植

    首先就是为什么我们要进行系统移植:
    思考一个问题:新开发板子需要系统,但是没有系统. 系统从哪里来???
    答案是:大多数芯片原厂都会提供,包括 系统、电路图 linux源码 u-boot源码 开发工具 等。

    系统移植主要分为三个主要部分:

    bootloader os fileSystem

    举个例子:

    PC: bios window fileSystem
    手机: recovery andriod fileSystem
    嵌入式: u-boot linux fileSystem

    系统移植的过程:

    1.使用大厂提供的 原始iso(uImage) run in my board .发现可以跑起来,但是可能有问题.

    2.发现问题,找出原因: 比较两个板子差异.

    3.根据原因 添加我们功能
    比如 dm9000, 修改设备树 menuconfig添加驱动和其他功能

    1. 添加第三方驱动:比如摄像头 …
      1)方法一直接融入内核
      2)方法二 编译为模块
      5.自己写驱动

    接下来了解一下系统移植的三个部分

    bootloader

    boot 启动,启动板子 loader加载os
    目的: 加载并启动os.

    bootloader其实 就一个 单片机程序,能够开机启动 最后加载os就行了.


    工作过程:
    汇编 : 开机启动 初始化核心硬件(cpu ram flash 串口) 初始化堆栈,跳转到C
    C语言: 初始化大部分硬件(网卡 sd )从flash加载环境变量,初始化 [交互模式] 加载os,启动os


    u-boot使用:
    bootloader有很多款:
    bios : 安装包 300M ,功能强大 PC
    recovery: 安装包 5MB ,功能可以 手机
    u-boot : 200KB ,功能够用 嵌入式

      u-boot: universal bootloader 通用的bootloader
      			可以跑在pc arm ppc mips .....
    
      	u-boot是依赖于硬件的, 硬件不同 你要使用专用的u-boot .
      	工作中我们很少去改动u-boot.  因为u-boot使用的硬件很少的.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    两种方法:
    命令:
    printenv 打印环境变量
    FS4412 # printenv
    setenv 环境变量 值 修改内存中的环境变量
    如果环境变量没有,则创建
    如果值为空,则删除

      	saveenv					把内存中的环境变量存入flash
      	
      	tftp 文件传输命令		tftp服务器ip--环境变量serverip决定
      							板子ip---ipaddr决定
      			tftp  41000000  文件名
      	ping ipaddr
      	
      	go addr			: 去指定地址执行程序
      	bootm:		boot from memery,主要用来启动操作系统的 
      			bootm  os_addr     fs_addr  dtb_addr
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10


    环境变量: 它会影响uboot执行
    baudrate=115200 串口波特率
    bootargs=root=/dev/ram0 rw console=ttySAC2,115200 init=/linuxrc
    linux启动 需要读取fs,那么他怎么知道fs在哪里(网上 sd 硬盘 u盘)…他其实不知道
    你要告诉他 写入bootargs中,有固定的格式的.

      			set bootargs root=/dev/nfs nfsroot=192.168.3.196:/home/lsf/source/rootfs rw console=ttySAC2,115200 init=linuxrc ip=192.168.3.232
      					root=/dev/nfs::   rootfs根文件系统使用nfs,要去网络上挂载它
      					nfsroot=192.168.2.121:/home/lsf/source/rootfs rw   指定nfs的具体位置 和读写权限
      					console=ttySAC2,115200   告诉linux 你起来以后,记得使用串口2,波特率=..... 
      					init=linuxrc 
      					ip=192.168.2.245	告诉linux ,你起来以后 使用这个ip
      			   bootcmd=movi read kernel 41000000;movi read dtb 42000000;movi read rootfs 4300000 3f73a9;bootm 410000 
      		u-boot要去加载启动os,但是u-boot怎么知道 如何启动os???他不知道
      					你要告诉u-boot如何启动,如何告诉u-boot:  让bootcmd等于几条指令,这几条指令依次执行就可以启动os 
      				u-boot启动之后就会 读取bootcmd参数,然后依次执行.
      			  
      set bootcmd   tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000 
      	bootdelay=3		启动延迟
      			ethact=dm9000	网卡dm9000
      			ethaddr=11:22:33:44:55:66	网卡物理地址
      			fileaddr=41000000
      			filesize=8636
      			gatewayip=192.168.3.1		网关地址
      			serverip=192.168.0.134 		tftp服务器ip
      			ipaddr=192.168.3.247		板子的ip
      			netmask=255.255.255.0		掩码
      			stderr=serial
      			stdin=serial
      			stdout=serial
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    u-boot源码

    ​ 解压源码,要在纯linux下 tar -xvf u-boot…
    ​ 顶层目录, u-boot第一级目录,以后 代码移植 编译都是在该目录下.

    目录结构:
    1.平台相关源码
    cpu相关的代码 不同的cpu代码不一样,so 每款 arm系列 都有有自己的 代码 arch/arm/cpu/xxxxxx 4
    板子相关的代码 不同的板子,代码不一样 board/samsung/origen
    板子可以有不同配置 一个板子可以有多个配置文件 include/configs/origen.h 里面全是宏
    2.平台无关的源码
    比如 网络协议 命令 驱动 等等都是 无关cpu 板子 配置的.

    编译: 要在顶层目录下
    1.配置u-boot: 告诉u-boot你要编译那一款板子(origen)的
    make 板子名字_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
    例子: make origen_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    2.编译
    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
    3.结果 顶层目录下 u-boot.bin可以烧录到板子上的
    u-boot.map 将源码中的所有符号的地址存起来

    4.清空
    make clean 清理垃圾,除了配置文件
    make distclean 清理所有的东西

    u-boot简单移植

    ​ 我们需要修改的地方
    ​ cpu的代码 arch/arm/armv7 不需要动
    ​ 板子的代码 board/samsung/origen 要改
    ​ 配置文件 include/configs/origen.h 要改

    如何做??? 为什么要这么做???

      1.每款板子都要有自己独立的代码,实现自己的初始化
      	cp board/samsung/origen  board/samsung/fs4412  
      	mv  board/samsung/fs4412/origen.c   
      	board/samsung/fs4412/fs4412.c 同时还要修改Makefile 
      		vi board/samsung/fs4412/Makefile 
      		将所有origen替换为fs4412 
      		
      2.每款板子都要有自己的配置文件  
      cp include/configs/origen.h    include/configs/fs4412.h
    
      3.  我们以前 make origen_config的时候, u-boot是如何知道 对应cpu 公司的 配置文件的......
      原理:  make origen_config 的时候 根据 origen去搜索boards.cfg文件中的选项,找出该board 's cpu and config file and vendor(公司 厂家)
      			
      4.配置和编译 
      	make fs4412_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
      	make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 			
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    操作系统 os

    板子上linux : kernel–内核 镜像 uImage 2M
    Ubuntu/andriod : 基于内核,增加了很多app 镜像 iso 3.7GB
    linux内核的版本发展:

    4.5.0-21-generic
    主版本号.次版本号.修改版本号-原厂自定义版本号

    次版本号 为奇数的时候,表示当前系统版本是不稳定版本(实验版本)
    偶数,表示 稳定版本

    内核源码
    解压在纯linux目录下 tar -xvf linux-3.14.tar.xz
    顶层目录: linux第一级目录 后续编译和移植都是基于该目录下执行的.

    平台相关 :
    不同的cpu 不同的板子 代码和配置是不一样的
    cpu: arch/arm/mach-xxx 表示一款芯片的初始化代码
    board: 都描述了在设备树中 arch/arm/boot/dts 每个板子都要有自己的设备,描述自己有哪些硬件
    config: 不同的板子配置不一样 arch/arm/configs/exynos_defconfig

    平台无关 :
    Documentation-文档 init-内核的初始化代码 lib sound
    block-块设备 drivers-驱动程序 ipc-进程间通信实现 tools
    COPYING firmware-固件 Kbuild Makefile samples usr-用户目录
    CREDITS fs-文件系统的实现 Kconfig mm–内存管理 scripts virt
    crypto–加密算法 include-头文件 kernel-核心实现 net-网络协议 security


    编译
    1.配置 告诉linux kernel 要编译那些功能进入 uImage
    cp arch/arm/configs/exynos_defconfig .config

      	如何修改配置呢 : .config是默认配置文件  
      	方法1: 直接修改.config   不现实---看不懂
      	方法2: linux提供了图形化配置界面  
      	
      	make menuconfig    ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
      		依赖于库  	sudo  apt-get install libncurses5-dev
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    内核裁剪: 通过menuconfig方法 增加/删除 需要/不需要功能,从而让uImage大小发生变化.

    2.编译
    make [uImage] ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4

    3.结果
    arch/arm/boot
    Image 原始的可以直接运行的内核 5M~
    zImage 对Image进行压缩, 运行之前需要解压,但是zImage自带解压程序
    uImage u:u-boot uboot专用的Image
    u-boot 对zImage进行处理, 添加一些头部 生成uImage
    前提: 需要u-boot的工具编译uboot之后,会tools/mkimage 拷贝到 /bin ,等于安装该软件
    在编译内核的时候, make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4
    该命令会首先 生成 Image,然后生成zImage,最后 使用mkimge工具产生uImage

    1. 清空
      make clean 清零所有.o, 保留配置文件和 uImage Image zImage
      make distclean 清理所有东西

    我们知道,有些驱动会集成到 kernel, 那些驱动有资格进入 kernel???
    大厂:intel NVIDIA
    小厂: 应用规模很大的芯片驱动
    问题来了: 如果驱动没有集成到内核,怎么办???
    添加到内核,然后可以通过menuconfig配置 编译与否!!!

      		思考: 需要那些功能
      			1.在menuconfig中显示出来   --显示
      				你要了解menuconfig的工作过程 	 Kconfig 
      			2.编译的时候, 可以根据 menuconfig的配置,决定是否编译 ---编译
      				还要知道 内核的编译过程			Makefil
    
    • 1
    • 2
    • 3
    • 4
    • 5

    文件系统 fileSystem

    文件系统 他是一个 用户访问系统 接口/界面 ,all in file

    普通的文件:
    bin–存放命令的 etc–配置文件 linuxrc sbin–非系统级命令
    tmp–临时文件 var-variable:日志 usr–存放用户文件的 /usr/bin /usr/sbin:存放用户命令的
    lib–库文件 mnt-推荐mount挂载点

    内存文件系统: 文件都建立在ram至上.
    特点: 访问速度快,断电丢失

      	/proc: process 内核运行信息.
      		cmdline,即u-boot传过来的bootargs 
      		cpuinfo: cpu信息
      		###device-tree:   列举了设备树的各个节点,按照 数结构
      		diskstat :查看系统有有哪些分区  
      		meminfo: ram信息
      		modules:查看内核安装了哪些模块   lsmod:读取该文件,解析,打印 
      		partitions: 查看系统有哪些分区 	 
      		uptime: 时间 
      		version:  内核版本 
      		数字:
      			表示 进程号, 在对应的目录下可以看到改进程的各种属性	
      	/sys
      			驱动和设备的		
      				sys/bus/总线/devices  
      			
      	/dev	存放设备文件的地方  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    开机启动:
    kernel启动之后,挂载fs. 然后去fs中找到第一个程序–init程序(init=linuxrc).
    init进程是第一个用户程序,pid=1. init进程要做哪些工作呢:
    init读取一个文件 /etc/inittab

      	#this is run first except when booting in single-user mode.
      	::sysinit:/etc/init.d/rcS       ### 当系统发生 init事件, 执行后面的脚本  
      								系统一起动,init进程就会执行 后面的脚本
      	# /bin/sh invocations on selected ttys
      	# Start an "askfirst" shell on the console (whatever that may be)
      	::respawn:-/bin/sh
      	# Stuff to do when restarting the init process
      	::restart:/sbin/init
      	# Stuff to do before rebooting
      	::ctrlaltdel:/sbin/reboot
      	/etc/init.d/rcS  :
      	init进程开机就会执行,如果你想 让某个进程 开机执行,把程序写进去
          
          telnet#######
      远程登录命令:  
      	客户端 telnet  servIP
      	服务器: 开机启动telnetd
      			配置文件 /etc/passwd      	root::0:0:root:/:/bin/sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18


    深入文件系统
    window: fat32 NTFS reFs 一直在发展
    linux: ext2 ext3 ext4 ext5 …
    他们不能用在嵌入式上,体积太大了
    嵌入式上要有自己 特有的文件系统: 体积小,功能够用

      		cramfs:  linus亲自开发的,只读的    nor/nand flash4
      		#jffs2:	针对nor flash开发的,后来支持nand flash,但是效果不好   RW
      		#yaffs2:	针对nand flash的  	RW
      		exit2:  支持 nor nand,但是都不咋的
        nor  flash:   有数据线和地址线 体积大 容量小  	1-3-5M           
        工艺要求很高    安全   贵
    nand flash:	  只有8根线,数据和地址都走它体积小,容量大   100M-500G-1G
        工艺要求不高   一般    便宜 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    功能够用

    cramfs: linus亲自开发的,只读的 nor/nand flash4
    #jffs2: 针对nor flash开发的,后来支持nand flash,但是效果不好 RW
    #yaffs2: 针对nand flash的 RW
    exit2: 支持 nor nand,但是都不咋的
    nor flash: 有数据线和地址线 体积大 容量小 1-3-5M
    工艺要求很高 安全 贵
    nand flash: 只有8根线,数据和地址都走它体积小,容量大 100M-500G-1G
    工艺要求不高 一般 便宜

  • 相关阅读:
    Kotlin MutliPatform Demo NoteApp
    如何实现浏览器标签页之间的通信
    openjudge_2.5基本算法之搜索_1789:算24
    Mac M1安装配置与卸载GoLang---kalrry
    Ring Buffer 如何实现
    ChatGPT 国内快速上手指南
    【C++】Ubuntu18.04安装C++的IDE——KDevelop
    反射(一)
    什么情况下你会使用AI工具(chatgpt、bard)?
    VMware设置Linux网络
  • 原文地址:https://blog.csdn.net/weixin_49606782/article/details/127501173