直接断电关机的嵌入式linux 关机时间系统中eMMC适合什么根文件系统

eMMC ext4综述
一.系统的引导启动
1.1系统的引导启动
//from-poweron-to-android-the-boot-sequence/
通常,引导设备的块0包含着主引导记录(MasterBoot Record MRB),这个块包含着设备分区表(partition table)的信息。
当设备加电启动的时候,第一个阶段的bootloader放在特定的块上,该阶段执行后会找到下个阶段的bootloader,该过程可以理解为使用了低层的地址块的,即这些地址块用的是硬编码,找到它的时候是采用直接的物理块的,而不是分区,即bootloader和内核的定位是在分区表(partition table)之外的。
使用dd, fdisk, fastboot可以生成MRB和partitiontable,烧写内核和ramdisk。Fdisk和fastboot比dd要更友好和快速。ODROID-A4的分区表如下:
当系统启动的时候,处理器会从一个指定的地方读取并执行代码,这个地址通常是内部ROM,它初始化板上的部件,并引导设备,有的平台是一小段称之为BL0的代码,不同的处理器和开发板有不同。
如果bootloader的第一步执行的时候,比如BL1,它会被复制到内部的RAM中,初始化时钟,SDRAM,加载剩余的bootloader(BL2),不同的平台都类似,如下图所示:
在bootloader(BL0 BL1 BL2)初始化板上的设备后,将kernel加载进RAM中。
1.2 引导方式实例1
Uboot启动以后的一种引导方式,仅做参考(作者,围补):
setenv loadaddr 0x
setenv bootargs_base 'setenvbootargsconsole=ttymxc0,115200'
setenv bootargs_mmc 'setenvbootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,M@60,if=RGB24ip=dhcp'
setenv bootcmd_mmc 'run bootargs_base bootargs_mmcdev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'
setenv bootcmd 'run bootcmd_mmc'
run bootcmd
rw是声明启动权限,即以读写方式启动;rootwait是指等待设备/dev/mmcblk0p1设备就绪后才尝试挂载rootfs。如果没有此参数,linux内核启动时可能会在存储设备尚未就绪是就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了。
mmc dev 1,意思是将dev 1设置为当前设备
mmc read0xx800 0x2000即将存储设备上从块号0x800开始的0x2000个存储块的东西拷贝到内存0x开始的空间内。
1.3引导方式实例2
Boot1:u-boot-spl-16k.bin
Boot2:u-boot.bin
RPMB:未使用(指纹相关)
UDA:剩余的烧写文件
BOOT1:bootloader
BOOT2:boot.img
RPMB:未用(指纹相关)
UDA:剩余文件
1.4引导实例3
下图为exynos4412的启动流程:
二EMMC分区
大家所最为熟知的分区方式同时也是最主流的主要有两种:MBR(Master Boot Record)和GPT(GUID
PartitionTable)。前者应用于绝大多数使用BIOS引导的PC设备(苹果使用EFI的方式),而后者主要是针对MBR的一些缺点进行了改进同时还可以兼容MBR并且支持2TB以上的存储(MBR不支持2TB以上的存储设备)。
Android 2.x.x 版本上使用的是MBR,4.0版本以后就是使用的GPT分区方式。注意,不管是MBR还是GPT,他们的分区都是指“逻辑上”的!!!即通过软件实现的,文件系统级别的。而我现在要说明的是eMMC本身自己的分区,即物理上的,不是通过软件就能实现的分区。
EMMC的分区有一些是AP不能修改的(如BOOT1、BOOT2和RPMB分区),有一些是可以通过特定的命令和寄存器就可以修改的(如Enhanced
Partition和GPAP)。
1.BOOT Area Partition
2.BOOT Area Partition
4.User Data Area
5.Vender private area
2.1Boot 1 & Boot 2 &&&
这两个分区是由厂家在生产过程中配置好了的,并且其大小是不能由AP进行配置的,当然,如果你的公司够牛,量足够大,并且也有这个需求的时候可以去要求厂家重新配置此区域大小,给你专门供货。 &&&&&&&&
Boot 1 和Boot 2这两个区域在存储的稳定性、可靠性及擦除次数上都远比UDA要好(至于原因请往后看),所以很多chipset上都会使用这两个区域来存放一下关键数据,如boot
image,default配置参数等等。当然不同的chipset的配置方法也不尽相同。这个可以找chipset的工程师询问。据笔者所知:以大陆市占最大的两家chipset为例,MTK使用UDA来存放boot
data,而使用boot area来存放配置参数;Qualcomm则使用Boot 1来存放boot
data,boot 2来存放配置参数。
另外,不同的eMMC版本一般对Boot area和RPMB的容量大小需求也不同,如下作一个简单的参考:
2.2RPMB&&&
RPMB是Replay Protected Memory Block的缩写,他的存在目的是用来给系统存放一些特殊的、需要进行访问授权的数据;他的请求及回应类型如下所:
据笔者所知,目前大陆的手机及平板厂商还没有一家使用到此区域的。
User Data Area就是AP及用户可以进行读写存储的区域,通常其大小为整块EMMC表示大小的93%左右,即4GB的eMMC
UDA的区域只有4GB*93%=3809MB。
之前说的BOOT1&2、RPMB和UDA区域我们都可以认为他们在物理上是独立的(当然都是存在于同一块die上)。即他们各自的物理起始地址都是0x0。这个在出厂的时候就会设置完成。下面我们就来说两种可以在物理上进行独立分区的方式:
GPAP即General Purpose Area Partitions,eMMC的spec上定义每个eMMC最多可以通过配置寄存器来定义4个GPAP:
GPAP配置定义完成之后每一个GPAP的起始地址都为0x0;即可以相应地将其认为是独立的一块区域。只是在存放数据的时候会需要从新根据他的起始地址进行计算然后再存储数据。这样必然会增加一定的工作量;据笔者所知,目前大陆的手机及平板几乎没有用到这个功能。都是使用一整块的UDA,然后通过文件系统去进行逻辑上的分区使用。
我想肯定会有读者想问那这个功能到底有什么用呢?我想说eMMC是一个通过的存储设备,并不止是为手机和平板使用。当一个设备有多个CPU的时候并且他们的功能还不同时,这个时候使用GPAP这个功能就非常方便了。
b) Enhanced Partition
Enhanced Partition这也是一个在手机及平板上使用较少的功能。为什么通过配置原本的UDA就可以变成“Enhanced”的呢?既然这么有用,为什么不将整个UDA配置成为”Enhanced”的呢?别着急,我来一一作答。
我们知道eMMC只是指他的接口标准,而他真正的存储介质还是NAND Flash,而NAND又分为SLC、MLC和TLC(详细区别请参考我之前的文章),他们的稳定性、可靠性和擦除次数又有很大区别,当然中国厂商最关心的成本也相差很大;目前市场上主流的eMMC还是以MLC的NAND存储介质为主,而TLC的eMMC也在逐渐的增加。其中以Samsung的TLC的emmc最为成熟市占率也最高。我们这里先以MLC的EMMC来进行介绍:
以现在市面上最先进的NAND制程20nm的MLC为例,擦除次数大概在cycle。而SLC的擦除次数则在cycle。很明显SLC要比MLC性能更好,数据存储更稳定。
而我们这里介绍的Enhanced Partition的主要功能就是将MLC配置成为SLC。现在大家明白他为什么被称之为“Enhanced”的了!是相对于MLC(也就是default
storage media)来说的。
当然,从MLC配置为SLC不是没有代价的,这个代价自然就是容量变小,会变多小呢?容量只有原来的一半!!!原本1GB的MLC通过配置成SLC就只剩下512MB了,你说谁会愿意这样去大容量地转换呢?
据笔者所知,目前使用过这个功能的就只有台湾的HTC,他们是用来存储boot data。另外,大陆也有一家大厂正在尝试使用Enhanced
Partition来做为swap虚拟内存使用。
2.4 Vender Private Area
在eMMC里面除了AP能操作(即可识别并且可以通过地址进行访问)的boot
1&2、RPMB和UDA之外,其实还有一小部分区域是AP看不见也不能进行操作的。这部分区域是由生产厂家预留的,他主要是用来存放这样一些内容:
eMMC的FW(想知道是什么请参考我之前的文章),eMMC在boot的时候的code,FTL(Flash
Transilation Layer)以及在厂家生产过程中产生的坏块等等。
PS: 不是所有厂家的eMMC都支持Enhanced Partition这个功能,但是只要这个eMMC是支持这个功能的那么他的BOOT
Area和RPMB就必须就Enhanced storage media。
三.制作EXT4文件系统
用户目录下新建目录rootfs_tmp文件,用于临时挂载文件系统:
mkdir -p rootfs_tmp
制作一个<span style="color:#8M(128x)的ext4空白文件:
dd if=/dev/zero of=rootfs.ext4 bs=1024 count=131072
再将新建的rootfs.ext4文件&#26684;式化为ext4&#26684;式:
sudo mkfs.ext4 rootfs.ext4
将rootfs.ext4文件挂载到前面我们新建的临时目录rootfs_tmp,注意这里我们要使用mount
–o loop的属性,表示我们要把rootfs.ext4当作硬盘分区挂载到rootfs_tmp:
sudo mount -o loop rootfs.ext4 ./rootfs_tmp
给rootfs.ext4填充内容了。执行如下指令拷贝文件系统内容:
cd./rootfs_tmp
cp -avrf../busybox_rootfs/* ./
拷贝完后,卸载挂载的rootfs.ext4文件,即完成了文件系统的制作:
sudo umount./rootfs_tmp
这样就完成ext4&#26684;式的rooffs文件系统的制作。
四.在EMMC上分区,及烧写内核,根文件系统
4.1 通过uboot的烧写方法
分区原则:每个分区的大小要大于等于要存储的镜像文件的大小。
EMMC:'nandflash&#43; 控制电路'
一种分区配置:(该种分区方法是否是UDA中的分区,因为上文提到的两个boot分区出厂后无法再分配的,下文烧写的时候用的是物理扇区地址,有点疑问)
0--------1M---------65M------------819M---------------8192M
扇区:0-------0x800-----0x20800--------0x199800---------0x1000000
|--uboot--|----linux----|-----rootfs-----|--------appfs---------|
/* 分区命令:*/
#:fdisk 2 3 0x:0x2f00000:0
#:mmc write x800 0x3000&&&&& //写入的地址是物理上的地址
0x:源数据地址
0x800:要写入的位置(单位是扇区,十进制512)
0x3000:要写入的数据长度(单位是扇区,十进制512)
在上文中已经制作了EXT4根文件系统rootfs.ext4,下面就烧写到eMMC中去,
rootfs.ext4
#:mmc write 00 0x32000
#:setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 console=ttySAC0,115200
root:根文件系统所在设备文件的名称
rootfstype:根文件系统的类型
console:控制台,ttySAC0,uart0控制器
4.2fdisk分区EMMC操作
http://blog.chinaunix.net/uid--id-5767254.html
Emmc在/dev下的设备文件是mmcblk0,用fdisk对emmc进行分区;
4.2.1、对emmc进行分区
# fdisk /dev/mmcblk0
Device contains neither a valid DOS partition table, nor Sun, SGI, OSF or GPTdisklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that the previous content
won't be recoverable.
The number of cylinders for this disk is set to 238592.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
4.2.2、使用m命令,获取fdisk使用帮助
Command (m for help): m
Command Action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help):
4.2.3、使用n命令,添加一个新的分区
Command (m for help): n
Command action
e extended
p primary partition (1-4)
选择p,添加主分区
4.2.4、选择分区号,选择1,
Partition number (1-4): 1 // 选择分区号
First cylinder (1-238592, default 1): Using default value 1 // 选择分区的第一个柱面,选择1
Last cylinder or &#43;size or &#43;sizeM or &#43;sizeK (1-238592, default 238592): Usingdefault value 238592 // 选择最后一个柱面
可以使用同样的方式添加第二、第三等分区。
4.2.5、是用p命令,显示分区信息
Command (m for help): p
Disk /dev/mmcblk0: 7818 MB,
4 heads, 16 sectors/track, 238592 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 1 4936 83 Linux
4.2.6、使用t命令,设置分区&#26684;式
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): l
0 Empty 1b Hidden Win95 FAT32 9f BSD/OS
1 FAT12 1c Hidden W95 FAT32 (LBA) a0 Thinkpad hibernation
4 FAT16 &32M 1e Hidden W95 FAT16 (LBA) a5 FreeBSD
5 Extended 3c Part.Magic recovery a6 OpenBSD
6 FAT16 41 PPC PReP Boot a8 Darwin UFS
7 HPFS/NTFS 42 SFS a9 NetBSD
a OS/2 Boot Manager 63 GNU HURD or SysV ab Darwin boot
b Win95 FAT32 80 Old Minix b7 BSDI fs
c Win95 FAT32 (LBA) 81 Minix / old Linux b8 BSDI swap
e Win95 FAT16 (LBA) 82 Linux swap be Solaris boot
f Win95 Ext'd (LBA) 83 Linux eb BeOS fs
11 Hidden FAT12 84 OS/2 hidden C: drive ee EFI GPT
12 Compaq diagnostics 85 Linux extended ef EFI (FAT-12/16/32)
14 Hidden FAT16 &32M 86 NTFS volume set f0 Linux/PA-RISC boot
16 Hidden FAT16 87 NTFS volume set f2 DOS secondary
17 Hidden HPFS/NTFS 8e Linux LVM fd Linux raid autodetect
Hex code (type L to list codes): 83
4.2.7、使用w命令,保存配置
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table
4.2.8、使用对应文件系统工具对分析进行&#26684;式化
# mkfs.ext4 /dev/mmcblk0p1
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
477664 inodes, 1908734 blocks
95436 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=
59 block groups
32768 blocks per group, 32768 fragments per group
8096 inodes per group
Superblock backups stored on blocks:
Writing inode tables: done
Creating journal (32768 blocks):
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
本文已收录于以下专栏:
相关文章推荐
该文章整合了一些网上的资源,如有侵权请告知,我会进行相应删除
1.linux 嵌入式时使用的emmc 最开始是没有进行分区设置的,所以系统要挂载emmc 需要先对emmc 进行分区及格式化。...
1. eMMC 总线接口
eMMC 总线接口定义如下图所示:
各个信号的描述如下:
CLK 信号用于从 Host 端输出时钟信号,进行数据传输的同步和设备运作的驱动。
在一个时钟...
http://blog.csdn.net/yunfly163/article/details/7496795
fdisk -c 0
命令分析:
----------------------...
  运行级别3下的用户login以后,将启动一个用户指定的shell,以下以/bin/bash为例继续我们的启动过程。
  bash是Bourne Shell的GNU扩展,除了继...
