分享

下接 android linux 基础知识总结[下]2

 shaobin0604@163.com 2011-09-06
2.6.1 /etc/inittab
initab 被 init 使用
2.6.1.1 老平台 inittab文件内容
2.6.1.1 gpephone 官方的inittab 文件(与redhat,federo差不多)
2.6.1.1 ubuntu中没有inittab文件
=================
2.6.1.1 老平台 inittab文件内容
-----------------------------------------
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
-----------------------------------------
2.6.1.2 gpephone 官方的inittab 文件(与redhat,federo差不多
-----------------------------------------
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel.
id:5:initdefault:
# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
# What to do in single-user mode.
~~:S:wait:/sbin/sulogin
# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
1:2345:respawn:/sbin/getty 38400 tty1
-------------------------------------------
2.6.1.3 ubuntu中没有inittab文件
在unbutu系统中我们没看到此文件,是因为ubuntu用的是 upstart ,lfs中使用的是 sysvinit ,嵌入式系统中
一般使用的是 busybox 中的 init ,android 系统使用的是 system/core/init 
init:
main()
init_main()
read_inittab();
gdm运行后
/etc/rc5.d/S30gdm -> ../init.d/gdm
/etc/init.d/gdm:19:DAEMON=/usr/sbin/gdm
/etc/init.d/gdm:24: SSD_ARG="--startas $DAEMON"
/etc/init.d/gdm:27: SSD_ARG="--exec $DAEMON"
启动gdm:
log_begin_msg "Starting GNOME Display Manager..."
start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --name gdm $SSD_ARG -- $CONFIG_FILE >/dev/null
================
2.6.2 /etc/init.d/rcS
-------------------
#!/bin/sh
挂在 /etc/fstab 中的文件系统
/bin/mount -a
. /etc/default/rcS
#环境变量
. /etc/profile
#屏幕叫准备
. /etc/X11/run-calibrate
#启动X
. /etc/X11/Xserver
. /etc/scripts/testd-bus.sh
#启动dbus消息总线
#启动gpephone
-------------------
ubuntu 系统
---------------
exec /etc/init.d/rc S
---------------
会依此执行 /etc/rcS.d/ 下以
S01mountkernfs.sh 
S02hostname.sh
S10udev 
S11mountdevsubfs.sh
S20checkroot.sh
S22mtab.sh
S30checkfs.sh
S35mountall.sh
S40networking
S43portmap
S55bootmisc.sh
./rc3.d/S30gdm
./rc2.d/S30gdm
./rc4.d/S30gdm
./rc5.d/S30gdm
/etc/rcS.d/S35mountall.sh -> ../init.d/mountall.sh
mount -a -t nonfs,nfs4,smbfs,cifs,ncp,ncpfs,coda,ocfs2,gfs,gfs2 -O no_netdev
mount命令的一些解析:
mount -a [-t|-O] ... : mount all stuff from /etc/fstab
mount -t type dev dir : ordinary mount command
================
2.6.3 /etc/fstab 文件
Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息
arch 报告机器的体系结构
blockdev 在命令行中调用块设备的ioctl
cal 显示一个简单的日历。
cfdisk 处理指定设备的分区表
column 把输出格式化为几列
ctrlaltdel 设置CTRL+ALT+DEL组合键的功能为硬重启或软重启
dmesg 显示内核的启动信息
fdisk 磁盘分区管理程序
fsck.cramfs 对Cramfs文件系统的一致性进行检查
getopt 在给出的命令行进行选项和参数解析
hexdump 用用户指定的方式(包括ASCII, 十进制, 十六进制, 八进制)显示一个文件或者标准输入的数据
hwclock 查询和设置硬件时钟(也被称为RTC或BIOS时钟)。
ipcrm 删除给定的进程间通信(IPC)资源
mkfs 在一个设备(通常是一个硬盘分区)设备上建立文件系统
mkfs.cramfs 创建cramfs文件系统
mkswap 初始化指定设备或文件,以用做交换分区
more 分屏显示文件,但没有less好用
mount 把一个文件系统从一个设备挂载到一个目录
ramsize 显示或者改变 RAM disk 的大小
raw 将一个原始的Linux字符设备绑定到一个块设备
rdev 查询和设置内核的根设备和其他信息
readprofile 显示内核侧写文件/proc/profile的信息
rename 对文件进行重命名
renice 修改正在运行进程的优先级
sfdisk 磁盘分区表管理工具
umount 卸载一个被挂载的文件系统
mount挂载与/etc/fstab
mount 源目录 目的目录
mount -a 自动挂载/etc/fstab中的文件系统 
根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。 其它 mount point 必须为已建立的目录﹐可任意指定﹐
但一定要遵守必须的系统目录架构原则 所有 mount point 在同一时间之内﹐只能挂载一次。 所有 partition 在同一时间之内﹐
只能挂载一次。 如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。 
/etc/fstab 
第一列:label 
第二列:挂载点
第三列:分区的文件系统
第四列:文件系统挂载选项,看附件啦
第五列:是否被dump作用。0代表不要做dump 备份,1代表要每天进行dump的动作。 2 也代表其它不定日期的dump备份动作,通常这个数值不是0就是1啦!
第六列:是否以fsck检查分区(开机时候检查分区)0为不检查,1为开机的时候检查,2为在稍后的时间检查
/dev/sda8 on / type ext3 (rw,relatime,errors=remount-ro)
/proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda7 on /boot type ext3 (rw,relatime)
/dev/sda11 on /home type ext3 (rw,relatime)
/dev/sdb5 on /opt type ext3 (rw,relatime)
/dev/sda9 on /usr/local type ext3 (rw,relatime)
/dev/sda1 on /windows/c type vfat (rw,utf8,umask=007,gid=1000)
/dev/sda5 on /windows/d type vfat (rw,utf8,umask=007,gid=1000)
/dev/sda6 on /windows/e type vfat (rw,utf8,umask=007,gid=1000)
可以在/etc/fstab 中进行指定
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
none /dev/pts devpts defaults 0 0
./util-linux-2.12r/mount/mount.c
main()
result = do_mount_all (types, options, test_opts);
mount --help 可以知道 mount -a 是mount所有/etc/fstab 
mount -a [-t|-O] ... : mount all stuff from /etc/fstab
======================
2.7 制作文件系统
2.7.1 原始方式
2.7.2 通过scratchbox等工具
2.7.3 通过 android 源码集成开发环境
2.7.1 原始方式
创建基本文件系统标准目录(根据不同的linux系统,ubuntu跟android目录结构就完全不同)
lfs中的标准目录:
创建修改必要的配置文件
/scratchbox/source2/source/busybox/busybox-1.1.2/examples/bootfloppy/etc/
vim ${CLFS_ROOTFS_DIR}/etc/profile
vim ${CLFS_ROOTFS_DIR}/etc/inittab
vim ${CLFS_ROOTFS_DIR}/etc/fstab
vim ${CLFS_ROOTFS_DIR}/etc/init.d/rcS
创建账号以及密码文件
sudo vim ${CLFS_ROOTFS_DIR}/passwd
拷贝必须的动态库文件
cd ${CLFS_ROOTFS_DIR}/lib
cp -d $COMPILER_LIB/ld* ./
cp $COMPILER_LIB/libc-2.3.5.so ./
cp -d $COMPILER_LIB/libc.so.6 ./
cp $COMPILER_LIB/libm-* ./
cp -d $COMPILER_LIB/libm.s* ./
cp $COMPILER_LIB/libcrypt-* ./
cp -d $COMPILER_LIB/libcrypt.s* ./
拷贝可选的动态库文件
如果需要域名解析:
1)增加/etc/resolv.conf
[root@lqm /etc]#cat resolv.conf
nameserver 192.168.x.x //加入域名解析器
2)增加相应动态库的支持
增加如下:
libnss_files
libnss_dns
libresolv.so
find find . -name "libnss*" $COMPILER_LIB/
./libnss_files.so.2
./libnss_files.so
./libnss_dns-2.3.2.so
./libnss_dns.so
./libnss_files-2.3.2.so
./libnss_dns.so.2
find . -name "libresolv*" /scratchbox/compilers/arm-linux-gcc-3.4.4-glibc-2.3.5/arm-unknown-linux-gnu/lib/
./libresolv.so
./libresolv.so.2
./libresolv-2.3.2.so
2.7.2 通过scratchbox等工具
===================
2.7.3 通过 android 源码集成开发环境
环境搭建问题:
1.为什么拷贝 cupcake 编译结果 out/target/product/littleton/root/ 到内核顶层目录?
2.cupcake-jianping/make_image15.sh中的choosecombo是什么作用?
3.make_image15.sh 与 make_env15.sh只差一句make -j2?
4.补充shell脚本知识。
=====================
2.7.4 配置android网络文件系统
下面是曾经用过的几种开发板的命令行参数:
S3C2410 启动参数:
noinitrd root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs 
ip=192.168.2.188:192.168.2.56:192.168.2.56:255.255.255.0::eth0:on console=ttySAC0
S3C2440 启动参数:
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs 
ip=192.168.2.175:192.168.2.56:192.168.2.201:255.255.255.0::eth0:on mem=64M init=/init 
marvell 310 启动参数:
boot root=/dev/nfs nfsroot=192.168.2.56:/nfsroot/rootfs,rsize=1024,wsize=1024 
ip=192.168.2.176:192.168.2.201:192.168.2.201:255.255.255.0::eth0:-On 
console=ttyS2,115200 mem=64M init=/init
当前android内核的.config文件中的命令行参数:
CONFIG_CMDLINE="root=/dev/nfs nfsroot=192.168.1.100:/nfsroot/rootfs,rsize=1024,wsize=1024 
ip=192.168.1.101:192.168.1.100:192.168.1.100:255.255.255.0::usb0:on 
console=ttyS1,115200 mem=128M init=/init android uart_dma=1"
`root=' 参数
此参数告诉内核启动时以那个设备作为根文件系统使用。我的pc根文件系统:
/dev/sda8 9614116 6522156 2603588 72% /
ubuntu 的/boot/grub/menu.lst参数:
kernel /vmlinuz-2.6.27-4-generic root=UUID=2ffa7dc6-2dc5-4b66-8661-1226c086951a 
ro locale=zh_CN quiet splash 
initrd /initrd.img-2.6.27-4-generic
其中 root可以设置为:root=/dev/sda8
/dev/nfs, 这并非真的是个设备, 而是一个告诉核心经由网络取得根文件系统
lfs的/boot/grub/menu.lst参数:
title LFS 6.4
root (hd1,1)
kernel /boot/lfskernel-2.6.27.4 root=/dev/sdb1
`nfsroot=' 参数
这个参数告诉内核到哪台pc的哪个目录读取根文件系统。此参数的格式如下:
nfsroot=[:][,]
--pc机的ip地址,如果此字段没给值,那么将使用由 nfsaddrs 变量(见下面)所决定的值。
-- pc服务端上要作为根挂入的目录域名(/nfsroot/rootfs)
-- 标准的网络文件系统选项。所有选项都以逗号分开。如果没有给定此选项字段则使用下列的缺省值:
port = as given by server portmap daemon
rsize = 1024
wsize = 1024
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard, nointr, noposix, cto, ac
`init=' 参数
内核启动时缺省执行 `init' 程序,内核将会到/sbin/, /bin/ 等目录下查找默认的init,如果没有找到那么就报告出错。
而最后它会去试 /bin/sh (可能在 /etc/rc )。如果说,例如,如果你的 init 程序坏掉了,只要使用 init=/bin/sh
这个启动参数就能让你在启动时直接跳到解译环境(shell),使你能够换掉坏掉的程序。
`ip=' 参数
nfsaddrs=::::::
ip=192.168.1.101:192.168.1.100:192.168.1.100:255.255.255.0::usb0:on
ip=192.168.2.175:192.168.2.56:192.168.2.201:255.255.255.0::eth0:on
-- 板子的ip 使用何种协议端视配置核心时打开的选项以及 参数而定。如果设定此参数,就不会使用反向地址解析协议或启动协议。
-- 网络文件系统服务端之互联网地址。
-- 网关(gateway),
-- 本地网络界面的网络掩码。如果为空白,则网络掩码由客户端的互联网地址导出,除非由启动协议接收到值。
-- 客户端的域名。如果空白,则使用客户端互联网地址之 ASCII-标记法,或由启动协议接收的值。
-- 要使用的网络设备域名。
-- 用以作为自动配置的方法。
参考文档:
ramfs, rootfs, initrd and initramfs
http://blog./u2/89923/showart_1890405.html
嵌入式系统文件系统比较
http://blog.sina.com.cn/s/blog_53ad41a50100eptc.html
LINUX系统性能调谐
http://www./article/server/00 ... 3755_2.htm
怎样限制或者修改/dev/shm的大小
http://www./html/65/t-665.html
====================================================================
====================================================================
3. 制作交叉工具链
3.1 什么是工具链
3.2 获取交叉工具链的几种途径
3.3 android工具链与gnu工具链的比较
每一个软件,在编译的过程中,都要经过一系列的处理,才能从源代码变成可执行的目标代码。这一系列处理包括:预编译,高级语言编译,
汇编,连接及重定位。这一套流程里面用到的每个工具和相关的库组成的集合,就称为工具链(tool chain)。以GNU的开发工具GCC为例,
它就包括了预编译器cpp,c编译器gcc,汇编器as,和连接器ld等。在GNU自己对工具链定义中,还加进了一套额外的用于处理二进制包的
工具包binutils,整个工具链应该是GCC+binutils+Glibc, binutils其实与Glibc关系不是很大,它可以被独立安装的,所以GNU工具
链也可以狭义地被理解为GCC+Glibc。
要构建出一个交叉工具链,需要解决三个问题。一是这个工具链必须是可以运行在原工作站平台上的。二是我们需要更换一个与目标平台对应的

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多