根文件系统构建-busybox中文支持

一. 简介

根文件系统里面就是一堆的可执行文件和其他文件组成的?难道我们得一个一个的从网上去下载这些文件?显然这是不现实的!那么有没有人或者组织专门干这个事呢? 他们负责"收集"这些文件,然后将其打包,像我们这样的开发者可以直接拿来用。答案是有 的,它就叫做 BusyBox !

根文件系统制作除了使用 busybox 来制作外,还有很多成熟化的根文件系统构建方式,例如buildroot,yocto

BusyBox 是一个集成了大量的 Linux 命令和工具的软件,像 ls、mv、ifconfig 等命令 BusyBox 都会提供。BusyBox 就是一 个大的工具箱,这个工具箱里面集成了 Linux 的许多工具和命令。一般下载 BusyBox 的源码, 然后配置 BusyBox,选择自己想要的功能,最后编译即可。

二. busybox 构建根文件系统

这里我们使用 busybox 打包制作根文件系统。构建的根文件系统调试,我们通过 nfs 网络挂载,也就是将根文件系统存放到 ubuntu系统下,开发板启动以后,通过 nfs服务使用ubuntu下的根文件系统。

1. 下载 busybox源码

BusyBox 可以在其官网下载到,官网地址为:

复制代码
https://busybox.net/

打开官网后,如下打开 "Download Source" 选项,如下:

可以看出,目前最新的 BusyBox 版本是 1.36.1 。
不过正点原子的左神建议大家,使用我们开 发板光盘里面提供的 1.29.0 版本的 BusyBox 。因为左神说他测试 1.29.0 版本目前还没有出现任何问 题。
正点原子提供的 busybox源码包的路径为: 例程源码 -> BusyBox 源码->busybox-1.29.0.tar.bz2

2. 打开 busybox的中文支持

将正点原子提供的 busybox源码包拷贝到 ubuntu系统下,并加压源码包。之后通过 vscode打开 busybox源码。
如果默认直接编译 busybox 的话,在使用 SecureCRT 的时候中文字符是显示不正常的,中文字符会显示为**"** ? " ,例如,你的中文目录,中文文件都显示为**"** ? "。不知道从哪个版本开始 busybox 中的 shell 命令对中文输入即显示做了限制,即使内核支持中文但在 shell 下也依然无法正确显 示。
所以我们需要修改 busybox 源码,取消 busybox 对中文显示的限制。

更改分两个部分:printable_string.c 与 unicode.c 更改。
打开文件 busybox-1.29.0/libbb/printable_string.c,找到 printable_string() 函数,屏蔽或更改后代码如下:

复制代码
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
{
	char *dst;
	const char *s;

	s = str;
	while (1) {
...................................
    /* 注释掉下面这个两行代码 */
	/*	if (c >= 0x7f)
			break;     */
		s++;
	}

#if ENABLE_UNICODE_SUPPORT
	dst = unicode_conv_to_printable(stats, str);
#else
	{
...................................
        /* 修改下面代码 */
		/*	if (c < ' ' || c >= 0x7f) */
            if(c < ' ')
				*d = '?';
			d++;
		}
		if (stats) {
			stats->byte_count = (d - dst);
			stats->unicode_count = (d - dst);
			stats->unicode_width = (d - dst);
		}
	}
#endif
	return auto_string(dst);
}

可以看出,屏蔽了 第10~11行的代码:即当字符大于 0X7F 以后就跳出去了。

去掉了第 21行关于当字符大于 0X7F 的判断。

接着打开文件 busybox-1.29.0/libbb/unicode.c,找到unicode_conv_to_printable2函数,更改后的代码如下:

复制代码
static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags)
{
	char *dst;
	unsigned dst_len;
	unsigned uni_count;
	unsigned uni_width;

	if (unicode_status != UNICODE_ON) {
		char *d;
		if (flags & UNI_FLAG_PAD) {
			d = dst = xmalloc(width + 1);
			while ((int)--width >= 0) {
............................................
                /* 修改下面一行代码 */
			 /*	*d++ = (c >= ' ' && c < 0x7f) ? c : '?';  */
                *d++ = (c >= ' ') ? c : '?';
				src++;
			}
			*d = '\0';
		} else {
			d = dst = xstrndup(src, width);
			while (*d) {
				unsigned char c = *d;
                /* 修改下面一行代码 */
				/*if (c < ' ' || c >= 0x7f) */
                if(c < ' ')
					*d = '?';
				d++;
			}
.............................................
}

可以看出,第 15行,当字符大于 0X7F 以后,*d++就为'?'。将这一行进行更改。

第 25 行,,当字符大于 0X7F 以后,*d 也为'?'。 也更改这一行判断。

busybox 中文字符支持跟代码修改有关的就改好了,最后还需要配置 busybox来使能 unicode 码,这个稍后我们配置 busybox 的时候在设置。

相关推荐
sunshine~~~26 分钟前
【笔记】macOs arm架构安装虚拟机Ubuntu环境:ROS2 + Python开发
arm开发·笔记·python·macos·ros2
碧海银沙音频科技研究院1 小时前
i2s封装成自己定义8路音频数据发送方法
arm开发·人工智能·深度学习·算法·音视频
IAR Systems5 小时前
使用J-Link Attach NXP S32K3导致对应RAM区域被初始化成0xDEADBEEF
arm开发·数据库·嵌入式软件开发·iar
chen36735 小时前
嵌入式AI Arm_linux_第一个Demo_让IPU跑起来
linux·arm开发·人工智能
电鱼智能的电小鱼19 小时前
基于电鱼 ARM 工控机的AI视频智能分析方案:让传统监控变得更聪明
网络·arm开发·人工智能·嵌入式硬件·算法·音视频
电鱼智能的电小鱼1 天前
基于电鱼 ARM 工控机的井下设备运行状态监测方案——实时采集电机、电泵、皮带机等关键设备运行数据
arm开发·人工智能·嵌入式硬件·深度学习·机器学习·制造
wanhengidc1 天前
服务器在企业中的作用与价值
运维·服务器·arm开发·安全·智能手机·玩游戏
绵绵细雨中的乡音1 天前
仓颉语言中的内存布局优化技巧与工程实践
arm开发
cellurw2 天前
Day71 MQTT数据上传与ARM端交叉编译部署全链路实践
arm开发
wanhengidc2 天前
云手机适配用户有哪些?
服务器·arm开发·安全·智能手机·玩游戏