驱动开发必修-嵌入式开发板的启动过程

  • 简介
  • 从打印日志入手 熟悉启动过程
    • 1.执行u-boot程序
    • 2.加载linux内核
    • 3.挂载rootfs
    • 4.加载完后 进入终端(命令输入行)
  • UBOOT
    • 1.什么是u-boot
    • 2、uboot是开源的,免费的
    • 3、u-boot作用
      • 1)boot: 初始化硬件
      • 2)加载操作系统---linux内核(在eMMC上开始加载linux内核镜像)
      • 3)uboot提供一些工具
    • 4、u-boot工具(命令)
  • linux内核
    • 1、linux内核的组成
    • 2.linux内核源码的结构
    • 3.内核的官网
  • rootfs文件系统
    • 1.什么是rootfs
    • 一些根目录下的目录定义

简介

GEC6818 S5P6818 Cortex-A53 ARM

GEC6818 —>一个开发板的名字
S5P6818 —>三星的一款处理器芯片的名字。
Cortex-A53—>S5P6818处理采用的ARM内核。64bits 8核的处理器。
ARM—>是一种处理器的架构。

概括的说启动的过程:
硬件上电—>运行S5P6818内部的boot—>调用eMMC中的u-boot—>加载eMMC的linux内核—>挂载eMMC中的根文件系统—>运行应用程序

嵌入式linux系统由:uboot + kernel + filesystem(rootfs) 三部分组成

从打印日志入手 熟悉启动过程

CPU处理器内部的boot

 Second Boot by Nexell Co. : Ver0.3.6 - Built on Jun 12 2015 20:06:08 NSIH : Ver0.0.xxDDR3 POR Init Start 0
phy init
Lock value  = 186
GATE CYC    = 0x00000492
GATE CODE   = 0x00000000
Read  DQ    = 0x08080808
Write DQ    = 0x08080808DDR3 Init Done!  (初始化DDR)
CCI Init!
Wakeup CPU Wakeup CPU 1234567
CPU Wakeup done! WFI is expected.
CPU0 is Master!Loading from sdmmc...(sdmmc为存储结构 )Image Loading Done!
Launch to 0x0000000043C00000
)

1.执行u-boot程序

嵌入式linux平台开机uboot部分log:

U-Boot 2014.07 (Apr 27 2017 - 15:45:25)    -->这里为uboot版本PLL : [0] =  800000000, [1] =  800000000, [2] =  780000000, [3] =  800000000
(0) PLL1: CPU  FCLK =  800000000, HCLK = 200000000 (G0)
(7) PLL1: CPU  FCLK =  800000000, HCLK = 200000000 (G1)
(2) PLL3: MEM  FCLK =  800000000, DCLK = 800000000, BCLK = 400000000, PCLK = 200000000
(1) PLL0: BUS  BCLK =  400000000, PCLK = 200000000
(8) PLL0: CCI4 BCLK =  400000000, PCLK = 200000000
(3) PLL0: G3D  BCLK =  400000000
(4) PLL0: CODA BCLK =  400000000, PCLK = 200000000
(5) PLL0: DISP BCLK =  400000000, PCLK = 200000000
(6) PLL0: HDMI PCLK =  133333333
I2C:   ready
DRAM:  1 GiB
Heap = 0x44000000~0x46000000
Code = 0x43c00000~0x43c83e48
GLD  = 0x43bffeb8
GLBD = 0x43bffe68
SP   = 0x43bffe68,0x43bffe48(CURR)
PC   = 0x43c06640
TAGS = 0x40000100
PAGE = 0x43c90000~0x43c9c000
MACH = [4330]
VER  = 0
BOARD= [x6818]
//uboot主要作用为搭建c运行环境并加载内核镜像Image Name:   Linux-3.4.39-gecImage Type:   ARM Linux Kernel Image (uncompressed)Data Size:    5533816 Bytes = 5.3 MiBLoad Address: 40008000Entry Point:  40008000Verifying Checksum ... OKLoading Kernel Image ... OKStarting kernel ...   --->此处后为kernel log

