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

相关推荐
TeYiToKu9 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
w微信150135078121 天前
小华一级 代理商 HC32F005C6PA-TSSOP20 HC32F005系列
c语言·arm开发·单片机·嵌入式硬件
憧憬一下1 天前
Pinctrl子系统中Pincontroller和client驱动程序的编写
arm开发·嵌入式·c/c++·linux驱动开发
上海知从科技1 天前
知从科技受邀出席ARM日产技术日
arm开发·科技
极客小张3 天前
基于STM32的智能温室环境监测与控制系统设计(代码示例)
c语言·arm开发·stm32·单片机·嵌入式硬件·物联网·毕业设计
TeYiToKu3 天前
笔记整理—linux驱动开发部分(6)platform平台总线
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件
飞腾开发者3 天前
飞腾平台Arm ComputeLibrary编译安装指南
linux·服务器·arm开发·后端·性能优化
CodingCos3 天前
【ARM Linux 系统稳定性分析入门及渐进 1.1 -- Crash 工具功能概述】
linux·arm开发·crash tools·linux crash·crash 工具使用
@haihi5 天前
IIC和SPI的区别和相同之处
arm开发·stm32·mcu
@@庆5 天前
FreeRTOS 数据传输方法(环形buffer,队列的本质)队列实验—多设备玩游戏
arm开发·stm32·单片机·嵌入式硬件·freertos