Linux 编 译 环 境 Amlogic Beijing Zhouzhi 2009-12-7
主 题 基 本 目 录 结 构 和 功 能 Kernel 目 录 结 构 Common 目 录 结 构 Packages 目 录 结 构 Ui_ref 目 录 结 构 主 要 编 译 命 令 工 具 链
基 本 目 录 结 构 Common Kernel ROOT Packages Busybox UI_ref
基 本 目 录 结 构 [Kernel]: 内 核 代 码 [Busybox]: Linux 下 简 单 基 本 的 工 具 集 [Packages]: 应 用 程 序 软 件 包, 包 括 基 本 的 开 源 库, 和 我 们 测 试 代 码, 演 示 程 序 ; [Common]:Makefile 和 编 译 工 具 以 及 不 同 开 发 板 的 配 置 代 码 ; [ui_ref]: 用 户 开 发 目 录
Kernel 目 录 结 构 [Arch] 架 构 相 关 代 码, 包 括 arm,mips,sh,spark,x86, [Block] 块 设 备 基 础 代 码 ; [Crypto] 加 密 相 关 [Documentation]kernel 相 关 文 档 [Drivers] 驱 动 相 关 代 码 [Fs] 文 件 系 统 相 关 代 码 [Include] 共 享 头 文 件 目 录 [Init] 系 统 系 统 代 码 [Ipc]IPC 通 信,Message Queue 等 相 关 代 码 [Kernel] 内 核 进 程 管 理 相 关 目 录
Kernel 目 录 结 构 [Lib] 基 本 库 代 码, 标 准 C 库 的 内 核 实 现,memcpy 等 ; [Mm] 内 存 管 理 相 关 代 码 ; [Net] 网 络 核 心 代 码 ; [Samples] 内 核 模 块 模 块 的 一 些 示 例 代 码 ; [Scripts] 编 译 内 核 的 一 些 基 本 脚 本 ; [Security] 内 核 安 全 性 代 码 ; [Sound] 音 频 处 理 的 核 心 和 音 频 驱 动 代 码 ; [Tools] 基 本 工 具 (amlogic 专 用 ); [Usr] 制 作 文 件 系 统 代 码 ; [Virt] 虚 拟 机 相 关 代 码 ;
Kernel/ARCH/ARC 目 录 ARC 架 构 相 关 代 码 [Arch-apollo-h]:Apollo-h 的 相 关 基 本 硬 件 初 始 化 ; [Kernel]: 中 断, 线 程, 硬 件 Cache 等 [Mm]: 内 存 和 MMU,Cache 的 硬 件 管 理 [Proc/arc700]: 硬 件 启 动 代 码, 中 断 向 量 表, 系 统 调 用 向 量 表 ; [Boot]: 用 来 生 成 bootloader 识 别 的 Image; [BSP]: 开 发 板 相 关 目 录 的 一 个 连 接, 在 编 译 时 生 成
Kernel/include 目 录 [asm-arc]:arc 平 台 的 头 文 件 目 录 ; [Asm-generic]: 公 共 的 硬 件 平 台 头 文 件 ; [Linux]:linux 系 统 头 文 件 ; [Net]: 网 络 相 关 头 文 件 ; [Sound]: 声 音 相 关 头 文 件 ; [Asm/arc/arch]:Amlogic-arc 芯 片 的 头 文 件 ( 驱 动 直 接 引 用, 它 能 根 据 芯 片 型 号 自 动 引 用 apollo 或 apollo-h 的 头 文 件 ); [Asm/arc/archapollo]:apollo 系 列 头 文 件 ( 为 方 便 移 植, 不 能 直 接 引 用 ); [Asm/arc/arch-apollo-h]:apollo-h 系 列 的 cpu 头 文 件 ( 为 方 便 移 植, 不 能 直 接 引 用 );
Kernel/Driver 目 录 这 个 目 录 里 面 用 来 存 放 各 种 驱 动 ; 我 公 司 的 驱 动 全 部 放 在 amloigc 目 录 里 面, 请 驱 动 开 发 按 照 这 个 结 构 存 放, 同 时 在 Makefile 里 面 的 位 置 决 定 启 动 的 顺 序, 非 启 动 时 间 需 要, 请 不 要 把 驱 动 提 前 ; [Kernel/Driver /amlogic] 目 录 的 基 本 驱 动 : [Amports]: 视 频 解 码 驱 动 ; [Audiodsp]: 音 频 dsp 的 控 制 驱 动 ; [Cardreader]:sd,mmc 等 卡 的 驱 动 ; [Display]OSD,GE2D 等 驱 动 ; [HDMI]:HDMI 接 口 驱 动 ; [I2C]:I2c 驱 动 ; [Input]: 输 入 设 备 驱 动, 现 在 主 要 有 遥 控 设 备 驱 动 ; [Nand]:nand flash 驱 动 ; [Net]: 网 络 设 备 驱 动, 主 要 有 以 太 网 ; [Sound]:alsa 音 频 驱 动,( 音 频 需 要 驱 动 启 动 后 启 动, 这 是 因 为 音 频 的 核 心 在 driver 之 后 启 动 ) [Uart]: 串 口 设 备 驱 动, 有 硬 件 串 口 驱 动 和 虚 拟 串 口 驱 动 (vuart), 虚 拟 串 口 可 以 用 来 连 接 Metaware; [USB]:USB 的 host 控 制 器 驱 动 ;
Common 目 录 ROOT COMMON trunk BSP Makefiles Tools [BSP] 不 同 开 发 板 对 应 的 目 录 初 始 化 目 录, 主 要 是 pinmux, 内 存 资 源 的 分 配 ; 基 本 命 名 规 则 : 芯 片 型 号 _ 内 存 配 置 ( 如 :7266_32x2) [Makefiles] 编 译 系 统 的 Makefiles, 编 译 时 会 引 用 这 些 Makefile 来 进 行 编 译 ; [Makfile.common]: 总 控 Makefile; [Makfile.kernel]: 编 译 内 核 使 用 的 makefile; [Makefile.busybox]: 编 译 busybox 使 用 的 Makefile; [Makefile.debug]: 调 式 时 使 用 的 Makefile; [Makefile.packages]: 编 译 packages 使 用 的 makefile;(makefile.common 引 用 ) [packages.rules]:packages 目 录 引 用 的 Makefile, 分 析 Config.in 文 件 的 配 置, 并 对 不 同 的 packages 编 译 进 行 管 理 ; [package.rules]: 具 体 每 个 包 可 以 引 用 的 makefile, 里 面 有 基 本 的 功 能, 可 以 减 少 重 复 的 代 码 ; [Tools] 编 译 和 生 成 Image 时 使 用 的 工 具 和 脚 本 ;
Packages 目 录 Packages 是 软 件 包 的 集 合 包 括 了 zlib, jpeg, freetype, directfb, microwindow, alsa-lib, amplayer 等 ; Config.in #p.menuconfig 读 取 的 包 的 配 置 文 件, 具 体 和 busybox 下 的 config.in 相 同 ; 添 加 新 的 packages 时 需 要 修 改 ; Makefile #Config.in 对 应 的 Makefile, 添 加 新 的 packages 时 需 要 修 改 ;
Packages 目 录 具 体 软 件 包 的 Makefile 实 现 以 Zlib-1.2.3 的 Makefile 为 例 P_FILE=zlib-1.2.3.tar.gz # 软 件 包 的 文 件 名 FILE_DIR=zlib-1.2.3 # 解 压 后 的 文 件 目 录 名 P_URL=http://www.zlib.net/zlib-1.2.3.tar.gz # 下 载 该 包 的 外 部 url 地 址 ; P_GET_CMD=${HTTP_GET} # 获 取 该 包 的 命 令, 一 般 不 需 要 修 改 ; P_GET_FLAGS=${HTTP_GET_FLAGS} # 获 取 该 包 命 令 的 使 用 参 数 ; TAR_CMD=${CMD_GZ} # 解 压 包 的 命 令, 可 以 使 用 CMD_GZ 或 CMD_BZ2; 也 可 以 使 用 其 他 标 准 命 令 ; TAR_FLAGS=${CMD_GZ_FLAGS} # 解 压 包 命 令 使 用 的 参 数 ; 和 TAR_FLAGS 对 应 ;
Packages 目 录 TRY_MAX=2 # 如 果 获 取 不 到 该 包 是, 最 大 重 试 次 数 DEPENDS= 隔 开 # 他 依 赖 的 软 件 包, 如 果 有 多 个 软 件 包, 只 需 要 空 格 PATCH_FILE = # 这 个 包 需 要 patch 文 件 名, 由 于 部 分 包 直 接 编 译 无 法 生 成 有 问 题, 需 要 打 上 Patch; 一 般 patch 文 件 就 放 在 当 前 目 录 ; CONFIG_FLAGS= --host=$(host_name) --prefix=${prefix} --withsoftfloat --disable-python --disable-alisp --enable-shared --with-versioned=no \ --with-alsa-devdir=/dev # 编 译 该 包 的 命 令 选 项, 具 体 参 考 该 包 的 help 文 件 ; P_FILE_F=${PKG_DIR}/${P_FILE} BUILD_DIR=${PKG_BUILD_DIR}/${FILE_DIR}.PHONY:all config before_cmd all:before_cmd config make -C ${BUILD_DIR} # 编 译 make install # 安 装
Packages 目 录 install: # 安 装 make -C ${BUILD_DIR} install.phony:configure configure:unzip_file #make configure cd ${BUILD_DIR}/&& \./configure ${CONFIG_FLAGS} CONFIG_GEN_FILE=${BUILD_DIR}/config.mak #configure 生 成 的 文 件 CONFIG_DEP_FILE=${BUILD_DIR}/configure #config 依 赖 文 件 UNZIP_GEN_FILE=${BUILD_DIR}/configure # 解 压 生 成 文 件 UNZIP_DEP_FILE=${P_FILE_F} # 解 压 依 赖 文 件 include $(MAKEFILES_DIR)/package.rules
Ui_ref 目 录 Bld_7266_h_xxx ROOT Ui_ref trunk rootfs Build 这 个 是 参 考 的 项 目 目 录, 他 通 过 引 用 common,kernel,packages 等 目 录 来 实 现 项 目 的 管 理 ; [env26.mk/env.mk]: 用 来 配 置 环 境, 指 定 所 引 用 的 package,kernel,common 和 rootfs 输 出 的 目 录 ; [bld_xxxx]: 开 发 扳 编 译 目 录, 所 有 编 译 命 令 都 将 在 这 个 目 录 操 作 ; [rootfs]: 参 考 的 rootfs 目 录, 这 个 目 录 里 面 主 要 有 用 来 参 考 的 /etc/ 配 置 文 件 等 ; [build]: 编 译 packages 等 文 件 的 临 时 目 录, 用 来 存 放 编 译 出 来 的 临 时 文 件 ;
Env.mk 的 设 置 Sample:Ui_ref/trunk/env26.mk ROOT_DIR=${TOP_DIR}/../../.. # 下 面 引 用 COMMON_DIR=${ROOT_DIR}/common # 指 定 common 目 录 ROOTFS_DIR=./rootfs # 指 定 输 出 的 rootfs 目 录. 默 认 在 bld_xxx 目 录 里 面, 最 好 指 定 一 个 绝 对 目 录, 以 方 便 调 试, 并 且 切 换 目 录 后 不 会 存 在 问 题 ; KERNEL_DIR= $(ROOT_DIR)/kernel_26 # 指 定 内 核 原 码 目 录 BUSYBOX_DIR=${ROOT_DIR}/busybox # 指 定 busybox 原 码 目 录 PACKAGES_DIR=${ROOT_DIR}/packages # 指 定 packages 目 录 DEFAULT_BOOT_CMD= root=/dev/nfs nfsroot=10.68.11.57:/home/amlogicbj/rootfs/testfs rw noinitrd init=/init ip=10.68.11.72:10.68.11.1:10.68.11.1:255.255.255.0:target:eth0:off console=ttys0,115200 mac=00:11:22:12:43:22 # 指 定 内 核 默 认 的 启 动 参 数 ( 没 有 使 用 uboot 等 loader 引 导 时 有 效, 调 试 用 ) PACKAGES_DIR_URL # 指 定 packages 包 的 地 址 ; 如 果 没 有 指 定, 会 从 openlinux.amlogic.com 下 载, 通 过 指 定 能 够 加 快 下 速 度, 方 便 内 部 开 发 使 用 ;
Bld_XXXX 目 录 的 基 本 配 置 Makefile TOP_DIR=${PWD} SRC_DIR=${TOP_DIR}/../src include../env26.mk ## 指 定 引 用 的 环 境 设 置 文 件 目 录 ; BSP_DIR=${COMMON_DIR}/trunk/bsp/7266_h_64x2 ## 指 定 开 发 板 对 应 的 bsp 目 录 RELEASE_DIR=${TOP_DIR}/build BUSYBOX_CONFIG=${TOP_DIR}/busybox_config KERNEL_CONFIG=${TOP_DIR}/kernel_config PACKAGE_CONFIG=${TOP_DIR}/packages_config START_INITRAMFS=no ## 是 否 制 作 ramfs[yes/no],, 如 果 制 作,vmlinux 里 面 就 存 在 一 个 ramfs 的 ; 会 在 启 动 的 时 候 自 己 加 栽 到 内 存 ; SRC_ROOT_FS=../rootfs/ ##rootfs 源, 主 要 存 放 着 配 置 文 件, 编 译 busybox 的 时 候 会 从 这 里 copy 到 env.mk->rootfs 指 定 的 目 录 里 面 ; COMMON_SVN_PATH= ## 源 码 对 应 的 svn 地 址 ; KERNEL_SVN_PATH=https://10.8.10.5/svn/Project_ARCLinux/trunk/kernel/v2.6.26 BUSYBOX_SVN_PATH=https://10.18.11.250/svn/model_linux/busybox/trunk PACKAGES_SVN_PATH=https://10.18.11.250/svn/model_linux/packages include ${COMMON_DIR}/trunk/Makefiles/Makefile.common ## 引 用 主 Makefile
Bld_XXXX 目 录 的 基 本 配 置 Wmake.bat:windows 下 面 调 试 使 用 的 批 处 理 文 件 ; Makefile: 项 目 编 译 目 录, 定 义 了 具 体 引 用 的 代 码 地 址, 板 子 相 关 设 置 ; Kernel_config: 内 核 的 配 置 文 件 ; Busybox_config: busybox 配 置 文 件 ; Packages_config: packages 配 置 文 件 ;
主 要 编 译 命 令 所 有 编 译 调 试 命 令 都 在 ui_ref/trunk/bld_xxx 下 面 执 行, 具 体 哪 个 bld 要 根 据 您 使 用 的 板 子 决 定 ; Make # 编 译 全 部, 包 括 kernel, busybox, packages 等 ; Make root # 编 译 文 件 系 统 ; Make yaffs # 把 文 件 系 统 打 包 生 成 yaffs 文 件 系 统 的 映 像 rootfs.yaffsimage, 并 保 存 在 build 目 录 ;
主 要 编 译 命 令 编 译 内 核 Make k.menuconfig # 配 置 内 核, 具 体 配 置 方 法 和 直 接 配 置 内 核 一 致, 同 时 也 可 以 使 用 make k.config, make k.xconfig 等 ; Make k # 编 译 内 核 ; Make k.modules # 编 译 内 核 模 块, 并 自 动 安 装 到 指 定 的 ROOTFS/lib/modules 目 录 ; Make k.clean # 删 除 内 核 编 译 的 临 时 文 件, 如 果 内 核 做 了 大 的 改 动 或 更 新, 需 要 这 么 做, 以 防 止 播 放 部 分 没 有 重 新 编 译 导 致 问 题 ;
主 要 编 译 命 令 编 译 busybox Make b.menuconfig # 配 置 busybox Make b # 编 译 busybox Make b.xxx # 调 用 busybox 内 部 的 命 令, 包 括 clean,install; 等
主 要 编 译 命 令 编 译 packages( 软 件 包 ) Make p.menuconfig # 配 置 软 件 包 Make p # 编 译 软 件 包 ; Make p.clean # 删 除 编 译 生 成 的 文 件. Make p.distclean # 删 除 整 个 编 译 生 成 的 packages 目 录 ; Make p.${packages_name}.all # 编 译 具 体 的 软 件 包, 这 个 PACKAGES_NAME 和 软 件 包 的 目 录 名 一 致 ;
工 具 链 Arc linux 使 用 了 两 套 工 具 链, 分 别 用 来 编 译 内 核 和 应 用 程 序 ; Arc-elf32- : 基 于 new-lib 的 工 具 链, 这 个 库 不 是 基 于 linux 系 统 调 用 开 发 的, 主 要 用 来 编 译 非 linux 标 准 的 应 用 程 序 ; 由 于 系 统 调 用 不 一 致, 也 不 能 用 来 编 译 应 用 程 序 ; 我 们 一 般 用 来 编 译 linux 内 核 ; Arc-linux-uclibc- : 基 于 uclibc 和 linux 的 编 译 工 具 链, 可 以 用 来 编 译 linux 下 的 应 用 程 序 ;
工 具 链 Arc-elf32-gcc Arc-elf32-g++; Arc-linux-uclibc-gcc Arc-linux-uclibc-g++ 三 个 编 译 器 都 可 以 用 来 编 译 C 和 C++ 代 码 ; GCC 一 般 用 来 编 译 c 代 码, 同 时 也 可 以 用 来 编 译 C++ 代 码 ; G++ 一 般 用 来 编 译 C++ 代 码, 编 译 C 代 码 的 使 用 会 自 动 调 用 GCC;
工 具 链 其 他 主 要 工 具, 都 省 略 了 前 缀,arc-elf32- 和 arclinux-uclib-, 如 果 不 使 用 前 缀, 就 是 执 行 系 统 本 身 的 工 具 链, 工 具 的 功 能 一 样 : readelf #elf 格 式 分 析 工 具, 可 以 查 看 section, 符 号 表 等 ; Objdump # 反 编 译 工 具, 可 以 用 来 反 编 译 elf 格 式 文 件, 分 析 编 译 结 果 代 码 ; Objcopy #elf 文 件 转 换 工 具, 可 以 用 来 生 成 bin 文 件, 添 加, 删 除 symble,section 等 ; As # 汇 编 代 码 编 译 工 具 Ld # 链 接 器, 链 接.o 文 件
工 具 链 Ar # 库 制 作 工 具, 可 以 把 多 个.o 文 件 制 作 为 静 态 库, 也 可 以 把 静 态 库 分 解 为 多 个.o 文 件 ; Ranlib # 跟 新 静 态 库 的 索 引 和 符 号 表, 加 快 静 态 库 的 访 问 速 度, 一 般 在 ar 后 使 用 ; Nm #elf 文 件 符 号 表 分 析 工 具,linux 下 面 的 System.map 就 是 使 用 nm 来 生 成 的 ; Strip # 删 除 elf 文 件 里 面 的 symbols 和 sections; Size # 显 示 elf 程 序 中 各 段 数 据 大 小 Run # 简 单 的 虚 拟 机, 可 以 执 行 elf-gcc 编 译 出 来 的 简 单 文 件 ;
工 具 链 Gdb #gnu 调 试 工 具, 能 够 单 步, 断 点 执 行, 可 以 分 析 堆 栈, 局 部 全 局 变 量 等 ; Insight #gdb 的 图 形 版 本, 实 际 上 是 insight 界 面 调 用 gdb 来 完 成 调 试 工 作 ; Gcov # 代 码 覆 盖 率 分 析 ; Gprof # 代 码 执 行 次 数 统 计 工 具, 可 以 用 来 优 化 代 码 ;
Thanks Mail:Zhi.zhou@amlogic.com msn:rising_o@msn.com Skype:rising_o