2.加载linux内核

嵌入式linux平台开机kernel部分log:

[    0.000000] Booting Linux on physical CPU 0    -->CPU指针从地址0开始
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.4.39-gec (gec@ubuntu) (gcc version 4.8 (GCC) ) #3 SMP PREEMPT Thu Jan 25 14:47:54 CST 2018  -->内核镜像版本
[    0.000000] Initialized persistent memory from 635fc000-635fffff
[    0.000000] CPU : iomap[ 0]: p 0xc0000000 -> v 0xf0000000 len=0x300000
[    0.000000] CPU : iomap[ 1]: p 0xe0000000 -> v 0xf0300000 len=0x100000
[    0.000000] CPU : iomap[ 2]: p 0xfff00000 -> v 0xf0400000 len=0x100000
[    0.000000] CPU : iomap[ 3]: p 0x2c000000 -> v 0xf0500000 len=0x100000
[    0.000000] CPU : iomap[ 4]: p 0x00000000 -> v 0xf0600000 len=0x100000
[    0.000000] CPU : DMA Zone Size =16M, CORE 8
[    0.000000] GEC6818 : done board initialize ...

3.挂载rootfs

[    2.571000] EXT4-fs (mmcblk0p2): recovery complete  --》 ext4位filesystem文件系统的格式
[    2.574000] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    2.578000] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    2.584000] devtmpfs: mounted
[    2.587000] Freeing init memory: 244K
[    2.591000] Write protecting the kernel text section c0008000 - c0a1d000
[    2.598000] rodata_test: attempting to write to read-only section:
[    2.603000] write to read-only section trapped, success
[    2.749000] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered

4.加载完后 进入终端(命令输入行)

类似:

[root@GEC6818 /]#

测试文件系统已搭建完成,环境变量 以及 可执行的命令 busybox工具箱 都已准备就绪,所以此时我们才可以执行我们编译好的程序或者脚本文件

执行一个脚本文件—》 /etc/profile 该脚本在linux平台启动后会执行,可在里面添加执行自己的程序,便可完成开机自启动的功能了。

UBOOT

1.什么是u-boot

U-Boot – the Universal Boot Loader
u-boot是一个通用的bootloader,相当于PC机BIOS,是一个启动引导程序。完成硬件的初始化,并加载操作系统。
uboot是一个裸机程序,不属于linux系统的一部分。
"通用"的含义:
1)支持多种处理器的架构:ARM、x86、MIPS、PowerPC、…
2)引导多种操作系统:linux、WinCE、Vxworks、…
3)支持多种开发板…

其他的bootloader:vivi,redboot,…

2、uboot是开源的,免费的

官方地址如下:

http://www.denx.de/wiki/U-Boot/WebHome
ftp://ftp.denx.de/pub/u-boot/

3、u-boot作用

1)boot: 初始化硬件

(1)stage1 (start.S ARM汇编编写的代码)CPU级的初始化:处理器时钟,UART,DDR3,eMMC,watchdog,interrupt、....(2)stage2(board.c--start_arm_boot())BOARD级的初始化:LCD、网卡、USB、IIC、......

2)加载操作系统—linux内核(在eMMC上开始加载linux内核镜像)

uboot启动到最后,有一个倒计时,如果在倒计时的时间没有进入的uboot的命令行。执行一个boot的启动命令:
X6818# printenv
bootcmd=ext4load mmc(8G) 2:1 0x48000000 uImage;bootm 0x48000000
分析:
(1)linux内核uImage映像文件放在MMC2控制所接的电子硬盘eMMC的第一个分区上。使用ext4文件系统格式去加载uImage
(2)将uImage拷贝到0x48000000地址上。DDR3(1GB):0x4000_0000~0x7FFF_FFFF
(3)从0x48000000地址开始启动linux内核的映像文件—uImage

3)uboot提供一些工具

在进入kernel前,也就是start kernel log前任意键盘输入 可将系统暂留在uboot,uboot也有所谓的终端 及输入命令的地方

