在引导Linux开机之前需要先清楚Linux启动的必要或者说是先决条件,这里就是提到了u-boot的作用了引用百度云---主要用于嵌入式系统的引导加载,其实在我调试下来总结一下就是初始化硬件这里的硬件包括必要部分和不必要的部分,比如SOC的时钟,外部RAM(DDR内存),栈等。因为linux的内核相对于SOC内部的RAM而言还是比较庞大的,并且运行Linux的SOC的主频普遍是比较高的,受限于flash的访问速度,Linux肯定是不能像单片机的程序一样放在片上flash运行的,毕竟在48M以上的时候常见的单片机都是需要加wait以匹配CPU和flash的速度差距了。所以u-boot一定的需要先初始化好RAM(DDR)然后将linux拷贝到RAM内来运行。所以Linux启动的硬件环境和一些必须的软件环境由u-boot负责配置好,最后也是u-boot将Linux内核放到DDR中最后把运行权交由Linux的代码的。引导linux运行除了u-boot准备好的部分工作后剩下还有几个分两种情况。必须和设备树配合的较新的内核版本和不需要设备树的老内核。这两种情况都需要根文件系统,设备树则不一定。所以这里简单记录一下根文件系统的构建。
根文件件系统的构建
根文件系统是Linux启动必须的,主要就是使用busybox进行配置和编译后得到,除此之外如果不使用静态连接的方式还需要交叉编译工具的库。首先下载busybox的源码,然后解压后开始配置。
1、添加编译器
这里的套路和u-boot和linux的编译之前相同就是修改顶层的makefile脚本的CORSS_COMOLIE为你自己的编译工具,ARCH为你的目标架构。
2、增加中文支持这里参考开源电子网的修改
修改目录libbb/printable_string.c文件
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) { char *dst; const char *s; s = str; while (1) { ...... if (c < ' ') break; /* 注释掉下面这个两行代码 */ /* if (c >= 0x7f) break; */ s++; }
继续修改/libbb/unicode.c
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); ...... /* 修改下面一行代码 */ /* *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; */ *d++ = (c >= ' ') ? c : '?'; src++; } *d = '