android linux 基础知识总结(1)

===============
LOCAL_ARM_MODE := arm
目前Android大部分都是基于Arm处理器的,Arm指令用两种模式Thumb(每条指令两个字节)和arm指令(每条指令四个字节)
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
通过设定编译器操作,优化级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
LOCAL_CFLAGS += -W -Wall
LOCAL_CFLAGS += -fPIC -DPIC
LOCAL_CFLAGS += -O2 -g -DADB_HOST=1   -Wall -Wno-unused-parameter
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY
LOCAL_CFLAGS += -DUSEOVERLAY2
根据条件选择相应的编译参数
ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -DANDROID_GADGET=1
LOCAL_CFLAGS := $(PV_CFLAGS)
endif
ifeq ($(TARGET_BUILD_TYPE),release)
LOCAL_CFLAGS += -O2
endif
LOCAL_LDLIBS := -lpthread
LOCAL_LDLIBS += -ldl
ifdef USE_MARVELL_MVED
LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_mpeg4aspdecmved_wmmx2lnx lib_il_h264decmved_wmmx2lnx
LOCAL_SHARED_LIBRARIES += libMrvlMVED
else
LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_h264dec_wmmx2lnx lib_il_mpeg4aspdec_wmmx2lnx
endif
====================
其他一些变量和脚本:
HOST_JNILIB_SUFFIX
LOCAL_MODULE_SUFFIX
LOCAL_MODULE_SUFFIX := $(HOST_JNILIB_SUFFIX)
HOST_GLOBAL_LDFLAGS
TARGET_GLOBAL_LDFLAGS
PRIVATE_LDFLAGS
LOCAL_LDLIBS
LOCAL_C_INCLUDES
LOCAL_STATIC_LIBRARIES
LOCAL_STATIC_LIBRARIES += codecJPDec_WMMX2LNX miscGen_WMMX2LNX
LOCAL_SHARED_LIBRARIES
LOCAL_SHARED_LIBRARIES += libMrvlIPP
LOCAL_SHARED_LIBRARIES += $(common_SHARED_LIBRARIES)
LOCAL_SHARED_LIBRARIES += libMrvlIPP
LOCAL_SHARED_LIBRARIES += libdl
ifeq ($(TARGET_PRODUCT),littleton)
LOCAL_C_INCLUDES += vendor/marvell/littleton/m2d \
LOCAL_SHARED_LIBRARIES += libOmxCore
endif
vendor/marvell/littleton/littleton.mk:27:PRODUCT_NAME := littleton
vendor/marvell/littleton/littleton.mk:28:PRODUCT_DEVICE := littleton
vendor/marvell/littleton/AndroidProducts.mk:13: $(LOCAL_DIR)/littleton.mk
vendor/sample/products/sample_addon.mk:40:PRODUCT_NAME := sample_addon
vendor/htc/dream-open/htc_dream.mk:6:PRODUCT_NAME := htc_dream
./vendor/htc/dream-open/htc_dream.mk:7:PRODUCT_DEVICE := dream-open
./vendor/htc/dream-open/AndroidProducts.mk:3: $(LOCAL_DIR)/htc_dream.mk
build/target/product/generic.mk:26:PRODUCT_NAME := generic
build/target/product/generic_with_google.mk:20:PRODUCT_NAME := generic_with_google
build/target/product/min_dev.mk:6:PRODUCT_NAME := min_dev
build/target/product/core.mk:2:PRODUCT_NAME :=
build/target/product/sim.mk:7:PRODUCT_NAME := sim
build/target/product/sdk.mk:37:PRODUCT_NAME := sdk
build/tools/buildinfo.sh:20:echo "ro.product.name=$PRODUCT_NAME"
lunch sample_addon-eng
lunch htc_dream-eng
lunch generic-eng
lunch 1
lunch sim-eng
TARGET_BUILD_TYPE=release
lunch 2
TARGET_BUILD_TYPE=debug
lunch   generic-user
.PHONY: systemtarball-nodeps
systemtarball-nodeps: $(FS_GET_STATS) \
                  $(filter-out systemtarball-nodeps stnod,$(MAKECMDGOALS))