uboot一些命令解析

X6818# ?
0       - do nothing, unsuccessfully
1       - do nothing, successfully
?       - alias for 'help'
base    - print or set address offset
bdinfo  - print Board Info structure
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootm   - boot application image from memory
bootp   - boot image via network using BOOTP/TFTP protocol
cmd     - cmd [command] options...
cmp     - memory compare
cp      - memory copy
crc32   - checksum calculation
dhcp    - boot image via network using DHCP/TFTP protocol
drawbmp - darw bmpfile on address 'addr' to framebuffer
env     - environment handling commands
exit    - exit script
ext4load- load binary file from a Ext4 filesystem
ext4ls  - list files in a directory (default /)
ext4write- create a file in the root directory
fastboot- fastboot- use USB Fastboot protocolfatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fatwrite- write file into a dos filesystem
fdisk   - mmc list or create ms-dos partition tables (MAX TABLE 7)
go      - start application at address 'addr'
goimage - start Image at address 'addr'
help    - print command description/usage
i2c     - I2C sub-system
i2cmod  - set I2C mode
iminfo  - print header information for application image
loadbmp - load bmpfile with command or 'bootlog' environment
loop    - infinite loop on address range
md      - memory display
mdio    - MDIO utility commands
mii     - MII utility commands
mm      - memory modify (auto-incrementing address)
mmc     - MMC sub system
mmcinfo - display MMC info
mtest   - simple RAM read/write test
mw      - memory write (fill)
nm      - memory modify (constant address)
ping    - send ICMP ECHO_REQUEST to network host
pmic    - PMIC
printenv- print environment variables
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
saveenv - save environment variables to persistent storage
sdfuse  - sdfuse  - read images from FAT partition of SD card and write them to booting device.setenv  - set environment variables
showvar - print local hushshell variables
source  - run script from memory
test    - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
udown   - Download USB
update_mmc- update mmc dataversion - print monitor, compiler and linker version

4、u-boot工具(命令)

1)X6818# bdinfo
arch_number = 0x000010EA
boot_params = 0x40000100
DRAM bank   = 0x00000000
-> start    = 0x40000000
-> size     = 0x40000000
eth0name    = dwmac.c0060000
ethaddr     = 00:e2:1c:ba:e8:60
current eth = dwmac.c0060000
ip_addr     = 192.168.6.3
baudrate    = 115200 bps
TLB addr    = 0x7FFF0000
relocaddr   = 0x46000000
reloc off   = 0x00000000
irq_sp      = 0x7DF6BF00
sp start    = 0x43BFFE68

其中uboot有环境变量的配置

2)X6818# printenv
androidcrc=-411152780
baudrate=115200
bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4
bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000
bootdelay=5
bootfile=uImage
ethact=dwmac.c0060000
ethaddr=00:e2:1c:ba:e8:60
ethprime=RTL8211
fastboot=flash=mmc,2:ubootpak:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd:0x200,0x4000;flash=mmc,2:bootloader:boot:0x8000,0x70000;flash=mmc,2:boot:ext4:0x00100000,0x04000000;flash=mmc,2:system:ext4:0x04100000,0x2F200000;flash=mmc,2:cache:ext4:0x33300000,0x1AC00000;flash=mmc,2:misc:emmc:0x4E000000,0x00800000;flash=mmc,2:recovery:emmc:0x4E900000,0x01600000;flash=mmc,2:userdata:ext4:0x50000000,0x0;
filesize=41ee8
gatewayip=192.168.6.1
ipaddr=192.168.6.3
netmask=255.255.255.0
qtcrc=7688447
serverip=192.168.6.5
stderr=serial
stdin=serial
stdout=serialEnvironment size: 860/32764 bytes
3)配置开发板的IP地址
#setenv ipaddr 192.168.150.31
#setenv serverip 192.168.150.32
#setenv gatewayip 192.168.150.1
#saveenv4)X6818# ping 192.168.150.32
Speed: 1000, full duplex
Using dwmac.c0060000 device
host 192.168.150.32 is alive
X6818#

