BusyBox命令与SDRAM接口配置详解
1. BusyBox命令概述
BusyBox 包含众多实用的命令,这些命令在系统管理、文件操作、网络配置等方面发挥着重要作用。以下是一些常见 BusyBox 命令及其功能:
| 命令 | 功能 |
| — | — |
| addgroup | 向系统添加一个组 |
| adduser | 向系统添加一个用户 |
| adjtimex | 读取并可选择设置系统时基参数 |
| ar | 从 ar 归档文件中提取或列出文件 |
| arping | 通过 ARP 请求/回复来ping主机 |
| ash | ash shell(命令解释器) |
| awk | 模式扫描和处理语言 |
| basename | 去除文件的目录路径和后缀 |
| bunzip2 | 解压缩文件(若未指定输入文件,则从标准输入读取) |
| bzcat | 解压缩并输出到标准输出 |
| cal | 显示日历 |
| cat | 连接文件并将其打印到标准输出 |
| chgrp | 更改每个文件的所属组 |
| chmod | 更改文件的访问权限 |
| chown | 更改文件的所有者和/或所属组 |
| chroot | 将根目录设置为新的根目录并运行命令 |
| chvt | 将前台虚拟终端更改为 /dev/ttyN |
| clear | 清屏 |
| cmp | 比较文件 |
| cp | 复制文件 |
| cpio | 从 cpio 归档文件中提取或列出文件 |
| crond | BusyBox 版本的 cron 守护进程 |
| crontab | 管理 crontab 控制文件 |
| cut | 将每个输入文件的选定字段打印到标准输出 |
| date | 显示或设置系统时间 |
| dc | 小型逆波兰计算器 |
| dd | 复制文件,并根据选项进行转换和格式化 |
| deallocvt | 释放未使用的虚拟终端 /dev/ttyN |
| delgroup | 从系统中删除一个组 |
| deluser | 从系统中删除一个用户 |
| devfsd | 用于管理 devfs 权限和旧设备名称符号链接的过时守护进程 |
| df | 打印文件系统的已用空间和可用空间 |
| dirname | 去除文件名中的非目录后缀 |
| dmesg | 打印或控制内核环形缓冲区 |
| dos2unix | 将文件从 DOS 格式转换为 UNIX 格式 |
| dpkg | 用于安装、删除和管理 Debian 软件包的实用程序 |
| dpkg - deb | 对 Debian 软件包(debs)执行操作 |
| du | 汇总每个文件和/或目录的磁盘使用空间 |
| dumpkmap | 将二进制键盘翻译表打印到标准输出 |
| dumpleases | 显示 udhcpd 授予的 DHCP 租约 |
| echo | 将指定的参数打印到标准输出 |
| env | 打印当前环境或在设置环境后运行程序 |
| expr | 将表达式的值打印到标准输出 |
| false | 返回退出码 FALSE(1) |
| fbset | 显示和修改帧缓冲区设置 |
| fdflush | 强制软盘驱动器检测磁盘更改 |
| fdformat | 对软盘进行低级格式化 |
| fdisk | 更改分区表 |
| find | 在目录层次结构中搜索文件 |
| fold | 包装每个文件中的输入行 |
| free | 显示系统的可用和已用内存量 |
| freeramdisk | 释放指定 ramdisk 使用的所有内存 |
| fsckminix | 对 MINIX 文件系统进行一致性检查 |
| ftpget | 通过 FTP 检索远程文件 |
| ftpput | 通过 FTP 将本地文件存储到远程机器上 |
| getopt | 解析命令选项 |
| getty | 打开一个 tty,提示输入登录名,然后调用 /bin/login |
| grep | 在每个文件或标准输入中搜索模式 |
| gunzip | 解压缩文件(或标准输入) |
| gzip | 以最大压缩率压缩文件 |
| halt | 停止系统 |
| hdparm | 获取/设置硬盘参数 |
| head | 将每个文件的前 10 行打印到标准输出 |
| hexdump | 以用户指定的二进制、八进制、十六进制、字符或十进制格式转储文件 |
| hostid | 打印机器的唯一 32 位标识符 |
| hostname | 获取或设置主机名 |
| httpd | 监听传入的 http 服务器请求 |
| hwclock | 查询和设置硬件时钟(RTC) |
| id | 打印用户名或当前用户的信息 |
| ifconfig | 配置网络接口 |
| ifdown | 取消配置接口 |
| ifup | 配置接口 |
| inetd | 监听网络连接并启动程序 |
| init | BusyBox 版本的 init |
| insmod | 将指定的内核模块加载到内核中 |
| install | 复制文件并设置属性 |
| ip | TCP/IP 配置实用程序 |
| ipaddr | 操作接口地址 |
| ipcalc | 根据 IP 地址计算 IP 网络设置 |
| iplink | 操作接口设置 |
| iproute | 显示/设置路由表条目 |
| iptunnel | BusyBox iptunnel 实用程序 |
| kill | 向指定的进程发送信号(默认是 SIGTERM) |
| killall | 向指定的进程发送信号(默认是 SIGTERM) |
| klogd | 内核日志记录器 |
| lash | BusyBox LAme SHell(命令解释器) |
| last | 显示最后登录到系统的用户列表 |
| length | 打印指定字符串的长度 |
| ln | 创建一个名为 LINK_NAME 或 DIRECTORY 的链接到指定的目标 |
| loadfont | 从标准输入加载控制台字体 |
| loadkmap | 从标准输入加载二进制键盘翻译表 |
| logger | 将消息写入系统日志 |
| login | 在系统上开始一个新会话 |
| logname | 打印当前用户的名称 |
| logread | 显示 syslogd 的消息 |
| losetup | 将 LOOPDEVICE 与文件关联 |
| ls | 列出目录内容 |
| lsmod | 列出当前加载的内核模块 |
| makedevs | 创建一系列块或字符特殊文件 |
| md5sum | 打印或检查 MD5 校验和 |
| mesg | 控制对终端的写入访问权限 |
| mkdir | 创建目录条目 |
| mkfifo | 创建一个命名管道(与 mknod name p 相同) |
| mkfsminix | 创建 MINIX 文件系统 |
| mknod | 创建一个特殊文件(块、字符或管道) |
| mkswap | 准备一个磁盘分区用作交换分区 |
| mktemp | 创建一个临时文件,其名称基于模板 |
| modprobe | 用于高级模块加载和卸载 |
| more | 一次一屏查看文件的过滤器 |
| mount | 挂载文件系统 |
| mt | 控制磁带驱动器操作 |
| mv | 重命名和/或移动文件 |
| nameif | 在接口处于关闭状态时重命名网络接口 |
| nc | Netcat 打开一个到 IP:port 的管道 |
| netstat | 显示 Linux 网络信息 |
| nslookup | 查询名称服务器以获取给定主机的 IP 地址 |
| od | 以八进制和其他格式转储文件 |
| openvt | 在新的虚拟终端上启动命令 |
| passwd | 更改用户密码 |
| patch | BusyBox 实现的 patch 命令 |
| pidof | 获取命名进程的 PID |
| ping | 向网络主机发送 ICMP ECHO_REQUEST 数据包 |
| ping6 | 向网络主机发送 ICMP ECHO_REQUEST 数据包 |
| pivot_root | 更改根文件系统 |
| poweroff | 停止系统并请求内核关闭电源 |
| printf | 根据用户格式格式化并打印参数 |
| ps | 报告进程状态 |
| pwd | 打印当前工作目录的完整文件名 |
| rdate | 从远程主机获取并可能设置系统日期和时间 |
| readlink | 显示符号链接的值 |
| realpath | 返回给定参数的绝对路径名 |
| reboot | 重新启动系统 |
| renice | 在允许的优先级范围内更改正在运行的进程的优先级 |
| reset | 重置屏幕 |
| rm | 删除(取消链接)文件 |
| rmdir | 删除目录(如果它们为空) |
| rmmod | 从内核中卸载指定的内核模块 |
| route | 编辑内核的路由表 |
| rpm | 操作 RPM 软件包 |
| rpm2cpio | 输出 rpm 文件的 cpio 归档 |
| run - parts | 在目录中运行一系列脚本 |
| rx | 使用 xmodem 协议接收文件 |
| sed | Busybox 流编辑器实现 |
| seq | 将一系列数字打印到标准输出 |
| setkeycodes | 将条目设置到内核的扫描码到键码映射中 |
| sha1sum | 打印或检查 SHA1 校验和 |
| sleep | 延迟指定的时间 |
| sort | 对指定文件中的文本行进行排序 |
| start - stop - daemon | 启动和停止服务的程序 |
| strings | 在二进制文件中显示可打印字符串 |
| stty | 显示和修改终端设置 |
| su | 更改用户 ID 或成为根用户 |
| sulogin | 单用户登录 |
| swapoff | 禁用虚拟内存页面交换 |
| swapon | 启用虚拟内存页面交换 |
| sync | 将所有缓冲的文件系统块写入磁盘 |
| sysctl | 在运行时配置内核参数 |
| syslogd | Linux 系统和内核日志记录实用程序 |
| tail | 将每个文件的最后 10 行打印到标准输出 |
| tar | 创建、提取或列出 tar 文件中的文件 |
| tee | 将标准输入复制到每个文件并同时输出到标准输出 |
| telnet | BusyBox Telnet 客户端实现 |
| telnetd | BusyBox Telnet 服务器实现 |
| test | 检查文件类型并比较值,返回退出码 |
| tftp | 使用 TFTP 协议传输文件 |
| time | 测量程序使用的时间 |
| top | 实时提供处理器活动的视图 |
| touch | 更新给定文件的最后修改日期 |
| tr | 翻译、压缩和/或删除字符 |
| traceroute | 跟踪 IP 数据包的路由 |
| true | 返回退出码 trUE(0) |
| tty | 打印连接到标准输入的终端的文件名 |
| udhcpc | BusyBox DHCP 客户端实现 |
| udhcpd | BusyBox DHCP 服务器实现 |
| umount | 卸载文件系统 |
| uname | 打印某些系统信息 |
| uncompress | 解压缩 Z 文件 |
| uniq | 从输入中丢弃除一个之外的所有连续相同行 |
| unix2dos | 将文件从 UNIX 格式转换为 DOS 格式 |
| unzip | 从 ZIP 归档文件中提取文件 |
| uptime | 显示自上次启动以来的时间 |
| usleep | 暂停 n 微秒 |
| uudecode | 对 uu 编码的文件进行解码 |
| uuencode | 对文件进行 uu 编码 |
| vconfig | 允许创建和删除虚拟以太网设备 |
| vi | BusyBox vi 编辑器 |
| vlock | 锁定虚拟终端并需要密码才能解锁 |
| watch | 定期执行程序 |
| watchdog | 定期写入指定的看门狗设备 |
| wc | 打印每个文件的行数、单词数和字节数 |
| wget | 通过 HTTP 或 FTP 检索文件 |
| which | 在当前路径中查找命令 |
| who | 打印当前用户名和相关信息 |
| whoami | 打印与当前有效用户 ID 关联的用户名 |
| xargs | 对标准输入提供的每个项目执行命令 |
| yes | 重复输出包含所有指定字符串的行,或输出 y |
| zcat | 解压缩并输出到标准输出 |
2. SDRAM 接口配置基础
2.1 SDRAM 基本原理
要理解 SDRAM 的设置,需要了解其基本操作原理。SDRAM 设备被组织成单元矩阵,一部分地址位用于行寻址,另一部分用于列寻址。
一个简化的读取操作示例如下:
1. 处理器在 SDRAM 地址总线上输出行地址,并断言其行地址选择(RAS)信号。
2. 经过一个短的预编程延迟,让 SDRAM 电路捕获行地址后,处理器输出列地址并断言其列地址选择(CAS)信号。
3. SDRAM 控制器将实际的物理内存地址转换为行地址和列地址。
许多 SDRAM 控制器可以配置行和列的宽度大小,例如 PPC405GP。在 SDRAM 控制器设置中,这是必须配置的部分。
例如,突发读取一次读取四个内存位置,只输出一个 RAS 和 CAS 周期,SDRAM 内部电路会自动递增后续三个位置的列地址,无需处理器发出四个单独的 CAS 周期,这是性能优化的一个例子。
2.2 SDRAM 刷新
SDRAM 由单个晶体管和电容器组成。晶体管提供电荷,电容器负责保留(存储)单个单元的值。由于某些原因,电容器只能在短时间内保持值。动态内存的一个基本概念是代表每个单元的电容器必须定期充电以保持其值,这就是 SDRAM 刷新。
刷新周期是一种特殊的内存周期,它既不向内存读取也不写入数据,只是执行所需的刷新操作。SDRAM 控制器的主要职责之一是确保及时发出刷新周期以满足芯片的要求。芯片制造商规定了最小刷新间隔,设计者的任务是保证这一点。通常,SDRAM 控制器可以直接配置以选择刷新间隔,例如 PowerPC 405GP 有一个专门用于此目的的寄存器。
2.3 时钟设置
“同步”意味着 SDRAM 设备的数据读写周期与 CPU 的时钟信号一致。SDR SDRAM 在每个 SDRAM 时钟周期进行读写操作,DDR SDRAM 在每个时钟周期进行两次读写操作,一次在时钟的上升沿,一次在下降沿。
现代处理器具有复杂的时钟子系统,许多处理器有多个时钟速率用于系统的不同部分。典型的处理器使用相对低频的晶体生成时钟源作为其主时钟信号,处理器内部的锁相环生成 CPU 的主时钟(即我们比较处理器速度时所说的时钟速率)。
由于 CPU 通常比内存子系统运行得快得多,处理器会生成主 CPU 时钟的一个子倍数来提供给 SDRAM 子系统。需要为特定的 CPU 和 SDRAM 组合配置这个时钟比率。
以 AMCC 405GP 为例,它采用单个晶体生成的时钟输入源,并生成其各个子系统所需的多个内部和外部时钟,具体时钟配置如下表所示:
| 时钟 | 速率 | 注释 |
| — | — | — |
| 晶体参考 | 33MHz | 提供给处理器的基本参考 |
| CPU 时钟 | 133MHz | 由处理器的内部 PLL 派生,通过硬件引脚绑定和寄存器设置控制 |
| PLB 时钟 | 66MHz | 从 CPU 时钟派生,通过硬件引脚绑定和寄存器设置配置,用于处理器内部高速模块之间的本地总线数据交换 |
| OPB 时钟 | 66MHz | 从 PLB 时钟派生,通过寄存器设置配置,用于不需要高速连接的外设的内部连接 |
| PCI 时钟 | 33MHz | 从 PLB 时钟派生,通过寄存器设置配置 |
| MemClk | 100MHz | 直接驱动 SDRAM 芯片,从 CPU 时钟派生,通过寄存器设置配置 |
时钟设置的决策通常在硬件设计时做出。引脚绑定选项决定了处理器通电时的初始时钟配置。通过设置处理器内部专门用于时钟和子系统控制的寄存器中的分频器位,通常可以对派生时钟进行一定程度的控制。在基于 405GP 的示例中,最终的时钟配置由引脚绑定和固件配置决定。在通电后,引导加载程序的职责是尽早设置初始分频器和任何其他可通过处理器寄存器位配置的时钟选项。
下面是一个简单的 mermaid 流程图,展示了 SDRAM 时钟设置的大致流程:
graph TD
A[硬件设计确定引脚绑定] --> B[通电,引脚绑定决定初始时钟配置]
B --> C[引导加载程序设置初始分频器和时钟选项]
C --> D[最终时钟配置完成]
3. SDRAM 控制器配置
在完成时钟配置后,接下来的步骤是配置 SDRAM 控制器。不同处理器的控制器差异很大,但最终目标都是相同的:必须提供正确的时钟和定时值,以启用和优化 SDRAM 子系统的性能。
以 405GP 处理器为例,通过 U - Boot 引导加载程序进行 SDRAM 控制器的配置。U - Boot 在
.../cpu/ppc4xx/sdram.c
文件的汇编语言启动代码
start.S
中提供了 SDRAM 初始化的钩子。以下是 U - Boot 中
sdram_init()
函数的代码:
01 void sdram_init(void)
02 {
03 ulong sdtr1;
04 ulong rtr;
05 int i;
06
07 /*
08 * Support for 100MHz and 133MHz SDRAM
09 */
10 if (get_bus_freq(0) > 100000000) {
11 /*
12 * 133 MHz SDRAM
13 */
14 sdtr1 = 0x01074015;
15 rtr = 0x07f00000;
16 } else {
17 /*
18 * default: 100 MHz SDRAM
19 */
20 sdtr1 = 0x0086400d;
21 rtr = 0x05f00000;
22 }
23
24 for (i = 0; i < N_MB0CF; i++) {
25 /*
26 * Disable memory controller.
27 */
28 mtsdram0(mem_mcopt1, 0x00000000);
29
30 /*
31 * Set MB0CF for bank 0.
32 */
33 mtsdram0(mem_mb0cf, mb0cf[i].reg);
34 mtsdram0(mem_sdtr1, sdtr1);
35 mtsdram0(mem_rtr, rtr);
36
37 udelay(200);
38
39 /*
40 * Set memory controller options reg, MCOPT1.
41 * Set DC_EN to '1' and BRD_PRF to '01' for 16 byte PLB Burst
42 * read/prefetch.
43 */
44 mtsdram0(mem_mcopt1, 0x80800000);
45
46 udelay(10000);
47
48 if (get_ram_size(0, mb0cf[i].size) == mb0cf[i].size) {
49 /*
50 * OK, size detected -> all done
51 */
52 return;
53 }
54 }
55 }
该函数的具体操作步骤如下:
1. 读取 405GP 处理器上的引脚绑定,以确定 SDRAM 时钟的设计值。这里支持 100MHz 和 133MHz 两种可能的值,并根据选择为后续设置 SDRAM 控制器的寄存器位选择相应的常量。
2. 从第 24 行开始,使用一个循环为最多五个预定义的内存大小设置参数。U - Boot 目前有逻辑支持单组大小为 4MB、16MB、32MB、64MB 或 128MB 的内存,这些大小在
.../cpu/ppc4xx/sdram.c
文件的
mb0cf
表中定义。循环的操作如下:
- 根据 SDRAM 时钟速度选择定时常量。
- 禁用 SDRAM 内存控制器。
- 使用
size[i]
和
timing constants[i]
配置 0 号内存库。
- 重新启用 SDRAM 内存控制器。
- 运行简单的内存测试以动态确定内存大小(使用
get_ram_size()
函数)。
- 如果测试的大小等于配置的大小,则完成配置。
以 64MB DRAM 大小为例,内存库控制寄存器设置如下:
内存库 0 控制寄存器 = 0x000a4001
PowerPC 405GP 用户手册对该寄存器各字段的描述如下表所示:
| 字段 | 值 | 注释 |
| — | — | — |
| 银行地址 (BA) | 0x00 | 该内存库的起始内存地址 |
| 大小 (SZ) | 0x4 | 此内存库的大小,这里是 64MB |
| 寻址模式 (AM) | 0x2 | 确定内存的组织方式,包括行和列地址位的数量。这里模式 2 表示 12 位行地址,9 或 10 位列地址,最多四个内部 SDRAM 库 |
| 银行启用 (BE) | 0x1 | 此寄存器配置的内存库的启用位,405GP 中有四个这样的内存库配置寄存器 |
3.1 定时参数设置
假设 SDRAM 时钟速度为 100MHz,内存大小为 64MB,
sdram_init()
函数选择的定时常量如下:
- SDRAM 定时寄存器 = 0x0086400d
- 刷新定时寄存器 = 0x05f00000
PowerPC 405GP 用户手册对 SDRAM 定时寄存器各字段的描述如下表所示:
| 字段 | 值 | 注释 |
| — | — | — |
| CAS 延迟 (CASL) | 0x1 | SDRAM CAS 延迟,该值直接来自 SDRAM 芯片规格,代表从发出读取命令(CAS 信号)到数据在数据总线上可用所需的时钟周期延迟,这里 0x1 表示两个时钟周期 |
| 预充电命令到下一次激活 (PTA) | 0x1 | SDRAM 预充电命令使给定行失效,激活命令使给定行可用于后续访问。此定时参数强制预充电到后续激活周期之间的最短时间,由 SDRAM 芯片决定,这里 0x1 表示两个时钟周期 |
| 读写到预充电命令最小时间 (CTP) | 0x2 | 此定时参数强制 SDRAM 读写命令到后续预充电命令之间的最小时间延迟,由 SDRAM 芯片规格确定,这里 0x2 表示三个时钟周期 |
| SDRAM 命令先导 (LDF) | 0x1 | 此定时参数强制地址或命令周期断言到库选择周期之间的最小时间延迟,由 SDRAM 芯片规格确定,这里 0x1 表示两个时钟周期 |
刷新定时寄存器需要一个字段来确定 SDRAM 控制器强制执行的刷新间隔。该字段被视为一个以 SDRAM 时钟频率运行的简单计数器。在假设 SDRAM 时钟频率为 100MHz 的示例中,编程到该寄存器的值为 0x05f0_0000,根据 PowerPC 405GP 用户手册,这将每 15.2 微秒产生一次刷新请求。
一个典型的 SDRAM 芯片要求每行进行一次刷新周期,每行必须在制造商指定的最短时间内刷新。例如,某芯片要求每 64 毫秒刷新 8192 行,这意味着需要每 7.8 微秒生成一个刷新周期以满足该设备的规格要求。
下面是一个 mermaid 流程图,展示了 SDRAM 控制器配置的整体流程:
graph TD
A[读取引脚绑定确定 SDRAM 时钟值] --> B[选择定时常量]
B --> C[循环配置内存库参数]
C --> D{内存测试通过?}
D -- 是 --> E[配置完成]
D -- 否 --> C
综上所述,BusyBox 命令为系统管理提供了丰富的工具,而 SDRAM 接口的正确配置对于系统的性能至关重要。在实际应用中,需要深入理解这些知识,并根据具体的硬件和需求进行合理的设置和调整。
超级会员免费看
2599

被折叠的 条评论
为什么被折叠?



