天嵌 ARM开发社区

 找回密码
 注册
查看: 2412|回复: 0

rcS内容分析(1)转

[复制链接]
a1154870074 发表于 2015-5-4 10:23:07 | 显示全部楼层 |阅读模式
etc/init.d/rcS内容分析(1)2010年08月20日 8:42
        由于init=/linuxrc,因此,在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc,而这是一个指向/bin/busybox 的链接,也就是说,系统起来后运行的第一个程序就是busybox本身。                 

        busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数)。而事实上,root_qtopia中并没有/etc/inittab这个配置文件,根据busybox的裸机,它将生成默认的配置。其中最重要的一个,就是new_init_action(SYSINIT,INIT_SCRIPT,""),也就决定了接下来初始化的脚本是INIT_SCRIPT所定义的值,这个宏的默认值是"etc/init.d/rcS"。

        下面是文件系统中/etc/init.d/rcS的内容,也是我们要分析的重点

1.PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

2.runlevel=S

3.prevlevel=N

4.umask 022

5.export PATH runlevel prevlevel

##为启动环境设置必要的环境变量;

1./bin/hostname FriendlyARM

##设置机器名字;

1./bin/mount -n -t proc none /proc

2./bin/mount -n -t sysfs none /sys

3./bin/mount -n -t usbfs none /proc/bus/usb

4./bin/mount -t ramfs none /dev

##挂载"虚拟"文件系统"/proc"和"/sys",并且在/dev目录下挂载一个ramfs,相当于把原本nandflash上的只读的/dev目录"覆盖"上一块可写的空的SDRAM。

##这里要注意的是,/sys和挂载了ramfs的/dev是正确创建设备节点的关键。对于2.6.29内核来说,已经没有devfs的支持,创建设备节点只有通过两种办法由文件系统完成:

1)制作文件系统镜像前用mknod手动创建好系统所有的(包括可能有的)设备节点,并把这些节点文件一起做进文件系统镜像中;

2)在文件系统初始化过程中,通过/sys目录所输出的信息,在/dev目录下动态的创建系统中当前实际有的设备节点。

        显然,方法1)有很大的局限性,仅限于没有设备动态增加或减少的情况,不适用于很多设备热插拔的情况,比如U盘,SD卡等等。方法2)是目前大多数PC上的linux的做法(基于udev实现)。这种方法有2个前提:/sys目录挂载和一个可写的/dev目录。这也就是为什么我们这里需要挂载/sys和ramfs在/dev目录上,事实上,这种方法最早就是为热插拔设计的,你可以理解为当系统启动时,所有设备一下子全部"插入"了进来。

        这里有一点要说明的是,在文件系统初始化跑到这里之前,原来的/dev目录下必须有一个设备节点:/dev/console。

        其实,要搞清楚"程序"这种东西,没有什么好的办法,无非2个东西,源码和脚本

1.echo /sbin/mdev> /proc/sys/kernel/hotplug

2./sbin/mdev -s

3./bin/hotplug

##这几个就是用来完成上面所说的两个东西:1)通过mdev -s在/dev目录下创建必要的设备节点;2)设置内核的hotplug handler 为mdev,即当设备热插拔时,由mdev接受来自内核的消息并作出相应的回应,比如挂载U盘。

        对于mdev,需要注意的是,文件系统里存在/etc/mdev.conf文件,它包含了medv的配置信息。通过这个文件,我们可以自定义一些设备节点的名称或链接来满足特定的需要。这是root qtopia中mdev.conf的内容:

1.#system all-writable devices

2.full 0:0 0666

3.null 0:0 0666

4.ptmx 0:0 0666

5.random 0:0 0666

6.tty 0:0 0666

7.zero 0:0 0666

8.

9.#console devices

10.tty[0-9]* 0:5 0660

11vc/[0-9]* 0:5 0660

12.     
13.   # serial port devices   
14.   s3c2410_serial0    0:5    0666    =ttySAC0   
15.   s3c2410_serial1    0:5    0666    =ttySAC1   
16.   s3c2410_serial2    0:5    0666    =ttySAC2   
17.   s3c2410_serial3    0:5    0666    =ttySAC3   
18.                                                                                                                                                          19.   # loop devices   
20.   loop[0-9]*    0:0    0660    =loop/   
21.     
22.   # i2c devices   
23.   i2c-0        0:0    0666    =i2c/0   
24.   i2c-1        0:0    0666    =i2c/1   
25.     
26.   # frame buffer devices   
27.   fb[0-9]        0:0    0666   
28.     
29.   # input devices   
30.   mice        0:0    0660    =input/   
31.   mouse.*        0:0    0660    =input/   
32.   event.*        0:0    0660    =input/   
33.   ts.*        0:0    0660    =input/   
34.     
35.   # rtc devices   
36.   rtc0        0:0    0644    >rtc   
37.   rtc[1-9]    0:0    0644   
38.     
39.   # misc devices   

40.   mmcblk0p1    0:0    0600    =sdcard */bin/hotplug   
41.   sda1        0:0    0600    =udisk * /bin/hotplug

可以看到,原本串口驱动注册的设备名是 s3c2410_serial0, s3c2410_serial1 和
s3c2410_serial2,而 mdev 则会在/dev 目录下对应生成 ttySAC0, ttySAC1和ttySAC2以符合
应用程序对于串口设备名称的习惯。同样的,/dev/sdcard和/dev/udisk 永远分别指向 SD 卡和
U盘的第一个分区。(所以,用那些没有分区表的SD卡或U盘的兄弟知道原因了吧...)


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 17:22 , Processed in 1.031256 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表