linux内核

1、linux内核的组成

1)进程管理和进程通信:进程的创建,进程的调度(抢占/时间片)、进程通信
2)内存管理
3)文件系统(虚拟文件系统)—设备驱动
4)网络协议(TCP/IP)
5)设备驱动

2.linux内核源码的结构

gec@ubuntu:~/6818GEC/kernel$ ls

Linux_SDK 目录介绍
目录:

├── linux_sdk
│   ├── app
│   ├── buildroot                                               根文件系统的编译目录
│   ├── build.sh -> device/rockchip/common/build.sh              全自动编译脚本
│   ├── device                                                   编译相关配置文件
│   ├── distro debian                                            根文件系统生成目录
│   ├── docs                                                     文档
│   ├── envsetup.sh -> buildroot/build/envsetup.sh
│   ├── external                                                第三方软件工具集
│   ├── kernel                                                   内核
│   ├── Makefile -> buildroot/build/Makefile
│   ├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh    rockdev链接更新脚本
│   ├── prebuilts                                                交叉编译工具
│   ├── rkbin                                                        存放RK平台执行文件
│   ├── rkflash.sh -> device/rockchip/common/rkflash.sh          烧写脚本
│   ├── rootfs                                                  根文件系统编译目录
│   ├── tools                                                    烧写、打包工具
│   └── u-boot                                                bootloader;构建硬件环境、c运行环境

3.内核的官网

https://www.kernel.org/
最好去处理器的官网上下载uboot,linux源码。

rootfs文件系统

1.什么是rootfs

linux内核启动后,通过VFS(虚拟文件系统)去挂载硬盘中的一个文件系统,这个文件系统是linux挂载的第一个文件系统,这个文件系统会挂载到linux的"/"(根)目录下
这个文件系统就叫根文件系统或rootfs

rootfs也有文件的格式:ext4. yaffs/yaffs2、、、

rootfs的内容不是一个应用程序,是一个“包”,里面包含linux shell命令、linux的工具、设备文件、执行应用程序使用的动态库、应用程序、linux系统的配置信息…

一些根目录下的目录定义

1)bin
---->常见的linux shell命令和工具

2)dev
---->设备文件–linux应用程序访问驱动程序的路径

3)etc
[root@GEC6818 ~]#ls /etc
fstab hosts issue passwd profile.d services
group init.d mdev.conf pointercal protocols
hostname inittab mtab profile resolv.conf
---->linux系统的配置文件

4)lib
---->linux系统运行应用程序的时候,使用的动态库。

5)linuxrc
[root@GEC6818 /]#ls linuxrc -l
lrwxrwxrwx 1 root root 11 Dec 27 2016 linuxrc -> bin/busybox

busybox—是linux系统中的一个百宝箱—>linux的shell命令和工具。
busybox也是一个免费、开源的源码包,经过交叉编译,会生成嵌入式linux系统所使用的shell命令。

https://blog.csdn.net/baijinglei12/article/details/40454555

6)mnt
[root@GEC6818 /]#ls /mnt/
sd udisk
---->linux系统的挂载点

提示:插入U盘后

[root@GEC6818 /]#ls /dev/sda* -l
brw-rw-rw-    1 root     root        8,   0 Jan  1 00:55 /dev/sda
brw-rw-rw-    1 root     root        8,   1 Jan  1 00:55 /dev/sda1

查看当前系统分区结构

[root@GEC6818 /]#cat /proc/partitions
major minor  #blocks  name179        0    7634944 mmcblk0179        1      65536 mmcblk0p1179        2     772096 mmcblk0p2179        3     438272 mmcblk0p3179        4          1 mmcblk0p4179        5       8192 mmcblk0p5179        6      22528 mmcblk0p6179        7    6324224 mmcblk0p7179       16       4096 mmcblk0boot1179        8       4096 mmcblk0boot08        0   15109421 sda8        1   15108880 sda1

挂载U盘

[root@GEC6818 /]#mkfs.vfat /dev/sda1[root@GEC6818 /]#mount -t vfat /dev/sda1 /data

