根文件系统构建-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 的时候在设置。

相关推荐
待什么青丝1 天前
【TMS570LC4357】之相关驱动开发学习记录1
c语言·arm开发·驱动开发·学习
南玖yy2 天前
x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)
开发语言·汇编·arm开发·后端·架构·策略模式
菜只因C3 天前
嵌入式系统:从技术原理到未来趋势(驱动程序篇)
arm开发
!chen5 天前
鲲鹏Arm+麒麟V10 K8s 离线部署教程
java·arm开发·kubernetes
ScilogyHunter5 天前
ARM P15协处理器指令详解:架构、编程与应用实践
arm开发·协处理器指令·cp15
apolloyhl6 天前
1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集
arm开发·stm32·单片机·嵌入式硬件
二进制coder6 天前
芯片:数字时代的算力引擎——鲲鹏、升腾、海光、Intel 全景解析
arm开发·架构·硬件架构
荆楚闲人7 天前
Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法
arm开发
MonKingWD7 天前
【Redis原理】四万字总结Redis网络模型的全部概念
网络·arm开发·redis
程序猿阿伟7 天前
《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
arm开发·人工智能