1、 Linux嵌入式系统设计与开发 1 第一部分嵌入式系统开发环境 第一章 嵌入式系统开发环境的搭建,以及相关工具的使用 1.1 虚拟机 +linux redhat9.0安装 1.1.1 虚拟机软件的安装及配置。 虚拟机软件是一种可以在一台电脑上模拟出来若干台 PC,每台 PC可以运行单独操作 系而互不干扰,实现一台电脑“同时”运行几个操作系统,还可以将这几个操作系统连成一 个网络的软件。 采用 VMware Workstation5.5例说明如何在 windows创建一个虚拟机环境。 VMware Workstation安装后的界面如下: 创建一个虚拟机 选择 linux 指定虚拟机存放的路径
2、 选择网络配置 对于虚拟机的设备进行配置,这里采用虚拟光驱,指定安装 linux镜像的路径 设备相关信息设置如下,启动虚拟机,开 始 安装。 进行 linux安装 1.1.2 Redhat9.0的安装。 注意 不安装 防火墙 ,采用 workstation, 确保服务 samba,tftp,tfp,nfs,SSH, DHCP, telnet 都 安装上。 1.2 Linux系统服务的配置 配置系统 服务 时, 要使防火墙 关 闭 , 或使其为低 。 1.2.1 网络配置 rootlocalhost /# setup 进 入 网络配置 菜 单,设置 ip。 rootlocalhost root#
3、 service network restart 重 启网络 服务 rootlocalhost root# ifconfig 察看 网络配置 1.2.2 Tftp服务的配置 选择 tftp服务 rootlocalhost /# setup 配置 tftp服务目录 rootlocalhost /# vi /etc/xinetd.d/tftp service tftp disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s
4、/tftpboot per_source = 11 cps = 100 2 启动 tftp服务 rootlocalhost /# service xinetd restart Stopping xinetd: OK Starting xinetd: OK 检测 tftp服务 rootlocalhost /# netstat -a | grep tftp udp 0 0 *:tftp *:* 1.2.3 Samba服务器配置 选择 samba服务 rootlocalhost /# setup 编辑 smb.conf配置 文 件, rootlocalhost /# vi /etc/samba/sm
5、b.conf 增加 用 户名 以 及共享 路径,如下: homes comment = Home Directories path = / browseable = no writable = yes valid users = root create mode = 0664 directory mode = 0775 rootlocalhost /#smbadduser root:admin 增加 samba用 户 rootlocalhost /# service smb restart 激活 samba服务 rootlocalhost /# service smb status 察看 sa
6、mba服务 1.2.4 telnet服务器配置 选择 telnet服务 rootlocalhost /# vi /etc/pam.d/login 注释掉 auth required /lib/security/pam_securetty.so 这 句话 重 启 服务 rootlocalhost /# service xinetd restart 至此 可以以 root用 户 telnet登录 1.2.5 nfs服务器配置 选择 nfs服务 rootlocalhost /# vi /etc/exports 增加 nfs服务输 出的路径以 及供给 的 ip地址 ,例如 增加 如下 条目 : /ho
7、me/nfsroot 192.168.230.128(rw,sync) 表示 ip地址为 192.168.230.128可以 读写本 机的 目录 /home/nfsroot rootlocalhost /# service nfs restart 激活 nfs服务 rootlocalhost /# service nfs status 察看 nfs服务 的 状态 1.2.6 DHCP服务器配置 注意 : 当 配置 DHCP服务 时 会 对于 局域 网 有影响 ,建 议 在虚拟机的环境下,网络设备 选择 Host-only工 作 方式 ,如 果 不是虚拟机, 请把 网络连 接与局域 网 断 开。
8、 选择 DHCP服务器 rootlocalhost /# cp /usr/share/doc/dhcp-3.0pl1/dhcpd.conf.sample /etc/dhcpd.conf 创建一个 DHCP服务 的配置 文 件 rootlocalhost /# vi /etc/dhcpd.conf 编辑 dhcpd.conf配置 DHCP服务 ,下面的例 子 实现 了基本 的配置, 目 的是 为 在虚拟机 上实现 linux内核 在网络上的启动。 本 机的 ip是 192.168.230.129 ddns-update-style interim; ignore client-updates;
9、subnet 192.168.230.0 netmask 255.255.255.0 # - default gateway option routers 192.168.230.129; option subnet-mask 255.255.255.0; option time-offset -18000; # Eastern Standard Time range dynamic-bootp 192.168.230.120 192.168.230.128; default-lease-time 21600; max-lease-time 43200; filename “/pxelinux
10、.0“; #为 实现 通过 网络启动 加载 的 文 件 # we want the nameserver to appear at a fixed address rootlocalhost /# service dhcpd start 开启 dhcp服务 rootlocalhost /# service dhcpd status 察看服务 是 否 运行 1.2.7 支持网络启动内核的配置方法 基本原理 ,实现网络启动 必须支持 PXE, PXE(Pre-boot Execution Environment)是 由 Intel 设 计 的 协议 , 它 可以 使计 算 机 通过 网络启动。 协
11、议 分 为 client和 server两端 , PXE client在 网 卡 的 ROM中 , 当计 算 机 引导 时, BIOS把 PXE client调 入内 存 执 行, 并显 示 出 命令 菜 单, 经 用 户 选择后, PXE client将放置在 远端 的操作系统 通过 网络下 载 到 本地 运行。 PXE协议 的成 功 运行 需 要 解决 以下 两 个 问题 : l 既然 是 通过 网络 传 输 , 那么 计 算 机在启动时, 它 的 IP地址由 谁 来配置 ; l 通过 什么 协议 下 载 Linux内核 和根 文 件系统 对于 第 一个 问题 ,可以 通过 DHCP Se
12、rver解决 , 由 DHCP server来 给 PXE client分 配一 个 IP地址 , DHCP Server是用来 给 DHCP Client动 态 分 配 IP地址 的 协议 ,不 过由 于这里是 给 PXE Client分 配 IP地址 , 所 以在配置 DHCP Server时, 需 要增加 相 应 的 PXE特 有 配置。 至于第二 个 问题 ,在 PXE client所 在的 ROM中 , 已经 存在 了 TFTP Client。 PXE Client 使 用 TFTP Client, 通过 TFTP协议 到 TFTP Server上下 载 所需 的 文 件。 1.2.
13、7.1 配置 DHCP和 tfpt服务,配置方式见以上描述。 1.2.7.2 配置 bootstrap Bootstrap文 件是可 执 行 程序 , 它 向 用 户 提 供 简 单的 控制 界面, 并根据 用 户 的选择,下 载 合适 的 Linux 内核 以 及 Linux 根 文 件系统。 bootstrap 文 件在 dhcpd.conf 中被 指定 为 pxelinux.0 文 件,放置在 /tftpboot。 Linux 内核 以 及 Linux 根 文 件系统 也 放置在 /tftpboot。 pxelinux.0在 执 行 过 程中 , 要读 配置 文 件, 所 有 的配置 文
14、 件 都 放在 /tftpboot/pxelinux.cfg/目录 下。 由 于 PXElinux具 有为 不同的 PXE Client提 供 不同的 Linux内核 以 及 根 文 件系统的 功能 , 所 以 要通过 不同的配置 文 件 名 来 区分 出不同的 PXE Client的 需求 。 比 如一个 PXE Client由 DHCP Server 分 配的 IP 地址为 192.168.0.22, 那么 相对 应 的配置 文 件 名为 /tftpboot/pxelinux.cfg/C0A80016( 注 : C0A80016为 IP地址 192.168.0.22的 十六 进 制 表示
15、) 。 如 果 找 不 到 , 就按照顺序 C0A80016- C0A8001- C0A800- C0A80- C0A8- C0A- C0- C-default查找 配置 文 件。 rootlocalhost /# cp /usr/lib/syslinux/pxelinux.0 /tftpboot/ rootlocalhost /# cd /tftpboot/ rootlocalhost tftpboot# mkdir pxelinux.cfg rootlocalhost tftpboot# cd pxelinux.cfg/ rootlocalhost pxelinux.cfg# vi def
16、ault default linux-boot prompt 1 timeout 30 label linux-boot kernel vmlinuz append initrd=initrd devfs=nomount ramdisk_size=9216 把内核 vmlinuz, initrd拷贝到 /tftp下,这 样 当 启动 另外 一个虚拟机,启动时 按 F12, 即 可进 入 网络启 动。启动界面如下: 1.3 交叉工具链的介绍与使用 1.3.1 基础知识 交叉 编 译 , 就 是在一个 平 台上 生 成 另 一个 平 台上的可 执 行 代码 。这里 需 要注意 的是 所谓 平 台,
17、实 际 上 包含两 个 概念 : 体 系 结构( Architecture)、 操作系统 ( Operating System)。同 一个 体 系 结构 可以运行不同的操作系统 ; 同 样 ,同一个操作系统 也 可以在不同的 体 系 结构 上 运行。 在 主 机 平 台上开 发程序 , 并 在这个 平 台上运行 交叉 编 译 器 , 编 译我们 的 程序; 而 由 交叉 编 译 器 生 成的 程序 将在 目 的 平 台上运行。例如: arm-linux,说明 平 台 所 使 用的是 arm体 系 结构 ,运行的操作系统是 linux 1.3.2 GNU 交叉工具链的下载 Arm工 具链 的 官
18、 方 下 载地址 : ftp:/ftp.arm.linux.org.uk/pub/arm-linux-/toolchain/cross2.95.3.tar.bz2 ftp:/ftp.arm.linux.org.uk/pub/arm-linux-/toolchain/cross3.0.tar.bz2 ftp:/ftp.arm.linux.org.uk/pub/arm-linux-/toolchain/cross3.2.tar.bz2 http:/www.handhelds.org/download/projects/toolchain/ 可以下 载 arm-linux-gcc-3.4.1编 译
19、linux2.6的 内核 1.3.3 GNU交叉工具链的介绍以及使用 1.3.3.1 常用工具介绍 arm-linux-as 编译 ARM汇 编 程序 arm-linux-ar 把多个 .o合并 成一个 .o或 静 态 库 (.a), arm-linux-ranlib 为 库 文 件建 立索 引 ,相 当 于 arm-linux-ar s arm-linux-ld 连接器 (Linker), 把 多 个 .o或 库 文 件连 接 成一个可 执 行 文 件 arm-linux-objdump 查 看目 标 文 件 (.o)和 库 (.a)的信息 arm-linux-objcopy 转换 可 执
20、行 文 件的 格 式 arm-linux-strip 去 掉 elf可 执 行 文 件的信息 . 使 可 执 行 文 件 变小 arm-linux-readelf 读 elf可 执 行 文 件的信息 arm-linux-gcc 编 译 .c或 .S开 头 的 C程序 或 汇 编 程序 arm-linux-nm 用来 列 出 目 标 文 件的 符号清 单 1.3.3.2 主要工具的使用 1.3.3.2.1 arm-linux-gcc 的使用 1. 编 译 C文 件, 生 成 elf可 执 行 文 件 h1.c 源 文 件 #include void hellofirst(void) printf
21、(“The first hello! n“); h2.c 源 文 件 #include void hellosecond(void) printf(“The second hello! n“); hello.c 源 文 件 #include extern void hellosecond(void); extern void hellofirst(void); int main(int argc, char *argv) hellofirst(); hellosecond(); return(0); 编 译 以上 3个 文 件, 有 如下几种 方 法 : 方 法 1: rootlocalhos
22、t codetest#arm-linux-gcc -c h1.c rootlocalhost codetest#arm-linux-gcc -c h2.c rootlocalhost codetest#arm-linux-gcc -o hello hello.c h1.o h2.o 方 法 2: rootlocalhost codetest#arm-linux-gcc -c h1.c h2.c rootlocalhost codetest#arm-linux-gcc -o hello hello.c h1.o h2.o 方 法 3: rootlocalhost codetest#arm-lin
23、ux-gcc -c -o h1.o h1.c rootlocalhost codetest#arm-linux-gcc -c -o h1.o h1.c rootlocalhost codetest#arm-linux-gcc -o hello hello.c h1.o h2.o 方 法 4: rootlocalhost codetest#arm-linux-gcc -o hello hello.c h1.c h2.c -c:只 编 译 不连 接 。 -o:编 译 且 连 接 。 2. 产 生 一个 预处 理文 件, 适合 看 一个 宏 在 源 文 件 中 产 生 的 结 果 。 rootloc
24、alhost codetest#arm-linux-gcc -E h1.i h1.c E:产 生 一个 预处 理文 件 . 1.3.3.2.2 arm-linux-ar 和 arm-linux-ranlib 的使用 静 态 库 是在 编 译 时 需 要 的 库 。 1. 建 立 一个 静 态 库 rootlocalhost codetest#arm-linux-ar -r libhello.a h1.o h2.o 2. 为 静 态 库 建 立索 引 rootlocalhost codetest#arm-linux-ar -s libhello.a rootlocalhost codetest#
25、arm-linux-ranlib libhello.a 3. 由 静 态 库产 生 可 执 行 文 件 rootlocalhost codetest#arm-linux-gcc -o hello hello.c libhello.a 1.3.3.2.3 arm-linux-objdump 的使用 1. 查 看 静 态 库 或 .o文 件的 组 成 文 件 armlocalhost gcc$ arm-linux-objdump -a libhello.a 2. 查 看 静 态 库 或 .o文 件的 组 成 部 分 的 头部 分 armlocalhost gcc$ arm-linux-objdum
26、p -h libhello.a 3. 把目 标 文 件 代码 反 汇 编 armlocalhost gcc$ arm-linux-objdump -d libhello.a 1.3.3.2.4 arm-linux-readelf 的使用 1. 读 elf文 件开 始 的 文 件 头部 armlocalhost gcc$ arm-linux-readelf -h hello 2. 读 elf文 件 中所 有 ELF 的 头部 : rootlocalhost codetest#arm-linux-readelf -e hello 3. 显 示 整 个 文 件的 符号 表 rootlocalhost
27、 codetest#arm-linux-readelf -s hello 4. 显 示使 用的动 态 库 rootlocalhost codetest#arm-linux-readelf -d hello 1.3.3.2.5 arm-linux-strip 的使用 1. 移除 所 有 的 符号 信息 rootlocalhost codetest#arm-linux-strip strip-all hello strip-all:是 移除 所 有 符号 信息 2. 移除 调 试符号 信息 rootlocalhost codetest#arm-linux-strip -g hello 1.3.3.
28、2.6 arm-linux-objcopy 的使用 生 成可以 执 行的 2进 制代码 rootlocalhost codetest#arm-linux-objcopy -O binary hello hello.bin 1.3.3.2.7 arm-linux-nm 的使用 列 出 目 标 文 件的 符号清 单 rootlocalhost codetest#arm-linux-nm hello.o 1.4 SSH Secure Shell客户端软件的安装及使用 实现 更 安 全 的 远程 登录 ,可进行 ftp操作。 1.5 串口终端 Procomm Plus的使用 可以运行 命令 脚 本 ,
29、实现 多 个 命令 的 自 动运行 1.6 使用 Source insight进行代码阅读 Linux源 代码 阅 读 的 利 器 1.7 文件比较工具 Araxis Merge2001的使用 可以 方 便 对 比 文 件 之间 的 差异 1.8 文件编辑工具 UltraEdit的使用 第二部分最小系统的启动 2 第二章 u-boot的移植 2.1 u-boot介绍 Uboot是 德国 DENX小组 的开 发 用于 多 种 嵌 入式 CPU的 bootloader程序 , UBoot不 仅仅 支持 嵌 入式 Linux系统的 引导 , 当 前 , 它 还 支持 NetBSD, VxWorks,
30、 QNX, RTEMS, ARTOS, LynxOS嵌 入式 操作系统。 UBoot除 了支持 PowerPC系 列 的 处 理器 外 ,还 能 支持 MIPS、 x86、 ARM、 NIOS、 XScale等诸多常 用系 列 的 处 理器 。 本文 的 代码 取自 于 uboot1.1.4。 2.2 获取 u-boot 从 下面 地址 下 载 uboot的 源 代码 。 http:/ ubootlocalhost uboot#tar xjvf uboot1.1.4.tar.bz2 ubootlocalhost uboot#cd uboot1.1.4 2.3 u-boot体系结构 1. 目录
31、树 . |board |common |cpu |disk |doc |drivers |dtt |examples |fs |include |lib_arm |lib_generic |lib_i386 |lib_m68k |lib_microblaze |lib_mips |lib_nios |lib_nios2 |lib_ppc |net |post |rtc tools 2. board: 和 一 些 已 有 开 发 板 有 关的 文 件 . 每一个开 发 板 都 以一个 子目录 出现在 当 前 目录 中 , 比 如说 :SMDK2410,子目录 中 存放 与 开 发 板 相关的配置
32、 文 件 . 3. common:实现 uboot命令 行下 支持 的 命令 ,每一 条 命令 都 对 应 一个 文 件。例如 bootm命令 对 应就 是 cmd_bootm.c。 4. cpu: 与 特 定 CPU架 构 相关 目录 ,每一 款 Uboot下 支持 的 CPU在 该 目录 下对 应 一个 子目录 , 比 如 有子目录 arm920t等 。 5. disk:对 磁盘 的 支持 。 6. doc: 文 档 目录 。 Uboot有 非常完善 的 文 档 , 推荐大家参考阅 读 。 7. drivers: Uboot支持 的设备驱动 程序 都 放在 该 目录 , 比 如 各 种网
33、卡、 支持 CFI的 Flash、 串口 和 USB等 。 8. fs: 支持 的 文 件系统, Uboot现在 支持 cramfs、 fat、 fdos、 jffs2和 registerfs。 9. include: Uboot使 用的 头 文 件,还 有 对 各 种 硬 件 平 台 支持 的 汇 编文 件,系统的配置 文 件 和 对 文 件系统 支持 的 文 件。 该 目录 下 configs 目录有与 开 发 板 相关的配置 头 文 件,如 smdk2410.h。该 目录 下的 asm目录有与 CPU体 系 结构 相关的 头 文 件, asm对 应 的是 asmarm.9. lib_xx
34、xx: 与 体 系 结构 相关的 库 文 件。如 与 ARM相关的 库 放在 lib_arm中 。 10. net: 与 网络 协议 栈 相关的 代码 , BOOTP协议 、 TFTP协议 、 RARP协议 和 NFS文 件 系统的实现。 11. tools: 生 成 Uboot的 工 具 ,如: mkimage, crc等等 。 2.4 u-boot编 译 及配置 2.4.1 u-boot的 Makefile分 析 u-boot的 Makefile从 功能 上可以 分 成 两 个 部 分 。一 部 分 是用来 编 译生 成 uboot.bin文 件 ; 另 一 部 分 是用来 执 行每种 b
35、oard相关的配置。下面以 smdk2410为 例来说明作 了 哪些 配置。 $make smdk2410_config 在 shell执 行以上 命令 ,对 应 于 Makefile执 行的 命令 是 smdk2410_config : unconfig ./mkconfig $(:_config=) arm arm920t smdk2410 NULL s3c24x0 首先 执 行如下 命令 , 删除 文 件 include/config.h include/config.mk board/*/config.tmp,后 续 会 发 现这 些 文 件是如何建 立 的。 unconfig: rm
36、 -f include/config.h include/config.mk board/*/config.tmp 然 后运行 命令 ./mkconfig $(:_config=) arm arm920t smdk2410 NULL s3c24x0, mkconfig是 脚 本文 件, 传 入 的 参数 $1至 $6分 别 为 : smdk2410 arm arm920t smdk2410 NULL s3c24x0, 根据传 入 的 参数 执 行如下 命令 cd ./include rm f asm ln s asm-arm asm rm f asm-arm/arch ln s arch-s3
37、c24x0 asm-arm/arch rm f asm-arm/proc ln s proc-armv asm-arm/proc 生 成 文 件 config.mk, 文 件 内 容 为 : ARCH = arm CPU = arm920t BOARD = smdk2410 SOC = s3c24x0 生 成 文 件 config.h, 文 件 内 容 为 : /* Automatically generated - do not edit */ #include 至此 make smdk2410_config的 命令 全部 执 行 完毕 。配置 完 成 与 board相关的信息,下面 就 可
38、以 编 译 此 board的 u-boot.bin文 件, 执 行如下 命令 : $make CROSS_COMPILE=arm-linux- Makefile的 执 行 首先 包含 include include/config.mk 文 件, 获取 ARCH CPU BOARD VENDOR SOC的定 义 , 然 后 根据 宏 的配置 编 译 指定的 文 件, 最终 生 成 u-boot.bin文 件, 执 行 流 程 请 自 行 分 析 。 2.4.2 u-boot.bin的 生成 根据 以上对于 makefile的 分 析 , u-boot.bin的 生 成 分 为 两 步 。如下:
39、对于 board进行配置: $make smdk2410_config 进行 编 译生 成 u-boot.bin: $make CROSS_COMPILE=arm-linux- 2.5 u-boot的启动 过程 及工 作原理 2.5.1 启动 模 式介绍 大多数 Boot Loader 都 包含两 种不同的操作模 式 : “启动 加载 “模 式 和 “下 载 “模 式 ,这种 区 别仅 对于开 发 人员才 有意 义 。 但从最终 用 户 的 角度 看 , Boot Loader 的作用 就 是用来 加载 操作系统,而 并 不存在 所谓 的启动 加载 模 式与 下 载工 作模 式 的 区 别 。
40、 启动 加载 ( Boot loading) 模 式 :这种模 式 也 称 为 “自 主 “( Autonomous) 模 式 。 也即 Boot Loader 从 目 标 机上的 某 个 固 态 存 储 设备上将操作系统 加载 到 RAM 中 运行, 整 个 过 程并 没 有 用 户 的 介 入 。这种模 式 是 BootLoader 的 正 常 工 作模 式 , 因 此 在 嵌 入式 产 品 发 布 的时 侯 , Boot Loader 显然 必须工 作在这种模 式 下。 下 载 ( Downloading) 模 式 :在这种模 式 下, 目 标 机上的 Boot Loader 将 通过
41、串口 连 接 或 网络连 接 等 通 信 手段 从 主 机 ( Host) 下 载文 件, 比 如:下 载内核 映 像 和根 文 件系统 映 像 等 。 从 主 机下 载 的 文 件 通 常首先 被 BootLoader 保 存 到 目 标 机的 RAM 中 , 然 后 再 被 BootLoader 写 到 目 标 机上的 FLASH 类固 态 存 储 设备 中 。 BootLoader 的这种模 式通 常 在 第 一 次 安装 内核与 根 文 件系统时 被 使 用 ; 此 外 ,以后的系统 更 新 也 会使 用 BootLoader 的这种 工 作模 式 。 工 作于这种模 式 下的 Boo
42、t Loader 通 常 都会 向 它 的 终 端 用 户 提 供 一个 简 单的 命令 行 接 口 。 UBoot这 样功能 强 大 的 Boot Loader 同时 支持 这 两 种 工 作模 式 ,而 且 允许 用 户 在这 两 种 工 作模 式 之间 进行 切 换 。 大多数 bootloader都 分 为 阶段 1(stage1)和 阶段 2(stage2)两 大部 分 , uboot也 不例 外 。 依 赖 于 CPU体 系 结构 的 代码( 如 CPU初 始 化 代码 等 ) 通 常 都 放在 阶段 1中 且 通 常 用 汇 编 语言 实现,而 阶段 2则 通 常 用 C语言 来
43、实现,这 样 可以实现 复杂 的 功能 ,而 且 有 更 好 的可 读 性 和 移 植性 。 2.5.2 阶段 1介绍 uboot的 stage1代码 通 常 放在 start.s文 件 中 , 它 用 汇 编 语言 写 成, 其 主 要 代码 部 分 如下: 2.5.2.1 定义 入口 由 于一个可 执 行的 Image必须有 一个 入 口 点 , 并 且只 能 有 一个 全 局入 口 , 通 常 这个 入 口 放在 ROM(Flash)的 0x0地址 , 因 此 , 必须通 知 编 译 器 以 使其 知道 这个 入 口 , 该 工 作可 通过 修改 连 接器 脚 本 来 完 成。 1. b
44、oard/smdk2410/uboot.lds: ENTRY(_start) = cpu/arm920t/start.o (.text) 2. uboot在 ram的 代码区( TEXT_BASE = 0x33F80000)定 义 在 board/smdk2410/config.mk 2.5.2.2 设 置 异 常 向量 .globl _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr p
45、c, _not_used ldr pc, _irq ldr pc, _fiq 当 发生 异常 时, 执 行 cpu/arm920t/interrupts.c中 定 义 的 中 断 处 理 函 数 2.5.2.3 设 置 CPU 的 模 式 为 SVC 模 式 mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 2.5.2.4 关 闭看门狗 , 禁掉所有中断 , 设 置 CPU 的 频率 #if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410) ldr r0, =pWTCON mov r
46、1, #0x0 str r1, r0 /* * mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, r0 # if defined(CONFIG_S3C2410) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, r0 # endif /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #
47、3 str r1, r0 #endif /* CONFIG_S3C2400 | CONFIG_S3C2410 */ 2.5.2.5 与内 存管理 相关 寄存 器的 设 置, cp15协处理 器,配置内 存区控制寄存 器 cpu_init_crit: /* * flush v4 I/D caches */ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* 失效 I/D cache, 见 S3C2410手册附 录 的 2-16 */ mcr p15, 0, r0, c8, c7, 0 /* 失效 TLB, 见 S3C2410手册附 录 的 2-18 */ /* * d
48、isable MMU stuff and caches */ mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 /* 清除 bits 13, 9:8 (-V- -RS) * Bit 8: Disable System Protection * Bit 7: Disable ROM Protection * Bit 13: 异常 向 量 表基地址 : 0x0000 0000 */ bic r0, r0, #0x00000087 /* 清除 bits 7, 2:0 (B- -CAM) * Bit 0: MMU disabled * Bit 1: Alignment Fault checking disabled * Bit 2: Data cache disabled * Bit 7: 0 = Little-endian operation */ orr r0, r0, #0x00000002 set bit 2 (A) Align orr r0, r0, #0x00001000 set bit 12 (I) I-Cache mcr p15, 0, r0, c1, c0, 0 /* * before relocating, we ha