在引导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 = '\0';
   } else {
   d = dst = xstrndup(src, width);
   while (*d) {
   unsigned char c = *d;
   /* 修改下面一行代码 */
   /* if (c < ' ' || c >= 0x7f) */
   if(c < ' ')
   *d = '?';
   d++;
   }
   }
......
   return dst;
}

3、配置busybox 这里同u-boot的配置一样,busybox共有三个预先的配置文件defconfig、allyesconfig、allnoconfig见文知意不啰嗦了,这里我选择make defconfig 。当然他也支持图形界面配置。

之后再在图形界面上选中uniconde支持和非静态连接编译就可以编译了,这里选择非静态我也只是参考未究其原理。

4、执行make install CONFIG_PREFIX=/xxx  这里如果xxx目录不存在需要提前建好。最后就是得到根文件系统了。

引导LInux开机

这里就是简单的测试引导开机所以就直接找打Linux内支持本芯片的配置文件配置之后直接编译得到uimage。这里我是使用SD卡作为启动介质。在这里提醒自己以后linux的相关东西一定不要在windows上操作了,不然坑把自己填进去可能都平不了。在ubantu上SD卡分成两个分区一共8G的卡我第一个分区分1G的大小用来放linux内核镜像,第二个分区给力6个G,需要注意的时SD卡的前面还按默认预留了2048个block,这里主要是预留给u-boot的。之后按网上的方法把u-boot写到SD卡的无分区扇区,然后拷贝Linux镜像uiamge到分区1,在拷贝根文件系统到分区二。接下来就是启动测试了(开始填坑。。。)

第一个问题

u-boot的两个环境变量没有关心这个是必须的,bootargs和bootcmd,第一个环境变量是u-boot引导Linux后传给他的参数,相当与main(argc,argv),所以很重要,具体怎么设置根据启动方式的配置不同需要更具体的设置,其次是bootcmd这个其实只是u-boot倒计时结束后默认执行的命令,但是如果你是手动引导的话就可以不设置,这里也是具体情况具体配置。

第二个问题

前面我移植u-boot时选择的是新增加一个SOC的方式,所以arch_number也是我自己自定义的,但是内核支持我这个芯片所以他有自己的的arch_number,这个是决定Linux启动之后执行什么操作的,也是编译好的内核特定支持的。所以前面自己随便指定的soc编号这里启动时内核就不认了。

第三个问题

linux 3.0.8的内核引导不了,为什么时这个版本捏,主要是友善之臂的版本就是这个所以一开始就说拿这个试试,想不到这个还是个坑,具体就是打印Starting kenel。。。。后就没有动静了,问题不清楚。

第四个问题

根文件系统的文件系统我是ext4内核编译的时候默认没选择支持,所以挂载根文件系统时失败了好久,中间还尝试NFS 的方式,却因为网络的问题最后放弃又回来搞SD卡,最后还是从NFS得到了启发,因为NFS时候需要选择支持网络文件系统,而且需要配置网络的和具体的网卡设备,最后使能了ext4文件系统支持后才成功挂载根文件系统。

第五个问题

不要用windows干分区的活,最后挂载一定会发现根文件系统分区损坏无法挂载。

这次就是简单记录下自己这个过程遇到的坑,没由详细的过程。后续有心思了在整理下详细的过程吧,主要是Linux现在可以启动了先暂时记录下。

Linux驱动开发---》路漫漫其修远兮,苦其心志,劳其体肤啊!

u-boot 移植 --->6、引导Linux启动测试的更多相关文章

  1. Boot Repair-能一键修复ubuntu启动/引导项的软件(告别命令行)

    如果你是windows+ubuntu的双系统,那么重装windows之后(非ghost 方式),是会直接进入windows的,之前的grub引导菜单会被抹掉,想要修复ubuntu的启动菜单的话,通常需 ...

  2. linux 启动引导流程

    课程大纲: Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 系统引导流程 1.固件firmware(CMOS(固化在硬件上的程序与硬件统称)/B ...

  3. Linux学习笔记之Linux启动引导过程

    早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...

  4. (转)Linux 开机引导和启动过程详解

    Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...

  5. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  6. linux 启动引导器 grub,单用户模式:

    Linux启动引导器 安装linux操作系统的时候就已经将启动引导器安装到硬盘上去了,才能通过硬盘的读取方式启动操作系统. 引导器分为2种: Lilo:功能比较简单,使用比较麻烦,后续发行版中使用gr ...

  7. 『学了就忘』Linux启动引导与修复 — 70、grub启动引导程序的配置文件说明

    目录 1.grub中分区的表示方法 2.grub的配置文件 3.grub的配置文件内容说明 (1)grub的整体设置 (2)CentOS系统的启动设置 1.grub中分区的表示方法 在说grub启动引 ...

  8. 说一下linux启动过程boot流程

    linux启动过程 https://www.ibm.com/developerworks/cn/linux/l-linuxboot/index.html http://www.ruanyifeng.c ...

  9. Linux启动报错missing operating system

    用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...

随机推荐

  1. Http中的options请求

    引自:https://www.jianshu.com/p/5cf82f092201.https://www.cnblogs.com/mamimi/p/10602722.html 一.options是什 ...

  2. uni-app开发经验分享五: 解决三端页面兼容问题的方法

    在做uni-app开发的过程中,我们最头疼可能不是开发的过程中的逻辑,而是最后要做的三端兼容测试和修改,在我开发的项目中,这一步都是最头疼和令人头秃的过程,这里总结一些个人开发遇到的问题,希望对大家有 ...

  3. JavaScript中函数的定义!

    JavaScript中函数的定义! 1 自定义函数(命名函数) function fun() {}; 2 函数表达式(匿名函数) var fun = function () {}; 3 利用 new ...

  4. 【Windows】Win10家庭版启用组策略gpedit.msc

    [前言] 大家都认为,Windows 10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已.那么我们让系统允许你使用就好了. [操作步骤] 1.首先你需要在桌面上新建一个txt文 ...

  5. Serverless对研发效能的变革和创新 云托管和Serverless应用差异

    https://mp.weixin.qq.com/s/J4RXtKanh3IMr4fY7t0nyQ Serverless对研发效能的变革和创新 杨皓然(不瞋) 阿里巴巴中间件 2020-10-23

  6. 线上nginx的一次“no live upstreams while connecting to upstream ”分析

    线上nginx的一次"no live upstreams while connecting to upstream "分析 线上nginx的一次"no live upst ...

  7. call by value reference name python既不是按值传递也不是按引用传递 python复制原理 创建新对象 与 改变原对象

    按名调用 Algol 按值调用 Java https://docs.python.org/3.6/faq/programming.html#how-do-i-write-a-function-with ...

  8. 动态传参,命名空间,嵌套,gloabal,nonlocal

    一.动态传参 动态接受位置参数:  *参数名 def eat(*food): print(food) #多个参数传递进去,收到的内容是元祖tuple eat("盖浇饭", &quo ...

  9. 洛谷 P1401 城市

    写在前面 今天来水主题库里的有水分的紫题,随便一翻竟然找到宝了. 小清新二分 + 网络流. 算法思路 考虑到题目中限制的是最大边权,要求最大边权最小,那么很容易想到二分答案. 单调性的证明:最大边权是 ...

  10. Node.js 安全指南

    当项目周期快结束时,开发人员会越来越关注应用的"安全性"问题.一个安全的应用程序并不是一种奢侈,而是必要的.你应该在开发的每个阶段都考虑应用程序的安全性,例如系统架构.设计.编码, ...