内网文件共享服务器器地址192.168.34.59,车间里有几百台电脑需要实时上传一个200K的文件,每

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
无线网络故障.doc 30页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
你可能关注的文档:
··········
··········
无线网络故障无线网络搭建故障1. 无线拓扑和搭建故障1.IEEE 802.11a 穿透障碍物能力差以前在家里使用 IEEE? 802.11b 无线网络。后来,将这套无线设备送给了朋友,又搭建了一个 IEEE? 802.11a 无线网络,数据传输速率的确快了很多。但是,很快便发现,原来无线网络可以工作的地方,现在却无法再无线接入了。请问,这是什么原因?答:I EEE?? 802.11a 工作频率是 5.8 G HzIEEE 802.11b 的工作频率是 2.4GHz,相比较而言,前者在穿透障碍物方面比后者要差得多。因此,虽然有了一个速度非常快的网络,但是,在家里有的地方完全无法收到信号。2.无线信号没有完全覆盖公司欲实现无线漫游。由于无线 AP 在室内有效传输距离大致为 2 0m ,于是,就每隔 40 米安装一台无线 AP 。但是,安装完成后发现有许多盲区,无线信号非常微弱。请问,应当如何解决?答:无线信号的覆盖范围是一个圆形,20m 的距离只是该圆形半径。因此,若每相隔 4 0m 安装一台无线 AP ,肯定就会存在许多盲区。当实现无线漫游时,多个 AP 信号覆盖区域应当相互交叉重叠,同时各个 AP 覆盖区域所占频道之间必须遵守一定的规范,邻近的相同频道之间不能相互覆盖,否则会造成 AP 在信号传输时的相互干扰,从而降低 AP 的工作效率。在可用的 11 个频道中,仅有 3 个频道是完全不覆盖的,分别是频道 1、频道 6 和频道 11,利用这些频道作为多蜂窝覆盖是最合适的。3.能穿越房间的无线产品小区采用光纤接入 Internet。但是,在客户端要用 EnterNet 等 ADSL 虚拟拨号软件上网。现在想在家里使用无线上网,是不是只需要一台无线 AP和无线网卡就可以了?是否需要用路由器?如果在无线 AP 与客户端之间隔一个房间,使用什么品牌的产品效果会比较好呢?答:若欲实现家庭的无线上网,可以选择无线路由器 + 无线网卡。无线路由与无线 AP 的价格相差不多,但是,无线路由在功能上相当于“无线 A P+ 宽带路由器”,并且通常拥有 4 个 L AN 口,所以,既适合家庭的纯无线网络接入,也可将以太网卡连接至无线网络。也就是说,如果台式机拥有以太网卡,只需使用双绞线连接至无线路由的 L AN 口,既可实现Internet 连接共享,也可实现与无线客户端的通讯与资源共享。从实践上看,Aa va ya 产品的穿透能力较强,在穿过两堵承重墙后,无线信号强度基本不受影响。4.无线 AP 的连接单位购买了两台 TP-Link 公司的 TL-WA200AP ,不知道如何实现无线 AP 之间的直接通讯,即每个无线 AP 各连接一台计算机,互相可以交换数据。答:通常情况下,若欲实现无线 AP 之间的连接应当采用点对点连接方式,即将无线 AP 设置为桥接方式。需要注意的是,TL-WA200? 仅提供 AP(接入点模式)和 AP Client(AP 用户端)两种工作模式。其中,接入点模式时,可以直接连接计算机;而 AP 用户端模式,不能连接计算机,而只能连接集线设备因此,应当将其中一台设置为“接入点模式”,直接连接至计算机;另一台设置为“AP 用户端模式”,通过集线设备连接至计算机。5.笔记本无线上网1 个 ADSL Modem + 1 个无线 AP + 3 块 PCMCIA 无线网卡+ 3 台笔记本,能否构建无线网络?ADSL? Modem 是否必须带路由功能?答:将 ADSL Modem 连接至无线 AP,笔记本可以有三种不同的 Internet 连接方式:第一,如果 ADSL Modem有路由功能,可以实现自动拨号,那么,笔记本就可以以无线方式连接Internet 了。第二,如果 ADSL Modem 不具有路由功能,无线AP 拥有路由功能(即无线路由器),那么,可以在无线路由中设置 PPPoE 自动拨号,笔记本同样可以以无线方式连接 Internet。第三,如果 Modem 和 AP 都不能自动拨号,那么,只要在笔记本上安装 PPPoE 虚拟拨号软件,也可以无线拨号上网。6.关闭窗户无线网络中断两台速度为 11Mbps 的 AP,分别放置在两栋大楼内,直线距离 60m 左右,关窗则无法建立连接,但将网卡和 AP 移到窗边并打开窗户就能建立连接,但数据传输不太稳定。请问,怎样解决?答:无线信号的穿透能力有限,关闭窗户后,无线信号变得更弱,从而导致数据传输不稳定。要使传输距离更长或增强发射功率,可以再购买单独的天线。否则,无线产品信号传输速度和稳定性受环境影响较大。如果手头儿没有匹配的天线,或不愿意再增加投资,建议通过调整天线的角度和产品位置,减少环境信号干扰等方法改善连接状态。另外,可以更换速度为 22Mbps(802.11b+)的无线产品网
正在加载中,请稍后...Android(25)
& ===================================================
linux ,Android基础知识总结
1. Android编译系统分析
2. 文件系统分析
3. 制作交叉工具链
4. 软件编译常识
5. 设置模块流程分析
6. linux系统启动流程分析
7. linux下svn使用指南
8. LFS 相关
9. linux 内核的初步理解
====================================================
================
android系统开发指南(常用环境的搭建和使用)
有的步骤会用到脚本简化操作,脚本通过svn服务器获取:
svn co svn://192.168.2.148/smartphone/td0901/release/images/scripts
用户名为各位的姓名拼音,密码与用户名相同
一& 编译android源码,制作文件系统
二&& ubuntu下烧录内核和文件系统
一& 编译android源码,制作文件系统
1. 开发主线源码位置:
svn://192.168.2.148/smartphone/td0901/trunk/cupcake-jianping& //cupcake 源代码
svn://192.168.2.148/smartphone/td0901/trunk/linux-2.6.28-a1&& //内核源代码
2. 打标的源代码位置
svn list svn://192.168.2.148/smartphone/td0901/tag
我们可以通过 svn list& svn://192.168.2.148/smartphone 查看svn版本库内核
更多信息请参卡以下文档:
智能平台开发部资料管理手册V1.0.doc
下svn操作指南及规范.doc
用户名为各位的姓名拼音,密码与用户名相同
3. 编译源码
进入 cupcake 工作拷贝的顶层目录,执行:
. ./make_image15.sh
部分执行结果:
out/target/product/littleton/root/&& 内核需要使用的 initramfs
out/target/product/littleton/system& 文件系统的系统分区
out/target/product/littleton/data/&& 文件系统数据分区
4. 编译内核
此处内核编译主要针对驱动组之外的同事
1& 设置工具链
内核的 linux-2.6.28-a1/Makefile 中设定了:
CROSS_COMPILE&&&&&&& ?= arm-linux-
所以设置PATH环境变量,保证能找到正确的工具链
假设工具链位于: /usr/local/marvell-arm-linux-4.1.1/ 设置为:
export PATH:=/usr/local/marvell-arm-linux-4.1.1/bin/:$PATH
2& 更改编译选项(网络启动或者本机启动)
内核顶层目录执行:
make menuconfig
General setup& ---&
Initial RAM filesystem and RAM disk (initramfs/initrd) support
&&& ()&&& Initramfs source file(s) (NEW)
如果需要支持网络启动反选& [] Initial RAM filesystem and RAM disk (initramfs/initrd) support
如果需要支持本地启动选中&
Initial RAM filesystem and RAM disk (initramfs/initrd) support
设置 ()&&& Initramfs source file(s) (NEW) 为 root
拷贝& cupcake 编译结果& out/target/product/littleton/root/& 到内核顶层目录
内核顶层目录执行 make zImage
编译好的内核:
arch/arm/boot/zImage
5. 搭建网络开发环境
1&& 安装nfs服务器
sudo apt-get install nfs-kernel-server nfs-common
2& 修改nfs服务器配置文件/etc/exports ,确保有以下配置项
/nfsroot/rootfs *(rw,no_root_squash,sync)
我们在内核中已经固定,手机通过网络方式启动,默认从 /nfsroot/rootfs
读取文件系统,修改配置项后需要重启nfs服务器:
sudo /etc/init.d/nfs-kernel-server restart
3& 配置网络根文件系统
拷贝& out/target/product/littleton/root/& 内容到& /nfsroot/rootfs 目录
拷贝& out/target/product/littleton/system 内容到& /nfsroot/rootfs/system
修改& /nfsroot/rootfs/init.rc 去掉几个mount命令
为了使大家的过程,结果统一,可以使用脚本 mkfs.cupcake 完成
在执行 mkfs.cupcake.nfs& 脚本前先到& cupcake-jianping 目录下执行: . ./make_env15.sh设置环境变量,
获取通过手动输入android源码的位置,让脚本来设置环境变量。
二&& ubuntu下烧录内核和文件系统
usb转串口线一根
usb转网卡线一根
2. 软件环境
1& tftp 服务器
执行脚本: setup_tftpd.sh 安装和配置tftp服务器,我们默认以 /tftpboot
为 tftp服务器的根目录,需要下载的文件都放在该目录下。
2& 获取待烧录的镜像文件
svn list svn://192.168.2.148/smartphone/td0901/release/images 查看服务器上的
版本情况,通常我们下载最新的,例如,下载9月18号发布的版本:
svn co svn://192.168.2.148/smartphone/td0901/release/images/images
3& 烧录镜像文件
用以下文件为例,示范通过tftp烧写内核和文件系统
内核&&&&&&&&&& zImage0917
系统分区: system0918.img&
数据分区&&& data0918.img
待烧写的以上文件必须存在于tftp服务器根目录/tftpboot下。
具体步骤:
首先连接好硬件设备进入blob下载模式
1& blob 起来后按任意键
Processing obm parameters...
Can't detect micco. Set PMIC as normal I2C mode.
NAND flash(Manu=0x98 Device=0xba) detected!
Slot 0 Found
get relocation table
Found Main Bad block table at address 0x0f000000, version 0x01
Found Mirror Bad block table at address 0x0efc0000, version 0x01
Consider yourself BLOBed!
blob version 2.0.5-pre3 for Marvell Littleton
Copyright (C) 01
Jan-Derk Bakker and Erik Mouw
blob comes with ABSOLUTELY NO WARRANTY; read the GNU GPL for details.
This is free software, and you are welcome to redistribute it
unde read the GNU GPL for details.
length not align with page size, change to 0x0
Read flash from 0x60000, length 0x0
Autoboot (2 seconds) in progress, press any key to stop ..
Autoboot aborted
Type &help& to get a list of commands
2& 通过 tftp 下载内核到pc内存 0x 地址处
blob& tftp zImage0917
Begin init ether usbnet!!!
***** Plug-in USB cable & config usbdnet now ******
exit check_usb_connection:1
TFTPing zImage0917*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ OK.
received 6144 blocks (3145156 bytes)
tftp_cmd: file 'zImage0917' loaded via tftp to address 0x.
3& 擦除原来的内核分区,0x100000 为分区起始地址,0x300000为分区长度
blob& nanderase -z 0xx400000
the current NAND chip does not support Block Unlocking.
Erase 0x300000 length data from flash: 0x100000
Erase flash from 0x100000, length 0x300000
........................Done
4& 烧写内存 0x 开始 实际长度为 3145156 的内核数据到起始地址为 0x100000 的内核分区
blob& nandwrite -z 0xx5156
the current NAND chip does not support Block Unlocking.
Write 0x2ffdc4 length data from RAM: 0x to flash: 0x100000
Write flash from 0x100000, length 0x2ffdc4
Erase flash from 0x100000, length 0x300000
........................Done
........................Done
5& 下载系统分区镜像文件到pc内存 0x 地址处
blob& tftp system0918.img
TFTPing system0918.img*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ OK.
received 113138 blocks ( bytes)
tftp_cmd: file 'system0918.img' loaded via tftp to address 0x.
6& 擦除原来的flash系统分区
blob& nanderase -z 0xx4000000
the current NAND chip does not support Block Unlocking.
Erase 0x3e0f800 length data from flash: 0x400000
Erase flash from 0x400000, length 0x3e0f800
...................................................................................
...................................................................................
...................................................................................
..........................Done
7& 烧写数据到flash系统分区
blob& nandwrite -y 0xx25824
the current NAND chip does not support Block Unlocking.
Write 0x373e0c0 length data from RAM: 0x to flash: 0x400000
Write flash from 0x400000, length 0x3591800
Erase flash from 0x400000, length 0x3591800
....................................................................................
.....................................................................................
................................................................................Done
....................................................................................
....................................................................................
................................................................Done
8& 下载数据分区镜像文件到pc内存 0x 地址处
blob& tftp data0918.img
TFTPing data0918.img*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ OK.
received 33992 blocks ( bytes)
tftp_cmd: file 'data0918.img' loaded via tftp to address 0x.
9& 擦除原来的flash数据分区
blob& nanderase -z 0xxBB00000
the current NAND chip does not support Block Unlocking.
Erase 0xa81f000 length data from flash: 0x4400000
Erase flash from 0x4400000, length 0xa81f000
.....................................................................................
.....................................................................................
.....................................................................................
.....................................................................................
...................................................Done
10& 烧写数据镜像到flash数据分区
blob& nandwrite -y 0xx02880
the current NAND chip does not support Block Unlocking.
Write 0x1098c00 length data from RAM: 0x to flash: 0x4400000
Write flash from 0x4400000, length 0x1018000
Erase flash from 0x4400000, length 0x1018000
..................................................................................Done
..................................................................................Done
flash分区图:
*******************************************
*&&&&&&& *&&&&&&&&& *&&&&&&&& *&&&&&&&&&& *
*& blob& *& kernel& *& system *&&& data&& *
*&&&&&&& *&&&&&&&&& *&&&&&&&& *&&&&&&&&&& *
*******************************************
nanderase -z 0xx400000
tftp zImage
nandwrite -z 0xx100000
烧写system.img:
nanderase -z 0xx4000000
tftp system.img
nandwrite -y 0xx500000
烧写 userdata.img :
nanderase -z 0xxBB00000
tftp userdata.img
nandwrite -y 0xx4500000
============================
涉及的内容:
svn服务器的使用
android的编译系统,原理,工具链,辅助工具,参数等,环境变量,怎样单独添加编译一个单独的模块等。
android 的编译结果:文件系统分析
文件系统的使用,启动流程
设置模块流程分析
============================
====================================================
1. Android编译系统分析
编译脚本及系统变量
build/envsetup.sh脚本分析
在编译源代码之前通常需要在android源代码顶层目录执行 . ./build/envsetup.sh 目的是为了使用
脚本 envsetup.sh 里面定义了一些函数:
function help()
function get_abs_build_var()
function get_build_var()
function check_product()
function check_variant()
function setpaths()
function printconfig()
function set_stuff_for_environment()
function set_sequence_number()
function settitle()
function choosetype()
function chooseproduct()
function choosevariant()
function tapas()
function choosecombo()
function print_lunch_menu()
function lunch()
function gettop
function m()
function findmakefile()
function mm()
function mmm()
function croot()
function pid()
function gdbclient()
function jgrep()
function cgrep()
function resgrep()
function getprebuilt
function tracedmdump()
function runhat()
function getbugreports()
function startviewserver()
function stopviewserver()
function isviewserverstarted()
function smoketest()
function runtest()
function runtest_py()
function godir ()
choosecombo 命令分析:
function choosecombo()
&&& choosesim $1
&&& choosetype $2
&&& chooseproduct $3
&&& choosevariant $4
&&& set_stuff_for_environment
&&& printconfig
会依次进行如下选择:
Build for the simulator or the device?
&&&& 1. Device
&&&& 2. Simulator
Which would you like? [1]
Build type choices are:
&&&& 1. release
&&&& 2. debug
Which would you like? [1]
Product choices are:
&&&& 1. emulator
&&&& 2. generic
&&&& 3. sim
&&&& 4. littleton
You can also type the name of a product if you know it.
Which would you like? [littleton]
Variant choices are:
&&&& 1. user
&&&& 2. userdebug
&&&& 3. eng
Which would you like? [eng] user
默认选择以后会出现:
TARGET_PRODUCT=littleton
TARGET_BUILD_VARIANT=user
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
==========
function chooseproduct()函数分析:
choices=(`/bin/ls build/target/board/*/BoardConfig.mk vendor/*/*/BoardConfig.mk 2& /dev/null`)
读取 build/target/board/* 目录下的板配置文件:BoardConfig.mk
读取 vendor/*/*/目录下的板配置文件:BoardConfig.mk
choices 的值为:
build/target/board/emulator/BoardConfig.mk
build/target/board/generic/BoardConfig.mk
build/target/board/sim/BoardConfig.mk
vendor/marvell/littleton/BoardConfig.mk
&&& for choice in ${choices[@]}&&&&&&&&&&&&&&&
&&&&&&& # The product name is the name of the directory containing
&&&&&&& # the makefile we found, above.
&&&&&&& prodlist=(${prodlist[@]} `dirname ${choice} | xargs basename`)
的处理,prodlist的值为:
emulator generic sim littleton
所以选择菜单为:
Product choices are:
&&&& 1. emulator
&&&& 2. generic
&&&& 3. sim
&&&& 4. littleton
如果选择 4,那么 TARGET_PRODUCT 被赋值为: littleton。
board_config_mk := /
&&&&&&& $(strip $(wildcard /
&&&&&&&&&&&&&&& $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
&&&&&&&&&&&&&&& vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
&&&&&&& ))
怎样添加一个模块
LOCAL_PATH:= $(call my-dir)
#编译静态库
include $(CLEAR_VARS)
LOCAL_MODULE = libhellos
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hellos.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhellos
LOCAL_COPY_HEADERS := hellos.h
include $(BUILD_STATIC_LIBRARY)
#编译动态库
include $(CLEAR_VARS)
LOCAL_MODULE = libhellod
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hellod.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhellod
LOCAL_COPY_HEADERS := hellod.h
include $(BUILD_SHARED_LIBRARY)
BUILD_TEST=true
ifeq ($(BUILD_TEST),true)
#使用静态库
include $(CLEAR_VARS)
LOCAL_MODULE := hellos
LOCAL_STATIC_LIBRARIES := libhellos
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS += -ldl
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := mains.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)
#使用动态库
include $(CLEAR_VARS)
LOCAL_MODULE := hellod
LOCAL_MODULE_TAGS := debug
LOCAL_SHARED_LIBRARIES := libc libcutils libhellod
LOCAL_LDLIBS += -ldl
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := maind.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)
endif # ifeq ($(WPA_BUILD_SUPPLICANT),true)
########################
#local_target_dir := $(TARGET_OUT)/etc/wifi
#include $(CLEAR_VARS)
#LOCAL_MODULE := wpa_supplicant.conf
#LOCAL_MODULE_TAGS := user
#LOCAL_MODULE_CLASS := ETC
#LOCAL_MODULE_PATH := $(local_target_dir)
#LOCAL_SRC_FILES := $(LOCAL_MODULE)
#include $(BUILD_PREBUILT)
########################
系统变量解析
LOCAL_MODULE&&&& - 编译的目标对象
LOCAL_SRC_FILES& - 编译的源文件
LOCAL_C_INCLUDES - 需要包含的头文件目录
LOCAL_SHARED_LIBRARIES - 链接时需要的外部库
LOCAL_PRELINK_MODULE&& - 是否需要prelink处理
BUILD_SHARED_LIBRARY&& - 指明要编译成动态库
LOCAL_PATH - 编译时的目录
$(call 目录,目录….) 目录引入操作符
如该目录下有个文件夹名称 src,则可以这样写 $(call src),那么就会得到 src 目录的完整路径
include $(CLEAR_VARS) -清除之前的一些系统变量
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
在 build/core/config.mk 定义 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
通过include 包含自定义的.mk文件(即是自定义编译规则)或是引用系统其他的.mk文件(系统定义的编译规则)。
LOCAL_SRC_FILES - 编译的源文件
可以是.c, .cpp, .java, .S(汇编文件)或是.aidl等格式
不同的文件用空格隔开。如果编译目录子目录,采用相对路径,如子目录/文件名。也可以通过$(call 目录),指明编译某目录
下所有.c/.cpp/.java/.S/ .aidl文件.追加文件 LOCAL_SRC_FILES += 文件
LOCAL_C_INCLUDES - 需要包含的头文件目录
可以是系统定义路径,也可以是相对路径. 如该编译目录下有个include目录,写法是include/*.h
LOCAL_SHARED_LIBRARIES& - 链接时需要的外部共享库
LOCAL_STATIC_LIBRARIES& - 链接时需要的外部外部静态
LOCAL_JAVA_LIBRARIES&&&& 加入jar包
LOCAL_MODULE - 编译的目标对象
module 是指系统的 native code,通常针对c,c++代码
./system/core/sh/Android.mk:32:LOCAL_MODULE:= sh
./system/core/libcutils/Android.mk:71:LOCAL_MODULE := libcutils
./system/core/cpio/Android.mk:9:LOCAL_MODULE := mkbootfs
./system/core/mkbootimg/Android.mk:8:LOCAL_MODULE := mkbootimg
./system/core/toolbox/Android.mk:61:LOCAL_MODULE:= toolbox
./system/core/logcat/Android.mk:10:LOCAL_MODULE:= logcat
./system/core/adb/Android.mk:65:LOCAL_MODULE := adb
./system/core/adb/Android.mk:125:LOCAL_MODULE := adbd
./system/core/init/Android.mk:20:LOCAL_MODULE:= init
./system/core/vold/Android.mk:24:LOCAL_MODULE:= vold
./system/core/mountd/Android.mk:13:LOCAL_MODULE:= mountd
LOCAL_PACKAGE_NAME
Java 应用程序的名字用该变量定义
./packages/apps/Music/Android.mk:9:LOCAL_PACKAGE_NAME := Music
./packages/apps/Browser/Android.mk:14:LOCAL_PACKAGE_NAME := Browser
./packages/apps/Settings/Android.mk:8:LOCAL_PACKAGE_NAME := Settings
./packages/apps/Stk/Android.mk:10:LOCAL_PACKAGE_NAME := Stk
./packages/apps/Contacts/Android.mk:10:LOCAL_PACKAGE_NAME := Contacts
./packages/apps/Mms/Android.mk:8:LOCAL_PACKAGE_NAME := Mms
./packages/apps/Camera/Android.mk:8:LOCAL_PACKAGE_NAME := Camera
./packages/apps/Phone/Android.mk:11:LOCAL_PACKAGE_NAME := Phone
./packages/apps/VoiceDialer/Android.mk:8:LOCAL_PACKAGE_NAME := VoiceDialer
BUILD_SHARED_LIBRARY - 指明要编译成动态库。
编译的目标,用include 操作符
UILD_STATIC_LIBRARY来指明要编译成静态库。
如果是java文件的话,会用到系统的编译脚本host_java_library.mk,用BUILD_PACKAGE来指明。三个编译
-------------------
include $(BUILD_STATIC_LIBRARY)
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
-------------------
include $(BUILD_SHARED_LIBRARY)
./build/core/config.mk:50:BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
-------------------
include $(BUILD_HOST_SHARED_LIBRARY)
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
-------------------
include $(BUILD_EXECUTABLE)
build/core/config.mk:51:BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
-------------------
include $(BUILD_HOST_EXECUTABLE)
./build/core/config.mk:53:BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
-------------------
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
-------------------
BUILD_JAVA_LIBRARY
./build/core/config.mk:58:BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
------------------
BUILD_STATIC_JAVA_LIBRARY 编译静态JAVA库
./build/core/config.mk:59:BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
------------------
BUILD_HOST_JAVA_LIBRARY&& 编译本机用的JAVA库
./build/core/config.mk:60:BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
------------------
BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
============
LOCAL_PRELINK_MODULE
&&&&&&& Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,
是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。程序运行时的
动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。
&&&&&&& 动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接
动作都是完全相同的,对于嵌入式系统来说尤其如此。因此,这一过程可以改在运行时之前就可以预先处理好,即花一些时间
利用Prelink工具对动态共享库和可执行文件进行处理,修改这些二进制文件并加入相应的重定位等信息,节约了本来在程序
启动时的比较耗时的查询函数地址等工作,这样可以减少程序启动的时间,同时也减少了内存的耗用。
&&&&&&& Prelink的这种做法当然也有代价:每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保
证有效,因为新的共享库中的符号信息、地址等很可能与原来的已经不同了,这就是为什么 android framework代码一改动,
这时候就会导致相关的应用程序重新被编译。
这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度,不过好在对用户来说几乎是可以忽略的。
--------------------
变量设置为false那么将不做prelink操作
LOCAL_PRELINK_MODULE := false
默认是需要prlink的,同时需要在 build/core/prelink-linux-arm.map 中加入
libhellod.so&&&&& 0x
这个map文件好像是制定动态库的地址的,在前面注释上面有一些地址范围的信息,注意库与库之间的间隔数,
如果指定不好的话编译的时候会提示说地址空间冲突的问题。另外,注意排序,这里要把数大的放到前面去,
按照大小降序排序。
解析 LOCAL_PRELINK_MODULE 变量
build/core/dynamic_binary.mk:94:ifeq ($(LOCAL_PRELINK_MODULE),true)
ifeq ($(LOCAL_PRELINK_MODULE),true)
$(prelink_output): $(prelink_input) $(TARGET_PRELINKER_MAP) $(APRIORI)
&&&&&&& $(transform-to-prelinked)
transform-to-prelinked定义:
./build/core/definitions.mk:1002:define transform-to-prelinked
define transform-to-prelinked
@mkdir -p $(dir $@)
@echo &target Prelink: $(PRIVATE_MODULE) ($@)&
$(hide) $(APRIORI) /
&&&&&&&&&&&&&&& --prelinkmap $(TARGET_PRELINKER_MAP) /
&&&&&&&&&&&&&&& --locals-only /
&&&&&&&&&&&&&&& --quiet /
&&&&&&&&&&&&&&& $/build/tools/apriori”
参考文档:
动态库优化——Prelink(预连接)技术
===============
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)
ifeq ($(TARGET_BUILD_TYPE),release)
&&&&&&& LOCAL_CFLAGS += -O2
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
LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_h264dec_wmmx2lnx lib_il_mpeg4aspdec_wmmx2lnx
====================
其他一些变量和脚本:
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
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 sim-eng
TARGET_BUILD_TYPE=release
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
CFLAGS_ABI&&&&&&& :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
# Need -Uarm for gcc /dev/mtdblock0
2.4.3 通过工具释放yaffs2 文件系统
yaffs2 image逆向工具
获取源代码:
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=
/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=
/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默认值为字节(bytes/MB)。
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 && | 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 && & /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=
4.内核参数插入到 /etc/sysctl.conf 启动文件中,使这种更改永久有效
echo &kernel.shmmax=& && /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中划分出来的。
&& linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。
在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道
/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件
系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:
不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多
的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。
&&&&& 正因为上述这些问题的存在,在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
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()
&&& read_inittab();
/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&
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
-------------------
挂在 /etc/fstab 中的文件系统
/bin/mount -a
. /etc/default/rcS
. /etc/profile
#屏幕叫准备
. /etc/X11/run-calibrate
. /etc/X11/Xserver
. /etc/scripts/testd-bus.sh
#启动dbus消息总线
#启动gpephone
-------------------
ubuntu 系统
---------------
exec /etc/init.d/rc S
---------------
会依此执行 /etc/rcS.d/ 下以
S01mountkernfs.sh
S02hostname.sh
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
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&& % /
ubuntu 的/boot/grub/menu.lst参数:
kernel&&&&&&&&&&&&&&& /vmlinuz-2.6.27-4-generic root=UUID=2ffa7dc6-2dc5-4b66-6951a
&&&&&&&&&&&&&&& 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
嵌入式系统文件系统比较
LINUX系统性能调谐
怎样限制或者修改/dev/shm的大小
====================================================================
====================================================================
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。
要构建出一个交叉工具链,需要解决三个问题。一是这个工具链必须是可以运行在原工作站平台上的。二是我们需要更换一个与目标平台对应的
汇编器,使得工具链能产生对应的目标代码,三是要更换一套与目标平台对应的二进制库,使得工具链在连接时能找到正确的二进制库。
3.2 获取交叉工具链的几种途径
3.2.1 利用源代码制作交叉工具链
网上直接下载工具链或者从方案商处获取(如:marvell)
下载地址:
3.2.2 用脚本制作工具链
3.2.2.1 croostool-0.43
制作工具链的源码包搭配情况:
3.2.2.2 buildroot
若想详细地了解buildroot可参考该文档
3.2.3 利用OE制作工具链
3.3 android工具链与gnu工具链的比较
Android所用的Toolchain(即交叉编译工具链)可从下面的网址下载:
。如果下载了完整的Android项目的源代码,则可以在
“/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin”目录下找到交叉编译工具,比如Android所用的
arm-eabi-gcc-4.2.1。Android并没有采用glibc作为C库,而是采用了Google自己开发的Bionic Libc,它的官方Toolchain也是基于
Bionic Libc而并非glibc的。这使得使用或移植其他Toolchain来用于Android要比较麻烦:在Google公布用于Android的官方Toolchain之前,
多数的Android爱好者使用的Toolchain是在 下载的一个通用的
Toolchain,它用来编译和移植Android 的Linux内核是可行的,因为内核并不需要C库,但是开发Android的应用程序时,直接采用或者移植其他
的Toolchain都比较麻烦,其他Toolchain编译的应用程序只能采用静态编译的方式才能运行于Android模拟器中,这显然是实际开发中所不能接
受的方式。目前尚没有看到说明成功移植其他交叉编译器来编译Android应用程序的资料。
与glibc相比,Bionic Libc有如下一些特点:
-&&&&&&&&& 采用BSD License,而不是glibc的GPL License;
-&&&&&&&&& 大小只有大约200k,比glibc差不多小一半,且比glibc更快;
-&&&&&&&&& 实现了一个更小、更快的pthread;
-&&&&&&&&& 提供了一些Android所需要的重要函数,如”getprop”, “LOGI”等;
-&&&&&&&&& 不完全支持POSIX标准,比如C++ exceptions,wide chars等;
-&&&&&&&&& 不提供libthread_db 和 libm的实现
另外,Android中所用的其他一些二进制工具也比较特殊:
-&&&&&&&&& 加载动态库时使用的是/system/bin/linker而不是常用的/lib/ld.
-&&&&&&&&& prelink工具不是常用的prelink而是apriori,其源代码位于” /build/tools/apriori”
-&&&&&&&&& strip工具也没有采用常用的strip,即“/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin”
目录下的arm-eabi-strip,而是位于/out/host/linux-x86/bin/的soslim工具。
参考文档:
CLFS2.0原理分析
Cross-Compiled Linux From Scratch
全手工制作arm-linux交叉编译工具链《一》
自己制作arm-linux交叉编译环境(一)-scratch篇
如何建立交叉编译工具链
Android Toolchain与Bionic Libc
ndroid编译环境(2) - 手工编译C模块
=================================================
=================================================
4. 软件编译常识
4.1 链接器和加载器
4.2 android 的标准链接器和加载器
4.3 Makefile基本语法
何为链接器和加载器?
链接器为ld,加载为ld-linux.so.2,两个的区别很大,一个编译时用,一个运行时用,ld负责在编译的搜索路径里找到要求的库,并查看
是否有提供了需要的 符号(如函数等),如果有,记录相关信息到程序中,由ld-linux.so.2在执行时查找到该库,并根据相关信息进行需
要符号的重定位等工作.注意 这两者的搜索库的方式是不同的。
动态连接器通常是指的动态加载器(不要与 Binutils 里的标准连接器 ld 混淆了)。动态连接器由 Glibc 提供,用来
找到并加载一个程序运行时所需的共享库,在做好程序运行的准备之后,运行这个程序。动态连接器的名称通常是
ld-linux.so.2,标准连接器 ld 由 Binutils 这个包提供。
标准连接器
查看gcc使用的标准连接器
arm-linux-gcc -print-prog-name=ld
编译时库的搜索路径,以下几种方式让连接器去找需要的库
1. 编译的时候明确指定,如: gcc test.c& ./say.so -o test中的&& ./say.so
2. 编译 Binutils 的时候通过LIB_PATH 变量指定,
如:make -C ld LIB_PATH=/tools/lib
-C ld LIB_PATH=/tools/lib
这个选项重新编译 ld 子目录中的所有文件。在命令行中指定 Makefile 的 LIB_PATH 变量值,使它明确指向/tools/lib工具目录,
以覆盖默认值。这个变量的值指定了连接器的默认库搜索路径。
来源:Linux From Scratch - 版本 6.4第 5 章 构建临时系统& 5.4. Binutils-2.18 - 第一遍
3. 在源码包configure的时候通过& --with-lib-path 指定,或者 --lib- path
binutils-2.18/configure --prefix=/tools --disable-nls --with-lib-path=/tools/lib
配置选项的含义:
--with-lib-path=/tools/lib
&&& 告诉配置脚本在为编译 Binutils 的过程中使用正确的库搜索路径,也就是将 /tools/lib 传递给连接器。这防止连接器搜索宿主系统中的库文件目录。
来源: Linux From Scratch - 版本 6.4 第 5 章 构建临时系统& lfs 5.13. Binutils-2.18 - 第二遍
4. 到 ld –verbose | grep SEARCH 列出的默认目录下去找
5. -L/usr/gpephone/lib 指定的目录找
经常以 LDFLAGS=& -L/usr/gpephone/lib& -L/lib -L/usr/lib -L/usr/X11R7/lib& 的方式传入
参数 -rpath 与& -rpath-link
如果使用了'-rpath'选项, 那运行时搜索路径就只从'-rpath'选项中得到
'nodefaultlib'标志一个对象,使在搜索本对象所依赖的库时,忽略所有缺省库搜索路径.
LDFLAGS=&-Wl,-rpath-link=/usr/gpephone/lib/:/usr/gphone/lib:/usr/local/lib& -L/usr/gpephone/lib& -L/usr/gphone/lib&
-rpath 与& -rpath-link 的特性:
1. 在编译的时候我们都可以使用这两个路径,
2. '-rpath'跟'-rpath_link'的不同之处在于,由'-rpath'指定的路径会被包含到可执行程序中,并在运行时使用,
而'-rpath-link'选项仅仅在链接时起作用。
-dumpspecs&&&&&&&&&&&&&& Display all of the built in spec strings
& -dumpversion&&&&&&&&&&&& Display the version of the compiler
& -dumpmachine&&&&&&&&&&&& Display the compiler's target processor
& -print-search-dirs&&&&&& Display the directories in the compiler's search path
& -print-prog-name=& Display the full path to compiler component
& -specs=&&&&&&&&&&& Override built-in specs with the contents of
& -Wa,&&&&&&&&&&& Pass comma-separated& on to the assembler
& -Wp,&&&&&&&&&&& Pass comma-separated& on to the preprocessor
& -Wl,&&&&&&&&&&& Pass comma-separated& on to the linker
从工具链内建的规范中查看动态加载器
gcc -dumpspecs | grep& dynamic-linker& //本机
查看编译起所指定的动态加载器
1. s3c2440 (arm9tdmi) 平台的工具链
/scratchbox/compilers/arm-9tdmi-softfloat-linux-gcc-3.4.4-glibc-2.3.5/bin/arm-softfloat-linux-gnu-gcc -dumpspecs | grep& dynamic-linker
/scratchbox/compilers/arm-softfloat-linux-gcc-3.4.4-glibc-2.3.5/bin/arm-softfloat-linux-gnu-gcc -dumpspecs | grep& dynamic-linker
2. marvell 的工具链
/scratchbox/compilers/marvell-arm-linux-4.1.1/bin/arm-linux-gcc& -dumpspecs | grep& dynamic-linker
3. scrathbox 中工具链 host-gcc
/scratchbox/compilers/host-gcc/bin/host-gcc& -dumpspecs | grep& dynamic-linker
如果我们在编译的时候给编译起 gcc 指定 -specs=/scratchbox/compilers/host-gcc/host-gcc.spec ,那么-specs指定
的规范将会覆盖工具链内建的规范。
cat /scratchbox/compilers/host-gcc/host-gcc.specs& | grep ld 有如下内容:
-dynamic-linker /scratchbox/host_shared/lib/ld.so
/scratchbox/compilers/host-gcc/bin/gcc -specs=/scratchbox/compilers/host-gcc/host-gcc.specs
./gcc -dumpspecs|grep dynamic-linker
gcc -dumpspecs | sed 's@/lib/ld-linux.so.2@/tools&@g'& | sudo tee& `dirname $(gcc -print-libgcc-file-name)`/specs
cat `dirname $(gcc -print-libgcc-file-name)`/specs | grep tools
查看本机应用程序使用的动态加载器
readelf -l /usr/bin/make | grep interpreter
[Requesting program interpreter: /lib/ld-linux.so.2]
查看 scratchbox 中应用程序使用的动态加载器
readelf -l /scratchbox/tools/bin/make | grep interpreter
[Requesting program interpreter: /scratchbox/host_shared/lib/ld.so]
cd ~/svn/mohuifu.svn/trunk/mysource/compiler_test
/scratchbox/compilers/host-gcc/bin/gcc -specs=/scratchbox/compilers/host-gcc/host-gcc.specs -o ld.so.test1 ld.so.test.c
/scratchbox/compilers/host-gcc/bin/gcc -o ld.so.test2 ld.so.test.c
readelf -l ./ld.so.test1 | grep interpreter
readelf -l ./ld.so.test2 | grep interpreter
其他示例:
readelf -l /scratchbox/tools/bin/make | grep interpreter
readelf -l /usr/bin/make | grep interpreter
分别显示:
[Requesting program interpreter: /scratchbox/host_shared/lib/ld.so]
[Requesting program interpreter: /lib/ld-linux.so.2]
下面的方式也可以查看应用程序所使用的加载器
strings& /scratchbox/tools/bin/make& |grep lib
strings& /usr/bin/make& |grep lib
/scratchbox/host_shared/lib/ld.so
/lib/ld-linux.so.2
查看应程序加载器库的搜索路径
显示 scratchbox 中加载器的库搜索路径
strings /scratchbox/host_shared/lib/ld.so |grep lib
display library search paths
/scratchbox/host_shared/lib/
/scratchbox/tools/lib/
显示本机中加载器的库搜索路径
strings& /lib/ld-linux.so.2 |grep lib
display library search paths
/lib/i486-linux-gnu/
/usr/lib/i486-linux-gnu/
ldd 验证应用程序所使用动态库
ldd /scratchbox/tools/bin/make
&&&&&&& libc.so.6 =& /scratchbox/host_shared/lib/libc.so.6 (0xb7ef9000)
&&&&&&& /scratchbox/host_shared/lib/ld.so =& /scratchbox/host_shared/lib/ld.so (0xb802f000)
ldd /usr/bin/make
&&&&&&& librt.so.1 =& /lib/tls/i686/cmov/librt.so.1 (0xb7fb9000)
&&&&&&& libc.so.6 =& /lib/tls/i686/cmov/libc.so.6 (0xb7e5b000)
&&&&&&& libpthread.so.0 =& /lib/tls/i686/cmov/libpthread.so.0 (0xb7e42000)
&&&&&&& /lib/ld-linux.so.2 (0xb7fd5000)
参考文档:
交叉编译中libtool相关的问题
静态库和共享库库的定位搜索路径
Linux动态连接原理
程序编译链接运行时对库关系的探讨(原创)
[Linux命令] ld 中文使用手册完全版(译)
scratchbox 是mameo (nokia) 提供的一个集成开发环境,可以去官方网站:
4.2 android 的标准链接器和加载器
android的标准链接器 ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-ld
android 中标准连接器搜索库的路径
./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-ld -verbose | grep SEARCH
SEARCH_DI

我要回帖

更多关于 局域网文件共享服务器 的文章

 

随机推荐