$(build-systemtarball-target)
.PHONY: stnod
stnod: systemtarball-nodeps
systemimage-nodeps snod
./core/main.mk:BUILD_SYSTEM := $(TOPDIR)build/core
./core/main.mk:include $(BUILD_SYSTEM)/config.mk
./core/main.mk:include $(BUILD_SYSTEM)/cleanbuild.mk
./core/main.mk:include $(BUILD_SYSTEM)/version_defaults.mk
./core/main.mk:include $(BUILD_SYSTEM)/definitions.mk
./core/main.mk:include $(BUILD_SYSTEM)/Makefile
./core/static_java_library.mk:include $(BUILD_SYSTEM)/java_library.mk
./core/host_java_library.mk:include $(BUILD_SYSTEM)/base_rules.mk
./core/executable.mk:include $(BUILD_SYSTEM)/dynamic_binary.mk
./core/java_library.mk:include $(BUILD_SYSTEM)/java.mk
./core/binary.mk:include $(BUILD_SYSTEM)/base_rules.mk
./core/raw_executable.mk:include $(BUILD_SYSTEM)/binary.mk
./core/prebuilt.mk:include $(BUILD_SYSTEM)/base_rules.mk
./core/host_executable.mk:include $(BUILD_SYSTEM)/binary.mk
./core/combo/select.mk:$(combo_target)PRELINKER_MAP := $(BUILD_SYSTEM)/prelink-$(combo_os_arch).map
./core/shared_library.mk:include $(BUILD_SYSTEM)/dynamic_binary.mk
./core/config.mk:include $(BUILD_SYSTEM)/pathmap.mk
./core/config.mk:BUILD_COMBOS:= $(BUILD_SYSTEM)/combo
./core/config.mk:CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
./core/config.mk:BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
./core/config.mk:BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
./core/config.mk:BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
./core/config.mk:BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
./core/config.mk:BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
./core/config.mk:BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
./core/config.mk:BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
./core/config.mk:BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
./core/config.mk:BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
./core/config.mk:BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
./core/config.mk:BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
./core/config.mk:BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
./core/config.mk:BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
./core/config.mk:BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
./core/config.mk:BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
./core/config.mk:BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
./core/config.mk:BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
./core/config.mk:BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
./core/config.mk:HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh)
./core/version_defaults.mk:INTERNAL_BUILD_ID_MAKEFILE := $(wildcard $(BUILD_SYSTEM)/build_id.mk)
./core/config.mk:include $(BUILD_SYSTEM)/envsetup.mk
./core/config.mk:include $(BUILD_SYSTEM)/combo/select.mk
./core/config.mk:include $(BUILD_SYSTEM)/combo/select.mk
./core/config.mk:include $(BUILD_SYSTEM)/combo/javac.mk
./core/product_config.mk:include $(BUILD_SYSTEM)/node_fns.mk
./core/product_config.mk:include $(BUILD_SYSTEM)/product.mk
./core/product_config.mk:include $(BUILD_SYSTEM)/device.mk
./core/dynamic_binary.mk:include $(BUILD_SYSTEM)/binary.mk
./core/host_static_library.mk:include $(BUILD_SYSTEM)/binary.mk
./core/java.mk:include $(BUILD_SYSTEM)/base_rules.mk
./core/host_shared_library.mk:include $(BUILD_SYSTEM)/binary.mk
./core/key_char_map.mk:include $(BUILD_SYSTEM)/base_rules.mk
./core/package.mk:include $(BUILD_SYSTEM)/java.mk
./core/static_library.mk:include $(BUILD_SYSTEM)/binary.mk
./core/definitions.mk:include $(BUILD_SYSTEM)/distdir.mk
./core/envsetup.mk:include $(BUILD_SYSTEM)/product_config.mk
./tools/apicheck/Android.mk:include $(BUILD_SYSTEM)/base_rules.mk
./tools/dexpreopt/Android.mk:include $(BUILD_SYSTEM)/host_prebuilt.mk
COMMON_GLOBAL_CFLAGS:= -DANDROID -fmessage-length=0 -W -Wall -Wno-unused
COMMON_DEBUG_CFLAGS:=
COMMON_RELEASE_CFLAGS:= -DNDEBUG -UDEBUG
COMMON_PACKAGE_SUFFIX := .zip
COMMON_JAVA_PACKAGE_SUFFIX := .jar
COMMON_ANDROID_PACKAGE_SUFFIX := .apk
ACP := $(HOST_OUT_EXECUTABLES)/acp$(HOST_EXECUTABLE_SUFFIX)
AIDL := $(HOST_OUT_EXECUTABLES)/aidl$(HOST_EXECUTABLE_SUFFIX)
MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)
MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)
MKYAFFS2 := $(HOST_OUT_EXECUTABLES)/mkyaffs2image$(HOST_EXECUTABLE_SUFFIX)
APICHECK := $(HOST_OUT_EXECUTABLES)/apicheck$(HOST_EXECUTABLE_SUFFIX)
FS_GET_STATS := $(HOST_OUT_EXECUTABLES)/fs_get_stats$(HOST_EXECUTABLE_SUFFIX)
MKEXT2IMG := $(HOST_OUT_EXECUTABLES)/genext2fs$(HOST_EXECUTABLE_SUFFIX)
MKEXT2BOOTIMG := external/genext2fs/mkbootimg_ext2.sh
MKTARBALL := build/tools/mktarball.sh
DX := $(HOST_OUT_EXECUTABLES)/dx
LOCALIZE := $(HOST_OUT_EXECUTABLES)/localize$(HOST_EXECUTABLE_SUFFIX)
HOST_GLOBAL_LDFLAGS
TARGET_GLOBAL_LDFLAGS
PRIVATE_LDFLAGS
build/core/combo/linux-arm.mk:16:$(combo_target)NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined
save_CFLAGS="$CFLAGS -g   -mabi=aapcs-linux"
LDFLAGS='$LDFLAGS   -lX11 -lxml2 -lXdmcp -lXau -lexpat -lXrender -lXft   -lfontconfig -lfreetype -lz'  
--without-libtiff " # --with-gdktarget=directfb"
LDFLAGS=" -Wl,-rpath-link=$LD_LIBRARY_PATH   -L$PREFIX/lib   ${env_LDFLAGS} ${save_LDFLAGS}"
./vendor/marvell/external/alsa/alsa-lib/src/Mdroid.mk:43:LOCAL_CFLAGS += -mabi=aapcs-linux
./vendor/marvell/external/alsa/alsa-tools/Mdroid.mk:8:LOCAL_CFLAGS += -mabi=aapcs-linux
./vendor/marvell/littleton/libaudio/Mdroid.mk:22:LOCAL_CPPFLAGS += -mabi=aapcs-linux
./external/wpa_supplicant/Android.mk:35:L_CFLAGS += -mabi=aapcs-linux
./system/wlan/ti/sta_dk_4_0_4_32/CUDK/tiwlan_loader/Android.mk:88:LOCAL_CFLAGS = -Wall -Wstrict-prototypes
$(CLI_DEBUGFLAGS) -D__LINUX__ $(DK_DEFINES) -mabi=aapcs-linux
./kernel/arch/arm/Makefile
ifeq ($(CONFIG_AEABI),y)
CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork
else
CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
endif
# Need -Uarm for gcc /dev/mtdblock0
2.4.3 通过工具释放yaffs2 文件系统
yaffs2 image逆向工具
http://blog.csdn.net/absurd/archive/2008/11/05/3223825.aspx
获取源代码:
http://www.limodev.cn/bbs/download/file.php?id=1
2.5 虚拟文件系统(sysfs,proc,tsmpfs等)
2.5.1 虚拟文件系统概述
2.5.2 proc 文件系统
2.5.3 sysfs文件系统
2.5.4 tmpfs文件系统
2.5.5 usbdevfs文件系统
2.5.6 devpts文件系统
2.5.1 虚拟文件系统概述
虚拟内核文件系统(Virtual Kernel File Systems),是指那些是由内核产生但并不存在于硬盘上(存在于内存中)的文件系统,
他们被用来与内核进行通信前面介绍的ext2,ext3,jffs2,yaffs2等目录和文件,都是真真正正、实实在在的存储在具体的外部存
储设备上的,它们可能是在本机的硬盘、闪存、光盘中,可能保存在不只一个磁盘分区中,也可能保存在网络中其它主机的存储设备中的。
虚拟文件系统,虽然它们出现在根文件系统中,但它里面的内容却无法在任何外部存储设备中找到,因为它们都在内存中。
==========
android 网络挂载:
rootfs /       rootfs rw 0 0
/dev/root /       nfs rw,vers=2,rsize=1024,wsize=1024,...
tmpfs     /dev    tmpfs rw,mode=755 0 0
devpts /dev/pts   devpts rw,mode=600 0 0
proc    /proc     proc rw 0 0
sysfs     /sys    sysfs rw 0 0
tmpfs                /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
/dev/block/mmcblk0p1 /sdcard                 vfat rw,...
===========
android 本机挂载(使用flash中的文件系统)
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
/dev/block/mtdblock2 /system yaffs2 ro 0 0
/dev/block/mtdblock3 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mmcblk0p1 /sdcard vfat rw
=============
ubuntu 系统:
/dev/sda8 on /          type ext3   (rw,relatime,errors=remount-ro)
tmpfs     on /lib/init/rw   type tmpfs (rw,nosuid,mode=0755)
/proc     on /proc       type proc   (rw,noexec,nosuid,nodev)
sysfs     on /sys       type sysfs (rw,noexec,nosuid,nodev)
varrun on /var/run    type tmpfs (rw,nosuid,mode=0755)
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)
===============
2.5.2 proc 文件系统
proc是一个重要虚拟文件系统,通过它里面的一些文件,可以获取系统状态信息并修改某些系统的配置信息。proc文件系统本身不占用
磁盘空间,它仅存在于内存之中,为操作系统本身和应用程序之间的通信提供了一个安全的接口。当我们在内核中添加了新功能或设备驱
动时,经常需要得到一些系统状态的信息,一般这样的功能可能需要经过一些象ioctl()这样的系统调用来完成。系统调用接口对于一些
功能性的信息可能是适合的,因为应用程序必须将这些信息读出后再做一定的处理。但对于一些实时性的系统信息,例如内存的使用状况,
或者是驱动设备的统计资料等,我们更需要一个比较简单易用的接口来取得它们。proc文件系统就是这样的一个接口,我们可以简单的用
cat、strings程序来查看这些信息。例如,执行下面的命令:
cat /proc/filesystems //操作系统支持的文件系统类型
cat /proc/meminfo        //内存的实时信息,内存大小等
cat /proc/partitions     //存储器分区信息
cat /proc/cpuinfo        //查看cpu信息
同样的,free、df、top、ps等程序的功能实现,强烈依赖于proc文件系统,为了使用那些程序,一定要使内核支持proc文件系统,
并将其挂接到根文件系统的/proc目录下。
其他使用 /proc 文件系统的例子:
processor : 0
vendor_id : AuthenticAMD
processor : 1
vendor_id : AuthenticAMD
model name : AMD Athlon(tm) 64 X2 Dual Core CPU 5000+
1.vmware 虚拟机无法正常启动
在Linux下,单个进程的最大内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节),
例如 ubuntu 8.10 的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB)。
2.scratchbox 开发工具不能登录
/scratchbox/login
Inconsistency detected by ld.so: rtld.c: 1192: dl_main: Assertion `(void *) ph->p_vaddr ==
_rtld_local._dl_sysinfo_dso' failed!
NOTE: on Ubuntu installation, you have to disable VDSO to make Scratchbox work fine,
or you'll get errors like this:
在 ubuntu 系统中,我们必须关闭 VDSO 标记,以便scratchbox能正常工作
echo 0 | sudo tee /proc/sys/vm/vdso_enabled
echo 4096 | sudo tee /proc/sys/vm/mmap_min_addr
vm.vdso_enabled = 0
vm.mmap_min_addr = 4096
修改 /proc 文件系统值的方法
1.直接修改
echo "2147483648" | sudo tee /proc/sys/kernel/shmmax
echo 0 | sudo tee /proc/sys/vm/vdso_enabled
echo 4096 | sudo tee /proc/sys/vm/mmap_min_addr
2.将以下命令放入 /etc/rc.local 启动文件中:
echo "2147483648" > /proc/sys/kernel/shmmax
echo 0          > /proc/sys/vm/vdso_enabled
echo 4096       > /proc/sys/vm/mmap_min_addr
3.使用 sysctl 命令来更改 SHMMAX 的值:
sysctl -w kernel.shmmax=2147483648
4.内核参数插入到 /etc/sysctl.conf 启动文件中,使这种更改永久有效
echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
sudo sysctl –p
./system/core/logcat/logcat.cpp:403: fd = open("/proc/cmdline", O_RDONLY);
./system/core/init/init.c:553: char cmdline[1024];
./system/core/init/init.c:557: fd = open("/proc/cmdline", O_RDONLY);
./system/core/init/init.c:580: chmod("/proc/cmdline", 0440);
./system/core/init/bootchart.c:139: proc_read("/proc/cmdline", cmdline, sizeof(cmdline));
./system/core/init/bootchart.c:319: proc_read( "/proc/cmdline", cmdline, sizeof(cmdline) );
./system/core/init/bootchart.c:320: s = strstr(cmdline, KERNEL_OPTION);
./system/core/rootdir/init.rc:162: chown root radio /proc/cmdline
2.5.3 sysfs文件系统
与proc文件系统类似,sysfs文件系统也是一个不占有任何磁盘空间的虚拟文件系
统。它通常被挂接在/sys目录下。sysfs文件系统是Linux2.6内核引入的,它把连接在系
统上的设备和总线组织成为一个分级的文件,使得它们可以在用户空间存取。其实
sysfs是从proc和devfs中划分出来的。
一、devfs
linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。
在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道
/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件
系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:
不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多
的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。
二、sysfs
   正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个
虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用
这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个
kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也
就可以被用户空间读写了。用户空间的工具udev 就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,
而devfs却运行在内核空间,而且udev不存在 devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。
2.5.4 tmpfs文件系统
tmpfs 是Linux特有的文件系统,唯一的标准挂接点是/dev/shm。当然,用户可以将其挂接在其他地方。tmpfs有些像虚拟磁盘(ramdisk),
但不是一回事。说其像虚拟磁盘,是因为它可以使用你的RAM,但它也可以使用你的交换分区。传统的虚拟磁盘是一个块设备,而且需要一个mkfs
之类的命令格式化它才能使用。tmpfs是一个独立的文件系统,不是块设备,只要挂接,立即就可以使用。tmpfs的大下是不确定的,它最初只有
很小的空间,但随着文件的复制和创建,它的大小就会不断变化,换句话说,它会根据你的实际需要而改变大小;tmpfs的速度非常惊人,毕竟它
是驻留在RAM中的,即使用了交换分区,性能仍然非常卓越;由于tmpfs是驻留在RAM的,因此它的内容是不持久的,断电后,tmpfs的内容就消
失了,这也是被称作tmpfs的根本原因。
tmpfs 是ramfs的衍生物,用来限制缓存大小、向swap空间写入数据。它是用来保存VM所有文件的文件系统。
tmpfs中缓存的内容全部是临时的。一旦卸载,所有的内容都会遗失。它把所有的缓存置于内核,它的规模随着
文件的规模同步变化。但是它规模有大小限制,可以修改。它可以把当前不再需要的页写入到 swap空间。
tmpfs 和 ramfs 本身就是一个文件系统, 用的时候只需要直接挂载就可以. tmpfs可以使用ram, 也可以使用swap
共享内存的时候会使用tmpfs
系统默认共享内存是内存的一半大小! /dev/shm是挂载点!
通过 df -h 可以看出,默认状况下它为内存大小的一半:
文件系统        容量    已用    可用     已用% 挂载点
tmpfs 1013M 12K   1013M 1% /dev/shm
mount | grep tmpfs 显示当前系统中的 tmpfs:
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
varrun   on /var/run    type tmpfs (rw,nosuid,mode=0755)
varlock on /var/lock    type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
udev on /dev           type tmpfs (rw,mode=0755)
tmpfs on /dev/shm    type tmpfs (rw,nosuid,nodev)
lrm     on /lib/modules/2.6.27-4-generic/volatile type tmpfs (rw,mode=755)
2.5.6 usbdevfs文件系统
顾名思义,usbdevfs就是USB设备文件系统,它是一个动态生成的文件系统,有
些类似于proc文件系统。它的标准挂接点是/proc/bus/usb,当然,也可以挂接到其他
地方。它主要用于:用户级驱动、即插即用、提供USB设备信息、应用程序轮询
USB设备的变化等。
2.5.7 devpts文件系统
devpts文件系统为伪终端提供了一个标准接口,它的标准挂接点是/dev/pts。只要
pty的主复合设备/dev/ptmx被打开,就会在/dev/pts下动态的创建一个新的pty设备文
件。挂接时,UID、GID及其工作模式会指定给devpts文件系统的所有pty文件。这可
以保证伪终端的安全性。
讨论devpts文件系统的详细内容,已经超过本文范围,还请读者参考其他专
著。
2.6 一些必要重要的系统文件 ( /etc/fstab ,inittab,init.rc等)
2.6.1 /etc/inittab
2.6.2 /etc/init.d/rcS
2.6.3 /etc/fstab 文件
================
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.chinaunix.net/u2/89923/showart_1890405.html

你可能感兴趣的:(android linux 基础知识总结(1))