卸载u盘

[root@GEC6818 /]#umount /data

7)proc
------>linux系统的工作状态信息,实时反映的。
每个进程的工作状态、CPU信息、linux内核版本、中断信息,内存信息,启动时间、…

8)root
root用户的家目录

9)sbin
----有管理员权限的linux shell命令和工具

10)sys
----linux设备驱动的详细信息

11)tmp
----临时文件

12)usr

[root@GEC6818 /]#ls /usr
bin    lib    local  sbin   share

bin和sbin---->用户的工具和shell命令
lib----用户的动态库

[root@GEC6818 /]#ls /usr/local/Qt-Embedded-5.7.0/
bin           lib           qml
examples      plugins       translations[root@GEC6818 /]#ls /usr/share/
fonts   udhcpc

13)var
linux系统的工作日志

驱动开发基础知识必修-(一)嵌入式开发板的启动过程相关推荐

  1. linux课程_【课程完结】嵌入式Linux应用/驱动开发基础知识两大篇章已全部录制完毕 共72集...

    完结撒花 <第四篇嵌入式Linux应用开发基础知识> <第五篇嵌入式Linux驱动开发基础知识> 两大篇章已全部录制完毕 共计 72 集 01 嵌入式Linux应用开发基础知识 ...

  2. iOS开发基础知识--碎片44

    iOS开发基础知识--碎片44  iOS开发基础知识--碎片44 1:App跳转至系统Settings 跳转在IOS8以上跟以下是有区别的,如果是IOS8以上可以如下设置: NSURL *url = ...

  3. iOS开发基础知识--碎片37

    iOS开发基础知识--碎片37 iOS开发基础知识--碎片37 iOS开发基础知识--碎片37 1:iOS 使用NJKWebViewProgress做webview进度条 引入头文件: #import ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  5. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型

    文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...

  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离

    文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...

最新文章

  1. 【网络安全】2022年第一次靶场渗透实战学习
  2. python建立虚拟环境不成功_virtualenv 创建虚拟环境不成功
  3. oracle创建一个学生,oracle 创建学生选课视图
  4. “出题老师”超全划重点,赛场高分必备干货!
  5. vs 编译设置obj路径_编译、连接
  6. docker学习(三) 安装docker的web可视化管理工具
  7. 书单|互联网企业面试案头书之程序员技术篇
  8. mysql中cost对比测试
  9. wxpython grid设置字体颜色_Ext grid改变行背景颜色 和改变行字体颜色
  10. Layout Management
  11. 2021-09-09二叉树的最大深度, 深度优先搜索
  12. 移动DDN专线及联通SDH专线接入路由器及防火墙配置实例
  13. GoogleNet论文解读
  14. 如何安装Chrome扩展程序或插件
  15. 搜狗双拼如何打单韵母字
  16. 深入浅出实时数据库12.8日版
  17. 做外贸用哪个企业邮箱比较好?大容量外贸企业邮箱哪家好?
  18. 【论文导读】- Cluster-driven Graph Federated Learning over Multiple Domains(聚类驱动的图联邦学习)
  19. 令人头秃的集训第三周学习记录(练习题+感悟)
  20. 笨方法学习Python 习题19 函数和变量 ---学习记录

热门文章

  1. 如何用微信朋友圈引起客户注意?
  2. arma3自定义服务器,《绝地求生》自定义服务器要收费?类似《武装突袭3》
  3. HTML5 form表单 调查问卷制作
  4. JS中将对象转化为数组,数组转对象
  5. 3D视觉检测:智能工业机器人从平面到立体的“视界”升级
  6. http://www.dewen.net.cn/q/13558/100阶乘
  7. zuk z2刷机android p,ZUK Z2121 (Z2 Pro 全网通)一键刷机教程,简单几步刷机
  8. 参加计算机社团的英语作文,参加社团的英语作文短文欣赏
  9. 十五”期间广东职业教育发展概况
  10. python-匹配手机号-按号段-正则