一、启动过程
开发板:上电(复位) -> uboot -> 加载linux内核 > 挂载根文件系统 > 执行应用程序
笔记本电脑:上电(复位) > 主板的bios > 加载winnt内核 > 挂载文件系统(ntfs)> 执行应用程序
二、uboot
1、什么是uboot
uboot其实就是一个通用的引导程序——bootloader。
boot,完成硬件的初始化,启动硬件平台
loader,初始化硬件后,加载操作系统。
支持各种硬件,例如支持ARM、MIPS、X86、AVR32、RISC-V架构…
支持各种操作系统,例如支持WinCE、Linux内核、安卓操作系统…
2、uboot的作用
1)第一阶段初始化,CPU的初始化,用汇编语言来编写,初始化cache、MMU、时钟、看门狗、DDR3、eMMC…
2)第二阶段初始化,板级的初始化,一般来说用C语言来编写,初始化串口、网卡、usb、lcd…
3)提供了很多工具,进入uboot命令行,使用uboot的命令
4)加载操作系统
3、uboot的输出信息
u-Boot 2014.07 (Nov 19 2017 - 09:52:45)
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 = 0x43c066f0
TAGS = 0x40000100
PAGE = 0x43c90000~0x43c9c000
MACH = [4330]
VER = 0
BOARD= [GEC6818]
MMC: NXP DWMMC: 0, NXP DWMMC: 1, NXP DWMMC: 2
In: serial
Out: serial
Err: serial
## DCDC_MODE(0x80): DCDC1[PFM], DCDC2[PFM], DCDC3[PFM], DCDC4[PWM], DCDC5[PWM]
## STATUS(0x00) : 0xe4 0x10
## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00
## CHG_TYPE : ADP
## BAT_VOL : 0mV
## BAT_CAP : 100%
DONE: Logo bmp 300 by 300 (3bpp), len=270056
DRAW: 0x47000000 -> 0x46000000
DONE: Logo bmp 300 by 300 (3bpp), len=270056
DRAW: 0x47000000 -> 0x46000000
RGB: display.0
MIPI: display.0
DSIM_ESCMODE 1 : 0xc0
DSIM_STATUS : 0x10010f
MIPI clk: 420MHz
DSIM_ESCMODE 2 : 0x0
DSIM_STATUS : 0x10010f
## Skip BAT Animation.
## IRQ(0x48) : 0x00 0x00 0x00 0x00 0x00
## chg_type : ADP
## battery_vol : 0mV
## Booting
Card did not respond to voltage select!
Net: GEC6818 mac init...
dwmac.c0060000
Hit any key to stop autoboot: 0
GEC6818#
1)开发板信息
GEC6818# bdinfo
arch_number = 0x000010EA //uboot针对具体硬件平台的ID,若跟linux内核ID不一致,不能启动内核
boot_params = 0x40000100 //uboot传递给内存启动参数的地址
DRAM bank = 0x00000000 //内存通道0
-> start = 0x40000000 //内存的起始地址
-> size = 0x40000000 //内存的大小为1GB
eth0name = dwmac.c0060000 //网卡的名字
ethaddr = 00:e2:1c:ba:e8:60 //网卡的MAC地址信息
current eth = dwmac.c0060000 //当前所使用的网卡
ip_addr = 192.168.114.5 //网卡的IP地址
baudrate = 115200 bps //串口波特率
TLB addr = 0x7FFF0000 //页表缓存地址(TLB:Translation Lookaside Buffer)
relocaddr = 0x46000000 //uboot在内存中的起始地址
reloc off = 0x00000000 //uboot在内存中的起始地址中的偏移值
irq_sp = 0x7DF6BF00
sp start = 0x43BFFE68
注:
\quad
TLB具有固定数目的空间槽,用于存放将虚拟地址映射至物理地址的标签页表条目。TLB可介于 CPU 和CPU缓存之间,或在 CPU 缓存和主存之间,这取决于缓存使用的是物理寻址或是虚拟寻址。如果缓存是虚拟定址,定址请求将会直接从 CPU 发送给缓存,然后从缓存访问所需的 TLB 条目。如果缓存使用物理定址,CPU 会先对每一个存储器操作进行 TLB 查寻,并且将获取的物理地址发送给缓存。
2)查看uboot的环境变量,只要是环境变量,都可以进行自定义
printenv
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:GECuboot:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd:0x200,0x4000;flash=mmc,2:bo
filesize=41ee8
gatewayip=192.168.114.1
ipaddr=192.168.114.5
netmask=255.255.255.0
qtcrc=-314709120
serverip=192.168.114.2
stderr=serial
stdin=serial
stdout=serial
3)bootargs,启动参数
bootargs=lcd=at070tn92 tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4
- lcd=at070tn92,液晶屏的型号,7英寸的800*480的屏幕
- tp=gslx680-linux,触摸屏的型号
- root=/dev/mmcblk0p2,根文件系统在哪里,告诉内核去哪里挂载根文件系统。
- mmcblk0p2
- mmcblk0,emmc电子硬盘0
- p2,partion2,emmc电子硬盘0的分区2
- rw,该文件系统可读可写。
- rootfstype=ext4,该文件系统类型为ext4(ext2/ext3,fat32,ntfs)。
4)启动命令
bootcmd=ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000
\quad
以ext4文件系统去emmc第2个存储设备
中第1个分区
加载uImage linux内核镜像,加载到内存地址0x48000000;然后在该地址0x48000000启动linux内核。
这条命令告诉uboot启动完之后,要干什么动作,通过bootcmd命令进行了解。
brw-rw---- 1 root root 179, 0 Jan 1 1970 mmcblk0
brw-rw---- 1 root root 179, 8 Jan 1 1970 mmcblk0boot0 //第0个存储设备
brw-rw---- 1 root root 179, 16 Jan 1 1970 mmcblk0boot1 //第1个存储设备
brw-rw---- 1 root root 179, 1 Jan 1 1970 mmcblk0p1 //第2个存储设备第1个分区,m
brw-rw---- 1 root root 179, 2 Jan 1 1970 mmcblk0p2 //第2个存储设备第2个分区,m
brw-rw---- 1 root root 179, 3 Jan 1 1970 mmcblk0p3
brw-rw---- 1 root root 179, 4 Jan 1 1970 mmcblk0p4
brw-rw---- 1 root root 179, 5 Jan 1 1970 mmcblk0p5
brw-rw---- 1 root root 179, 6 Jan 1 1970 mmcblk0p6
brw-rw---- 1 root root 179, 7 Jan 1 1970 mmcblk0p7
- 例子1
例如uboot启动完毕后,自动通过tftp下载led.bin到内存地址0x40000000并执行,启动命令可修改如下:
setenv bootcmd 'tftp 0x40000000 led.bin;go 0x40000000'
saveenv
5)修改启动延时时间
#setenv bootdelay 3
#saveenv
Saving Environment to MMC...
Writing to MMC(2)... done
6)打印已经存在的环境变量
#printenv
#pri
7)复位开发板
#reset
8)修改本地IP地址
#setenv ipaddr 192.168.11.6
#setenv gatewayip 192.168.11.1
#setenv netmask 255.255.255.0
#saveenv
9)验证网络的通畅
#ping 电脑IP地址
注意:开发板必须通过网线连接到电脑;电脑必须关闭防火墙;电脑不能主动ping开发板,因为uboot默认状态下是关闭了网卡。
ping成功:
# ping 192.168.11.3
Speed: 100, full duplex
Using dwmac.c0060000 device
host 192.168.11.3 is alive
ping失败:
# ping 192.168.11.3
ping failed; host 192.168.11.3 is not alive
失败原因:
1)双方不在同一个网段
2)电脑的防护墙没有完全关闭
10)修改服务器IP地址
#setenv serverip 192.168.11.3
#saveenv
11)删除对应的环境变量,例如删除sap变量
#setenv sap 空格键
#saveenv
12)通过tftp下载文件到内存
使用该命令的时候,要注意网络的配置,关闭电脑的防火墙!
#tftp 内存地址 文件名
# tftp 0x40000000 led.bin
Speed: 100, full duplex
Using dwmac.c0060000 device
TFTP from server 192.168.11.3; our IP address is 192.168.11.6
Filename 'led.bin'.
Load address: 0x40000000
Loading: #
261.7 KiB/s
done
Bytes transferred = 4572 (11dc hex)
13)通过ymodem下载文件到内存
# loady 内存地址
14)执行某地址存在的二进制文件
#go 内存地址
#go 0x40000000
## Starting application at 0x40000000 ...
若想退出当前程序的执行,只能是复位或重新上电!
15)help,支持的命令
# help
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
...........................................
对应的中文翻译
0-不执行任何操作,未成功
1-无所事事,成功
? -'帮助'的别名
base基本-打印或设置地址偏移量
bdinfo-打印板信息结构
boot-引导默认值,即运行'bootcmd'
bootd-引导默认值,即运行'bootcmd'
bootm-从内存启动应用程序映像
bootp-使用BOOTP / TFTP协议通过网络引导映像
cmd-cmd [命令]选项...
cmp-内存比较
cp-内存副本
crc32-校验和计算
dhcp-使用DHCP / TFTP协议通过网络启动映像
drawbmp-地址'addr'上的darw bmpfile到帧缓冲区
env-环境处理命令
退出-退出脚本
ext4load-从Ext4文件系统加载二进制文件
ext4ls-列出目录中的文件(默认/)
ext4write-在根目录中创建文件
fastboot- fastboot-使用USB Fastboot协议
fatinfo-打印有关文件系统的信息
fatload-从DOS文件系统加载二进制文件
fatls-列出目录中的文件(默认/)
fatwrite-将文件写入dos文件系统
fdisk-mmc列出或创建ms-dos分区表(MAX TABLE 7)
go-在地址“ addr”处启动应用程序
goimage-在地址“ addr”处开始图像
帮助-打印命令说明/用法
i2c-I2C子系统
i2cmod-设置I2C模式
iminfo-打印应用程序映像的标题信息
loadbmp-使用命令或“ bootlog”环境加载bmpfile
loop-地址范围上的无限循环
md-内存显示
mdio-MDIO实用程序命令
mii-MII实用程序命令
mm-内存修改(自动递增地址)
MMC-MMC子系统
mmcinfo-显示MMC信息
mtest-简单的RAM读/写测试
MW-内存写入(填充)
nm-内存修改(常量地址)
ping-将ICMP ECHO_REQUEST发送到网络主机
pmic-PMIC
printenv-打印环境变量
reset-执行CPU的重置
run-在环境变量中运行命令
saveenv-将环境变量保存到持久性存储中
sdfuse-sdfuse-从SD卡的FAT分区读取图像并将其写入启动设备。
setenv-设置环境变量
showvar-打印本地Hushshell变量
source-从内存运行脚本
test-最小测试,如/ bin / sh
tftpboot-使用TFTP协议通过网络引导映像
udown-下载USB
update_mmc-更新mmc数据
16)ext4命令族
- ext4ls,列出目录中的文件(默认/)
显示第2个存储区第1个分区
# ext4ls mmc 2:1 /
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 4096 lost+found
230456 battery.bmp
3798425 debug-ramdisk.img
1152054 logo.bmp
1213716 ramdisk-recovery.img
611566 root.img.gz
5598176 uImage
280854 update.bmp
显示第2个存储区第2个分区
# ext4ls mmc 2:2 /
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 4096 lost+found
<DIR> 4096 IOT
<DIR> 4096 bin
<DIR> 4096 dev
<DIR> 4096 driver
<DIR> 4096 etc
<DIR> 4096 lib
<SYM> 11 linuxrc
<DIR> 4096 mnt
<DIR> 4096 proc
<DIR> 4096 root
<DIR> 4096 run
<DIR> 4096 sbin
<DIR> 4096 sys
<DIR> 4096 tmp
<DIR> 4096 usr
<DIR> 4096 var
115441 led_drv.ko
6196 test
6124 led_test
27579 sum_drv.ko
- ext4write,在根目录中创建文件
ext4write mmc 2:1 40000000 /uImage uImage文件大小
三、linux内核
1、内核的作用
1)进程的管理和进程的通信:进程的创建和删除、进程之间优先级抢占、进程的时间片轮转调度、进程间的通信。
2)内存管理:内存分配算法,每个进程的内存空间由Linux进行分配。
3)支持的文件系统,可以通过cat /proc/filesystems
4)设备的管理,聚焦到linux驱动:字符设备、块设备、网络设备、中断、内核时钟。
5)网络协议:TCP/IP。
linux内核的官网:kernal官网
2、输出信息
1)uboot加载内核
## Booting kernel from Legacy Image at 48000000 ...
Image Name: Linux-3.4.39-gec //内核版本,3.4.39,该镜像由gec定制
Image Type: ARM Linux Kernel Image (uncompressed) //镜像类型: ARM Linux 内核镜像(未压缩)
Data Size: 5540912 Bytes = 5.3 MiB //内核镜像的大小5.3MB
Load Address: 40008000 //内核是存储在内存地址空间0x40008000
Entry Point: 40008000 //内核执行的入口地址0x40008000
Verifying Checksum ... OK //校验镜像的内容是否完整
Loading Kernel Image ... OK //若校验成功,则启动内核
Starting kernel ...
2)linux内核启动
[ 0.000000] Booting Linux on physical CPU 0 //它只是用CPU0进行linux启动
3)告诉当前linux内核的版本、使用到的编译器、编译生成时间
[ 0.000000] Linux version 3.4.39-gec (root@ubuntu) (gcc version 4.8 (GCC) ) #9 SMP PREEMPT Sun Nov 19 10:01:10 CST 2017
4)uboot传递给内核的信息,使用lcd、触摸屏是什么型号、串口的配置等信息
[ 0.000000] Kernel command line: console=ttySAC0,115200n8 androidboot.hardware=GEC6818
androidboot.console=ttySAC0 androidboot.serialno=0123456789abcdef initrd=0x49000000,0x1000000 lcd=at070tn92tp=gslx680-linux root=/dev/mmcblk0p2 rw rootfstype=ext4
5)内存管理,构建物理地址与虚拟地址之间的转换
[ 0.000000] Memory: 1024MB = 1024MB total
[ 0.000000] Memory: 810792k/810792k available, 237784k reserved, 272384K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xef800000 - 0xfee00000 ( 246 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xef600000 ( 758 MB)
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0a561c8 (10553 kB)
[ 0.000000] .init : 0xc0a57000 - 0xc0a94100 ( 245 kB)
[ 0.000000] .data : 0xc0a96000 - 0xc0b307b0 ( 618 kB)
[ 0.000000] .bss : 0xc0b307d4 - 0xc0d10508 (1920 kB)
[ 0.000000] .bss : 0xc0b307d4 - 0xc0d10508 (1920 kB)
[ 0.000000] SLUB: Genslabs=11, HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
6)设备管理,初始化各种硬件(gpio、串口、i2c、网络硬件、usb…),加载各个硬件的驱动
[ 0.000000] GIC @f0009000: start 0 (gic 31)
[ 0.000000] GPIO @f001a000: start 106, mask 0xffffffff (gpio 85)
[ 0.000000] GPIO @f001b000: start 138, mask 0xffffffff (gpio 86)
[ 0.000000] GPIO @f001c000: start 170, mask 0xffffffff (gpio 87)
[ 0.000000] GPIO @f001d000: start 202, mask 0xffffffff (gpio 88)
[ 0.000000] GPIO @f001e000: start 234, mask 0xffffffff (gpio 89)
[ 0.000000] ALIVE @f0010800: start 266, mask 0x000000ff (alive 36, num 6)
[ 0.209000] i2c-gpio i2c-gpio.0: using pins 99 (SDA) and 98 (SCL)
[ 0.209000] i2c-gpio i2c-gpio.1: using pins 101 (SDA) and 100 (SCL)
[ 0.209000] i2c-gpio i2c-gpio.3: using pins 80 (SDA) and 79 (SCL)
[ 0.211000] s3c-i2c s3c2440-i2c.2: i2c-2: S3C I2C adapter
[ 0.211000] s3c-i2c s3c2440-i2c.2: slave address 0x10
[ 0.211000] s3c-i2c s3c2440-i2c.2: bus frequency set to 195 KHz
[ 0.211000] Linux media interface: v0.10
[ 0.212000] Linux video capture interface: v2.00
[ 0.218000] axp_mfd 3-0034: AXP (CHIP ID: 0x06) detected
[ 0.309000] Advanced Linux Sound Architecture Driver Version 1.0.25.
[ 0.309000] Bluetooth: Core ver 2.16
[ 0.310000] NET: Registered protocol family 31
[ 0.310000] Bluetooth: HCI device and connection manager initialized
[ 0.310000] Bluetooth: HCI socket layer initialized
7)挂载根文件系统
[ 3.967000] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 3.969000] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 3.976000] devtmpfs: mounted
8)执行脚本文件
/etc/profile
/etc/init.d/rcS
9)进入命令行
[root@GEC6818 /]#
四、根文件系统
1、概述
\quad linux内核挂载的第一个文件系统,该根文件系统是挂载到根目录下的文件系统。rootfs,它是一个容器,也称之为一个“包”,里面包含:
[root@GEC6818 /]#ls
bin sbin usr etc lib home mnt proc var dev ......
1) linux的shell命令
/bin,一般的shell命令
/sbin,超级管理员就是root用户才能够使用的命令,这些命令很多时候跟硬件相关
/usr/bin,应用程序与工具
/usr/sbin,shell命令或工具
2) /dev (重要)
\quad 该目录包含应用程序访问硬件的接口,只有字符设备和块设备有设备文件,网络设备是没有设备文件(兼容POSIX)。
- lcd设备,/dev/fb0
- 触摸屏设备, /dev/input/event0
3)/etc
包含系统的配置文件:用户名、密码、主机名、网络配置、系统
4)/proc (重要)
\quad 该目录虚拟文件系统目录,是系统内存的映射,实时反映linux系统的工作状态,可直接访问这个目录来获取系统信息。类似于任务管理器/设备管理器。
- 数字,PID进程编号与状态信息
- version,linux系统的版本
[root@GEC6818 /proc]#uname -r
3.4.39-gec
[root@GEC6818 /proc]#uname -a
Linux GEC6818 3.4.39-gec #9 SMP PREEMPT Sun Nov 19 10:01:10 CST 2017 armv7l GNU/Linux
[root@GEC6818 /proc]#cat version
Linux version 3.4.39-gec (zr@boLe) (gcc version 4.8 (GCC) ) #9 SMP PREEMPT Sun Nov 19 10:01:10 CST
- cpuinfo,了解CPU的信息
[root@GEC6818 /proc]#cat cpuinfo
Processor : ARMv7 Processor rev 3 (v7l) //当前CPU是ARMv7架构
processor : 0 //CPU 0
BogoMIPS : 1581.05 //每秒能够执行1581.04百万条指令
processor : 1
BogoMIPS : 1591.29
processor : 2
BogoMIPS : 1591.29
processor : 3
BogoMIPS : 1591.29
processor : 4
BogoMIPS : 1591.29
processor : 5
BogoMIPS : 1591.29
processor : 6
BogoMIPS : 1591.29
processor : 7
BogoMIPS : 1591.29
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 3
Hardware : s5p6818
Revision : 0000
Serial : 0000000000000000
- meminfo,这里描述linux内核所有内存状态信息
[root@GEC6818 /proc]#cat meminfo
MemTotal: 827420 kB
MemFree: 803992 kB
Buffers: 1524 kB
Cached: 2736 kB
SwapCached: 0 kB
Active: 1384 kB
Inactive: 2992 kB
Active(anon): 224 kB
Inactive(anon): 0 kB
Active(file): 1160 kB
Inactive(file): 2992 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 272384 kB
HighFree: 268364 kB
LowTotal: 555036 kB
LowFree: 535628 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 232 kB
Mapped: 800 kB
Shmem: 0 kB
Slab: 10184 kB
SReclaimable: 3776 kB
SUnreclaim: 6408 kB
KernelStack: 736 kB
PageTables: 64 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 413708 kB
Committed_AS: 1096 kB
VmallocTotal: 251904 kB
VmallocUsed: 8280 kB
VmallocChunk: 235520 kB
- devices文件
前面数字为主设备号
[root@GEC6818 /proc]#cat devices
Character devices:
1 mem
5 /dev/tty
5 /dev/console
5 /dev/ptmx
5 ttyprintk
10 misc
13 input
14 sound
21 sg
29 fb
81 video4linux
86 ch
89 i2c
108 ppp
116 alsa
128 ptm
136 pts
153 spi
166 ttyACM
180 usb
188 ttyUSB
189 usb_device
204 ttySAC
216 rfcomm
244 stepmotor
245 roccat
246 BaseRemoteCtl
247 ttyGS
248 usbmon
249 bsg
250 iio
251 ptp
252 pps
253 media
254 rtc
Block devices:
259 blkext
7 loop
8 sd
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
254 device-mapper
5)库的路径
/lib
/usr/lib
/usr/local/lib
6)/mnt
\quad 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。
7)/sys (重要)
\quad
sysfs是一种基于ram文件系统(ramdisk 文件系统基于磁盘模拟技术,实际文件系统是ex2 ex3等)和proc一样。sysfs文件系统是一个类似于proc文件系统的特殊文件系统
,用于将系统中的设备组织成层次结构(类似于Windows的设备管理器),并向用户模式程序提供详细的内核数据结构信息。其实,就是在用户态可以通过对sys文件系统的访问,来看内核态的一些驱动或者设备等,例如以下触摸屏设备驱动详细信息。
[root@GEC6818 /sys/devices/virtual/rc/rc0/input1/event0]#cat uevent
MAJOR=13
MINOR=64
DEVNAME=input/event0
拓展:
- /sys/devices
\quad
该目录下是全局设备结构体系
,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外即platform devices和system devices。
\quad
platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;
\quad
system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。
\quad
/sys/devices是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的最重要的目录结构。
- /sys/dev
\quad 该目录下存放主次设备号文件,其中分成字符设备、块设备的主次设备号码(major:minor)组成的文件名,该文件是链接文件并且链接到其真实的设备(/sys/devices)。
- /sys/class
\quad 该目录下包含所有注册在kernel里面的设备类型,这是按照设备功能分类的设备模型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下都是这种设备类型的各种具体设备的符号链接,这些链接指向/sys/devices/下的具体设备。 设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型(如何触摸屏包含了输入子系统设备模型、i2c设备模型、platform模型等);一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。
- /sys/block
该目录下的所有子目录代表着系统中当前被发现的所有块设备。 - /sys/bus
该目录下的每个子目录都是kernel支持并且已经注册了的总线类型。 - /sys/fs
按照设计,该目录使用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。 - /sys/kernel
这个目录下存放的是内核中所有可调整的参数。 - /sys/module
该目录下有系统中所有的模块信息,不论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件),都可能出现在/sys/module中。
7)/var
系统的工作日志或运行时需要改变数据文件的存放目录。
8)/usr
\quad
系统资源目录
,Unix System Resource,即Unix系统资源
的缩写。该目录是系统核心所在,包含了所有的共享文件。它是 unix 系统中最重要的目录之一,涵盖了二进制文件,各种文档,各种头文件,还有各种库文件;还有诸多程序,例如 ftp,telnet 等等。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。
- /usr/bin 众多的应用程序
- /usr/sbin 超级用户的一些管理程序
- /usr/doc linux文档
- /usr/include linux下开发和编译应用程序所需要的头文件
- /usr/lib 常用的动态链接库和软件包的配置文件
- /usr/man 帮助文档
- /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
- /usr/local/bin 本地增加的命令
- /usr/local/lib 本地增加的库
9)/lost+found
\quad
这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下*.chk)就在这里
五、开发板自启动执行应用程序
linux内核启动完之后,会自动执行以下两个脚本文件:
- /etc/init.d/rcS
- /etc/profile
六、内核源码启动过程【拓展】
1./arch/arm/kernel/head.S
/*
* Kernel startup entry point.
* ---------------------------
*
* This is normally called from the decompressor code. The requirements
* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
* r1 = machine nr, r2 = atags or dtb pointer.
*
* This code is mostly position independent, so if you link the kernel at
* 0xc0008000, you call this at __pa(0xc0008000).
*
* See linux/arch/arm/tools/mach-types for the complete list of machine
* numbers for r1.
*
* We're trying to keep crap to a minimum; DO NOT add any machine specific
* crap here - that's what the boot loader (or in extreme, well justified
* circumstances, zImage) is for.
*/
.arm
__HEAD
ENTRY(stext)
THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM.
THUMB( bx r9 ) @ If this is a Thumb-2 kernel,
THUMB( .thumb ) @ switch to Thumb now.
THUMB(1: )
setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
@ and irqs disabled
mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10, r5 @ invalid processor (r5=0)?
THUMB( it eq ) @ force fixup-able long branch encoding
beq __error_p @ yes, error 'p'
#ifdef CONFIG_ARM_LPAE
mrc p15, 0, r3, c0, c1, 4 @ read ID_MMFR0
and r3, r3, #0xf @ extract VMSA support
cmp r3, #5 @ long-descriptor translation table format?
THUMB( it lo ) @ force fixup-able long branch encoding
blo __error_p @ only classic page table format
#endif
#ifndef CONFIG_XIP_KERNEL
adr r3, 2f
ldmia r3, {r4, r8}
sub r4, r3, r4 @ (PHYS_OFFSET - PAGE_OFFSET)
add r8, r8, r4 @ PHYS_OFFSET
#else
ldr r8, =PHYS_OFFSET @ always constant in this case
#endif
/*
* r1 = machine no, r2 = atags or dtb,
* r8 = phys_offset, r9 = cpuid, r10 = procinfo
*/
bl __vet_atags
#ifdef CONFIG_SMP_ON_UP
bl __fixup_smp
#endif
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
bl __fixup_pv_table
#endif
bl __create_page_tables
/*
* The following calls CPU specific code in a position independent
* manner. See arch/arm/mm/proc-*.S for details. r10 = base of
* xxx_proc_info structure selected by __lookup_processor_type
* above. On return, the CPU will be ready for the MMU to be
* turned on, and r0 will hold the CPU control register value.
*/
ldr r13, =__mmap_switched @ address to jump to after
@ mmu has been enabled
adr lr, BSYM(1f) @ return (PIC) address
mov r8, r4 @ set TTBR1 to swapper_pg_dir
ARM( add pc, r10, #PROCINFO_INITFUNC )
THUMB( add r12, r10, #PROCINFO_INITFUNC )
THUMB( mov pc, r12 )
1: b __enable_mmu
ENDPROC(stext)
.ltorg
#ifndef CONFIG_XIP_KERNEL
2: .long .
.long PAGE_OFFSET
#endif
2./arch/arm/kernel/head-common.S
/*
* The following fragment of code is executed with the MMU on in MMU mode,
* and uses absolute addresses; this is not position independent.
*
* r0 = cp#15 control register
* r1 = machine ID
* r2 = atags/dtb pointer
* r9 = processor ID
*/
__INIT
__mmap_switched:
adr r3, __mmap_switched_data
ldmia r3!, {r4, r5, r6, r7}
cmp r4, r5 @ Copy data segment if needed
1: cmpne r5, r6
ldrne fp, [r4], #4
strne fp, [r5], #4
bne 1b
mov fp, #0 @ Clear BSS (and zero fp)
1: cmp r6, r7
strcc fp, [r6],#4
bcc 1b
ARM( ldmia r3, {r4, r5, r6, r7, sp})
THUMB( ldmia r3, {r4, r5, r6, r7} )
THUMB( ldr sp, [r3, #16] )
str r9, [r4] @ Save processor ID
str r1, [r5] @ Save machine type
str r2, [r6] @ Save atags pointer
bic r4, r0, #CR_A @ Clear 'A' bit
b start_kernel @ 跳转到start_kernel函数(位置:init/main.c)
3.kernel/init/main.c
asmlinkage void __init start_kernel(void)
{
}