Shadow DOM
MP4 文件格式
MP4 文件格式中,所有的内容存在一个称为movie
的容器中。一个movie 可以由多个tracks 组成。每个track
就是一个...
from:http://valser.org/thread-505-1-1.html
E.Sariyanidi, H. Gunes, A. Cav...
HEVC是ITU-T VCEG和ISO/IEC MPEG联合组成的JCT-VC的最新研究成果,第一版计划将于2013年1月公布。下一步的扩展工作将主要集中于对高精度及彩色视频的支持、可分...
第四章 Peer-To-Peer的应用研究、面临的问题与前景展望
一、国外公司与研究机构研究情况
近年来,随着Napster、KaZaa、BT、eMule这样的基于P2P技术的文件共享软件在...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)一. 将bootloader烧入SD卡
&&  1.格式化SD卡(不挂载): &fdisk &/dev/sdx & & &-d 删除 &-n &新建分区 &-w 保存退出 & 6~default &sdx1
          两种格式化方式: &mkfs & -t &vfat &/dev/sdx1
                   &mkfs.vfat & &/dev/sdx1
   &2.将bootloader烧入SD卡: &注意--不挂载
        ./sd_fusing.sh &/dev/sdx & &执行后将SD卡插入开发板,在minicom中启动
& & & & 注:分区是对整个设备进行操作(sdx)而不是(sdx1)
二. &将Linux/Andriod系统烧入SD卡,进而固化EMMC中运行
   &&1.格式化SD卡(不挂载): &fdisk &/dev/sdx & & &-d 删除 &-n &新建分区 &-w 保存退出 & 6~default &sdx1
          两种格式化方式: &mkfs & -t &vfat &/dev/sdx1
                   &mkfs.vfat & &/dev/sdx1
   2.将Linux/Andriod系统烧入SD卡(不挂载):
          ./sd_write & /dev/sdb & & ../images/Superboot.bin
   3. 将image复制到sdx1中(先挂载):
        mount /dev/sdx1 &/media
        cp & images & /media/*
三. &Linux内核的烧写
  minicom常用命令:
    printenv &:打印环境变量
    bootargs &:启动参数,决定内核启动后根文件系统如何挂载
    bootcmd & : 用于实现内核的自启动
& & &&  & &help,bootm,mmc &list,mmcinfo &0,ext2format,ext2load
&&&&&& 注:从SD卡启动
  1.分区: & & fdisk & -p & &1 & &打印分区信息
        fdisk & -c & &1 & &320 & &2057 & 520 & &(能且只能)分成四个分区 (剩余空间自动为一份分区)
  2.格式化: & &fatformat & & &mmc & & &1:1
         ext3format & &mmc & & &1:2
        &ext3format & &mmc & & &1:3
&        ext3format & &mmc & & &1:4
&  3.烧写bootloader到EMMC:
     emmc &open & 1 & --打开emmc
        mmc  write  1    0  10 
        mmc  write  1    10  20    这些逻辑块数都为16进制数
        mmc  write  1    30  290
        mmc  write  1    2c0  ba
     &&emmc &close & 1  --关闭emmc
  注:& 以EMMC方式重启
  4. 烧写linu内核和根文件系统到EMMC的第二 三分区:
      第一步: 使开发板挂载到nfs虚拟文件系统
        mkdir &/nfsroot
        添加 & &/nfsroot *(rm,sync,no_root_squash) & 到&文件 /etc/exports
        重启nfs服务 & & & & &service nfs& restart
        拷贝inittab文件 & & cp & inittab & /nfsroot/etc
        设置启动参数 & & & & set &bootargs &"root=/dev/nfs &nfsroot=192.168.0.222:/nfsroot &ip=192.168.0.20 &
                          lcd=S70 &console=ttySAC0,115200 &init=linuxrc"
        保存 & & & & & & & & & &save
          注意: &Ctrl + A(松开) & &W &:打开自动换行(由于变量太多,必须自动换行)
      第二步:利用虚拟文件系统拷贝内核和根文件系统
         将内核拷贝到EMMC的第二个分区
             挂载 mount &/dev/mmcblk0p2 & /mnt
             拷贝内核 & cp &zImage & /mnt & (在pc机中先将zImage拷贝到共享目录nfsroot中)
             卸载EMMC第二分区 & umount &/mnt&
          
          &将根文件系统拷贝到EMMC的第三个分区
             挂载 mount &/dev/mmcblk0p3 & /mnt
             拷贝根文件系统
               PC端:& cp &root_qt*.tar.gz & /nfsroot & (在pc机中先将root_qt*拷贝到共享目录nfsroot中)
              minicom开发板: tar -zxvf& root_qt*.tar.gz& -C& /mnt & (后将所有文件拷到/mnt目录下)
             拷贝inittab--根文件系统缺失部分
               PC端: &cp &inittab & &/nfsroot/
               minicom开发板:cp &/inittab & /mnt/etc&& (或 cp /etc/inittab& /mnt/etc& )
&             卸载EMMC第三分区 & umount &/mnt
  & 注:之后手动复位,从EMMC启动,下一步在minicom中设置环境变量
   5.设置变量:
        设置内核自启动 & set &bootcmd &"ext2load &mmc &0:2 & &zIbootm "
        设置启动参数 & & set &bootargs &"root=/dev/mmcblk0p3 &console=ttySAC0,115200 init=linuxrc &lcd=S70"
        保存 & & & & & & & & save
& & & & 注:EMMC有四个分区 ,其中: & & &第一个分区 & & & &bootloader
                 && & 第二个分区 & & & &内核
                  & & 第三个分区 & & & &根文件系统
阅读(...) 评论()捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&嵌入式根文件系统制作(常见问题详解)
  首先我们先来了解一下什么是init,对它有个初步的了解.
&&&&&& 一、什么是init    init是Linux系统操作中不可缺少的程序之一。 是一个由内核启动的用户级进程。    内核启动(已经被载入,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式来启动其他用户级的进程或服务。所以,init始终是第一个进程(其PID始终为1)。    内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。    二、运行级别    运行级就是操作系统当前正在运行的功能级别。这个级别从1到6,具有不同的功能。其功能级别如下:# 0 - 停机(千万不能把initdefault 设置为0 )    除此之外还有ABC三个运行级别,但在RHLinux中都没有意义。    这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)    三、运行级别的配置    运行级别的配置是在/etc/inittab行内进行的,如下所示:12 : 2 : wait : / etc / init.d / rc 2各字段解释如下:id:runlevels:action: id:是一个任意指定的四个字符以内的序列标号,在本文件内必须唯一;使用老版本的libc5(低于5.2.18)或a.out库编译出来的sysvinit限制为2字符。注意:像getty之类的登陆进程必须使id字段与tty编号一致,如tty1需要id=1,许多老版本的登陆进程都遵循这种规则。    runlevels:表示这一行适用于运行那个/些级别(这里是2,可以有多个,表示在相应的运行级均需要运行);另外sysinit、boot、bootwait这三个进程会忽略这个设置值。    action:表示进入对应的runlevels时,init应该运行process字段的命令的方式,常用的字段值及解释在附录内。例子中的wait表示需要运行这个进程一次并等待其结束。    process:具体应该执行的命令。例子中的/etc/init.d/rc命令启动运行级别2中应该运行的进程/命令,并负责在退出运行级时将其终止(当然在进入的runlevel中仍要运行的程序除外。)    当运行级别改变,并且正在运行的程序并没有在新的运行级别中指定需要运行,那么init会先发送一个SIGTERM 信号终止,然后是SIGKILL.    action字段告诉init执行的动作,即如何处理process字段指定的进程,action字段允许的值及对应的动作分别为:    1)respawn:如果process字段指定的进程不存在,则启动该进程,init不等待处理结束,而是继续扫描inittab文件中的后续进程,当这样的进程终止时,init会重新启动它,如果这样的进程已存在,则什么也不做。    2)wait:启动process字段指定的进程,并等到处理结束才去处理inittab中的下一记录项。    3)once:启动process字段指定的进程,不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。    4)boot:只有在系统启动时,init才处理这样的记录项,启动相应进程,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。    5)bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。    6)fail:当init接到断电的信号(SIGPWR)时,处理指定的进程。    7)wait:当init接到断电的信号(SIGPWR)时,处理指定的进程,并且等到处理结束才去检查其他的记录项。    8)off:如果指定的进程正在运行,init就给它发SIGTERM警告信号,在向它发出信号SIGKILL强制其结束之前等待5秒,如果这样的进程不存在,则忽略这一项。    9)ondemand:功能通respawn,不同的是,与具体的运行级别无关,只用于rstate字段是a、b、c的那些记录项。    10)sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。    11)initdefault:指定一个默认的运行级别,只有当init一开始被调用时才扫描这一    init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置并启动网络和邮件服务,启动打印服务等。Solaris中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。    另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab    补充:    1、关于进入单用户模式,一般都是采用设置initdefault为1或者在grub/lilo中指定一个“”或“emergency” 命令行参数来实现。其实另外还有一个更干净的方法,编辑:kernel /vmlinuz-2.6.9-22.EL ro root=/bin/sh,这样init就直接启动一个shell,其他任何进程都没有启动哦,够干净吧!    2、系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令
&&&&&&& inittab文件的格式。    inittab文件中每一记录都从新的一行开始,每个记录项最多可有512个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。    1.id字段是最多4个字符的字符串,用来唯一标志表项。    2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。当请求init改变运行级别时,那些rstate字段中不包括新运行级别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别)    3.action字段告诉init执行的动作,即如何处理process字段指定的进程,action字段允许的值及对应的动作分别为:    1)respawn:如果process字段指定的进程不存在,则启动该进程,init不等待处理结束,而是继续扫描inittab文件中的后续进程,当这样的进程终止时,init会重新启动它,如果这样的进程已存在,则什么也不做。    2)wait:启动process字段指定的进程,并等到处理结束才去处理inittab中的下一记录项。    3)once:启动process字段指定的进程,不等待处理结束就去处理下一记录项。当这样的进程终止时,也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。    4)boot:只有在系统启动时,init才处理这样的记录项,启动相应进程,并不等待处理结束就去处理下一个记录项。当这样的进程终止时,系统也不重启它。    5)bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。    6)powerfail:当init接到断电的信号(SIGPWR)时,处理指定的进程。    7)powerwait:当init接到断电的信号(SIGPWR)时,处理指定的进程,并且等到处理结束才去检查其他的记录项。    8)off:如果指定的进程正在运行,init就给它发SIGTERM警告信号,在向它发出信号SIGKILL强制其结束之前等待5秒,如果这样的进程不存在,则忽略这一项。    9)ondemand:功能通respawn,不同的是,与具体的运行级别无关,只用于rstate字段是a、b、c的那些记录项。    10)sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。    11)initdefault:指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,如果rstate字段指定了多个运行级别,其中最大的数字是默认的运行级别,如果rstate字段是空的,init认为字段是0123456,于是进入级别6,这样便陷入了一个循环,如果 inittab文件中没有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别    4.Process字段中进程可以是任意的守候进程、可执行脚本或程序。    以上这些都是介绍的标准的linux
V的标准,所以对嵌入式来讲有些东西并不见得有用!这里介绍点针对嵌入式的,也就是针对busybox init的:    busybox的init  &&&&&&& 1.&&&&&& 为init设置信号处理过程    2.&&&&&& 初始化控制台    3.&&&&&& 剖析/etc/inittab文件    4.&&&&&& 执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS    5.&&&&&& 执行所有导致init暂停的inittab命令(动作类型:wait)    6.&&&&&& 执行所有仅执行一次的inittab(动作类型:once)    一旦完成以上工作,init进程便会循环执行以下进程:    1.& 执行所有终止时必须重新启动的inittab命令(动作类型:once)    2.& 执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst)    初始化控制台之后,BusyBox会检查/etc/inittab文件是否存在,如果此文件不存在,BusyBox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1到tty4)设置启动shell的动作。如果未建立这些设备文件,BusyBox会报错。    inittab文件中每一行的格式如下所示:(busybox的根目录下的example文件夹下有详尽的inittab文件范例)    id:runlevel:action:process    尽管此格式与传统的Sytem V init类似,但是,id在BusyBox的init中具有不同的意义。对BusyBox而言,id用来指定启动进程的控制tty。如果所启动的进程并不是可以交互的shell,例如BusyBox的sh(ash),应该会有个控制tty,如果控制tty不存在,Busybox的sh会报错。BusyBox将会完全忽略runlevel字段,所以空着它就行了,你也许会问既然没用保留着它干吗,我想大概是为了和传统的Sytem V init保持一致的格式吧。process字段用来指定所执行程式的路径,包括命令行选项。action字段用来指定下面表中8个可应用到process的动作之一。    sysinit:& 为init提供初始化命令行的路径    respawn:& 每当相应的进程终止执行便会重新启动    askfirst: 类似respawn,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使init在控制台上显示“Please press Enter to active this console”的信息,并在重新启动之前等待用户按下enter键    wait: 告诉init必须等到相应的进程完成之后才能继续执行    once:仅执行相应的进程一次,而且不会等待它完成    ctratldel: 当按下+Alt+Delete组合键时,执行相应的进程    shutdown: 当系统关机时,执行相应的进程    restart: 当init重新启动时,执行相应的进程,通常此处所执行的进程就是init本身    以下是我的usblinux的inittab文件    ::sysinit:/etc/init.d/rcS    ::respawn:/sbin/getty& 115200& tty1    tty2::askfirst:-/bin/sh    tty3::askfirst:-/bin/sh    ::restart:/sbin/init    ::ctrlaltdel:/bin/umount -a -r    这个inittab执行下列动作    1.&&&&&& 将/etc/init.d/rcS设置成系统的初始化文件    2.&&&&&& 在115200 bps的虚拟终端tty1上启动一个登陆会话 (注意getty的用法)    3.&&&&&& 在虚拟终端tty2和tty3上启动askfirst动作的shell    4.&&&&&& 如果init重新启动,将/sbin/init设置成它会执行的程序    5.&&&&&& 告诉init,在系统关机的时候执行umount命令卸载所有文件系统,并且在卸载失败时用只读模式冲新安装以保护文件系统。    1、busybox的inittab与pc使用的inittab不同,第一ID并不是随便取名字的,这个名字要与/dev/目录下是否有对应的文件对应    对应错误    can't open /dev/0: No such file or directory    process '-/bin/sh' (pid 789) exited. Scheduling for restart.    can't open /dev/0: No such file or directory    process '-/bin/sh' (pid 793) exited. Scheduling for restart.    2、出现下面这种错误:    process '-/bin/sh' (pid 789) exited. Scheduling for restart.    process '-/bin/sh' (pid 794) exited. Scheduling for restart.    process '-/bin/sh' (pid 796) exited. Scheduling for restart.    process '-/bin/sh' (pid 798) exited. Scheduling for restart.    对应的inittab文件中有    ttyS0::askfirst:-/bin/sh    虽然在/dev/目录下有ttyS0设备,但是这个设备显然不可用,所以才会出现上面的错误    3、当在inittab中同时定义的两个在同一个终端登陆的语句时    ::askfirst:-/bin/sh    s3c2410_serial0:23456:respawn:/sbin/getty -L s3c2410_serial0 115200 vt100    出现的情况就是被抢占,不能接收任何输入    4、bad inittab entry    多半时因为非法字符造成的。    [next]    5、busybox中的字段runleve也没有运行时的运行级别的概念    6、分析一下启动的过程    1.&&&&&& 为init设置信号处理过程    2.&&&&&& 初始化控制台    3.&&&&&& 剖析/etc/inittab文件    4.&&&&&& 执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS    5.&&&&&& 执行所有导致init暂停的inittab命令(动作类型:wait)    6.&&&&&& 执行所有仅执行一次的inittab(动作类型:once)    一旦完成以上工作,init进程便会循环执行以下进程:    1.& 执行所有终止时必须重新启动的inittab命令(动作类型:once)    2.& 执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst)    初始化控制台之后,BusyBox会检查/etc/inittab文件是否存在,如果此文件不存在,BusyBox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动作,此外它还会为四个虚拟控制台(tty1到tty4)设置启动shell的动作。如果未建立这些设备文件,BusyBox会报错。    7“-”的作用    测试的时候是这样的,加上“-”的语句会在登陆终端之后调用/etc/目录下的profile文件,而不加“-”的不会执行这个脚本。    其实登陆终端的命令有几种方便,但是标准的还是使用getty来登陆,但是直接使用如上的语句也是可以的,并且兼容性强一点,因为它不需要指定对应的串口设备。    ::askfirst:-/bin/sh    s3c2410_serial0::askfirst:-/bin/sh    ::askfirst:-/bin/sh    s3c2410_serial0:23456:respawn:/sbin/getty -L s3c2410_serial0 115200 vt100    都是可用的。    8./bin/sh: XXX not found    arm-linux-readelf -d xxx    查看你的以用程序依赖哪些库    一般是因为缺少libc.so.6造成的,实际还是根文件系统的问题,没有将常用的库文件拷贝到/lib目录下    常用的库:    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/ld* .    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so .    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc.so.6 .    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libm * .    [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libcrypt* .    9、错误insmod: chdir(2.6.26.6): No such file or directory    根本原因是insmod的问题,在busybox编译的时候参考下面的选项,不要使用    Linux Module Utilities ---&    [ ] Simplified modutils    //该选项不要选择    [*] Support version 2.6.x Linux kernels    //此选项选上    参考如下:    10、不能执行“-h”命令    在执行xxx Ch时没有任何反应。是在lib目录下缺少常见的库文件    参考如下:    [root@vm-dev rootfs]# ls lib/    ld-2.3.6.so&&&&&&&&&&&&&& libc-2.3.6.so&&&&& libgcc_s.so&&&&& libnsl.so.1&&&&&&&&&&&& libnss_files.so.2&&&&&&& libnss_nis.so.2&&&& librt-2.3.6.so&&&&&& libthread_db.so.1    ld-linux.so.2&&&&&&&&&&&& libcrypt-2.3.6.so& libgcc_s.so.1&&& libnss_compat-2.3.6.so& libnss_hesiod-2.3.6.so&& libpcprofile.so&&&& librt.so.1&&&&&&&&&& libutil-2.3.6.so    libanl-2.3.6.so&&&&&&&&&& libcrypt.so.1&&&&& libm-2.3.6.so&&& libnss_compat.so.2&&&&& libnss_hesiod.so.2&&&&&& libpthread-0.10.so& libSegFault.so&&&&&& libutil.so.1    libanl.so.1&&&&&&&&&&&&&& libc.so.6&&&&&&&&& libmemusage.so&& libnss_dns-2.3.6.so&&&& libnss_nis-2.3.6.so&&&&& libpthread.so.0&&&& libtermcap.so.2&&&&& modules    libBrokenLocale-2.3.6.so& libdl-2.3.6.so&&&& libm.so.6&&&&&&& libnss_dns.so.2&&&&&&&& libnss_nisplus-2.3.6.so& libresolv-2.3.6.so& libtermcap.so.2.0.8    libBrokenLocale.so.1&&&&& libdl.so.2&&&&&&&& libnsl-2.3.6.so& libnss_files-2.3.6.so&& libnss_nisplus.so.2&&&&& libresolv.so.2&&&&& libthread_db-1.0.so    [root@vm-dev rootfs]#
&&&&&& 几天的努力终于写好了,希望这样一篇文章能够给学习它的人带来帮助,水平有限,有错误的地方希望大家海涵.我会在以后的学习中努力的修正自己的错误.希望为大家带来更多的好的文章!
技术资料出处:互联网
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
12345678910
12345678910
1. 引言OFDM能有效抑制多径信道引起的深度衰落、抵抗脉冲噪声和具有较高的频谱效率的特点。但是OFDM的传输符号是多载波的QAM信号经过IFFT处理后得到的结果,由于这种处理是线性相加的关系,当IFFT的输入中存在相位一致的某些点时必然有较高的峰平比,对发射机线性度提出了非...[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科

我要回帖

更多关于 电脑直接断电关机 的文章

 

随机推荐