/***********************************************************************************
*
* linux 3.5,U-Boot,Busybox,SD卡启动环境搭建
*
* 声明:
* 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会
* 不对齐,从而影响阅读.
* 2. 以下所有的shell命令都是在root权限下运行的;
* 3. minicom(U-Boot)指的是用minicom连接开发板做为U-Boot的终端;
* 4. 文中在需要往文件中写入内容的时候使用了如下2方式:
* 1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容:
* cat > 文件名 << EOF (结束符)
* ...
* 文件内容...
* ...
* EOF (输入遇到EOF,cat指令结束,内容将保存在前面指定的文件名中)
* 2.如果文件不存在,创建文件;如果存在,将内容追加到文件尾:
* cat >> 文件名 << EOF (结束符)
* ...
* 文件内容...
* ...
* EOF
*
* 2015-3-7 阴 深圳 尚观 Sbin 曾剑锋
**********************************************************************************/ \\\\\\\\\\\\\\--*目录*--/////////////
| 一. 预热文章;
| 二. 内核源码树介绍;
| 三. 配置交叉编译器;
| 四. 内核编译流程以及原理;
| 五. 安装并配置minicom程序;
| 六. U-Boot编译;
| 七. U-Boot SD卡启动;
| 八. Android fast_boot SD卡启动;
| 九. 使用Busybox制作文件系统;
| 十. NFS配置;
\\\\\\\\\\\\\\\\\\\////////////////// 一. 预热文章:
. 计算机是如何启动:
http://www.ruanyifeng.com/blog/2013/02/booting.html
. Linux 的启动流程:
http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html
. Unix目录结构的来历:
http://lists.busybox.net/pipermail/busybox/2010-December/074114.html
http://www.ruanyifeng.com/blog/2012/02/a_history_of_unix_directory_structure.html 二. 内核源码树介绍:
. arch(architecture): 与平台架构相关的文件
. block: 块设备IO调度策略实现
. COPYING: 版权声明
. crypto: 常用加密,校验方法实现
. Documentation: 内核官方文档
zh_CN: 中文翻译文档
. drivers: 设备驱动程序
. fs(file system): 文件系统实现
. include: 内核头文件
. init: 内核启动代码
. ipc(inter process communication): 进程间通信实现
. signal 信号
. pipe 无名管道
. named pipe(FIFO) 命名管道
. message queue 消息队列
. shared memory 共享内存
. semaphore 信号量
. socket 套接字
. kernel: 内核核心代码
. lib(library): 通用库实现
. mm(memory manage): 内存管理方法实现
. net: 网络协议栈实现
. samples: 内核示例代码
. scripts: 内核编译工具
. sound: 与音频相关代码
. oss(open sound system)
. alsa(advance linux sound 三. 配置交叉编译器:
. tar xf arm-linux-gcc-4.5.-v6-vfp-.tgz
. cp opt/* /opt -r
3. cat >> ~/.bashrc << EOF (配置环境变量,以方便使用交叉编译器)
PATH=$PATH:opt/FriendlyARM/toolschain/4.5.1/bin
EOF
4. source ~/.bashrc (使前面的配置的PATH生效)
5. 检查是否已配置好:
在终端输入: arm后按两下tab出现如下表示正常
arm-linux-addr2line arm-none-linux-gnueabi-addr2line
arm-linux-ar arm-none-linux-gnueabi-ar
arm-linux-as arm-none-linux-gnueabi-as
arm-linux-c++ arm-none-linux-gnueabi-c++
arm-linux-cc arm-none-linux-gnueabi-cc
arm-linux-c++filt arm-none-linux-gnueabi-c++filt
arm-linux-cpp arm-none-linux-gnueabi-cpp
arm-linux-g++ arm-none-linux-gnueabi-g++
arm-linux-gcc arm-none-linux-gnueabi-gcc
arm-linux-gcc-4.5.1 arm-none-linux-gnueabi-gcc-4.5.1 四. 内核编译流程以及原理:
1. make menuconfig
1. 程序会运行: scripts/kconfig/mconf Kconfig
2. 配置完保存后,在内核树的根目录下生成: .config文件,是隐藏文件;
3. Kconfig的语法请参考: Documentation/kbuild/kconfig-language.txt
2. make -j2 zImage
1. 参数-j2是开启2个线程来编译内核,zImage编译目标;
2. 程序会运行: scripts/kconfig/conf .config,生成如下文件:
1. include/config/auto.conf: 用于Makefile中的的模块编译选择;
CONFIG_MENU3=y
CONFIG_M2=y
2. include/generated/autoconf.h: 用于内核源代码的#ifdef/#ifndef;
#define CONFIG_MENU3 1
#define CONFIG_M2 1
3. 根据上面的auto.conf和autoconf.h,将内核中的.c文件编译成.o文件;
4. 再把每个目录下的.o通过ar命令打包在built-in.o放到上一级目录中,
所以每个目录都有一个built-in.o
5. 以此类推,在源码目录的顶级目录会得到一个built-in.o文件并转换为vmlinux.o
6. vmlinux.o经过链接器链接(ld)得到vmlinux
7. 因为内核是运行在裸板上的,所以需要去掉elf文件头,得到了二进制Image文件;
8. Image经过gzip压缩以后得到了最终的zImage文件;
9. 可以通过nm vmlinux内核符号,查看需要的驱动没有编译进内核,当然也可以通过
查看内核根目录下的System.map中的地址符号表,这跟U-Boot一样. 五. 安装并配置minicom程序:
1. 安装minicom: yum install minicom
2. 通过USB转串口线连接开发板与电脑,运行命令: ls /dev/
找到对应的设备节点,本文假设开发板对应的设备节点是:/dev/ttyUSB0
3. 配置minicom:
1. 在终端: minicom -s
2. 进入界面后: 选Serial port setup
3. 当使用usb转串口时,Serial Deveice: /dev/ttyUSB0
+-------------------------------------------+
| A - Serial Device : /dev/ttyUSB0 |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? | 4. 照上面设好后,选 Save setup as dfl保存为默认配置 六. U-Boot编译:
1. make tiny4412_config //(对应的内容可在boards.cfg里查询)
2. make //编译完成后u-boot.bin就是所要的文件,u-boot.bin是把u-boot文件
//的elf文件信息去除后得来的 七. U-Boot SD卡启动(假设SD卡挂载在/dev/sdb,并且进入U-Boot根目录):
1. 往SD卡中烧写U-Boot: uboot_tiny4412/sd_fuse/tiny4412/sd_fusing.sh /dev/sdb
运行结果会自动分如下2个区:
1. /dev/sdb1
2. /dev/sdb4
2. 采用vfat格式格式化/dev/sdb1分区,用于放zImage: mkfs.vfat /dev/sdb1
3. 采用ext4格式格式化/dev/sdb4分区,用于放文件系统: mkfs.ext4 /dev/sdb4
4. 重新拔插SD卡,把生成上面生成的zImage放入/dev/sdb1分区中,文件系统放在/dev/sdb4分区中;
5. 将SD卡插入开发板,选择SD卡启动,打开minicom;
5. 安装dnw: tar xf dnw-linux.tar.gz && cd dnw-linux && make && make install
6. dnw测试zImage是否可行:
1. minicom(U-Boot)里面: dnw 0x40008000
2. PC侧命令: dnw arch/arm/boot/zImage (在内核根目录下运行命令)
3. minicom(U-Boot)里面: bootm 0x40008000
7. minicom(U-Boot)命令查看SD卡中的zImage是否存在: fatls mmc 0:1
8. minicom(U-Boot)加载zImage到内存0x40008000: fatload mmc 0:1 0x40008000 zImage
9. minicom(U-Boot)启动内核: bootm 0x40008000
10. minicom(U-Boot)修改bootcmd: set bootcmd "fatload mmc 0:1 0x40008000 zImage;bootm 0x40008000"
11. minicom(U-Boot)保存: save
12. minicom(U-Boot)重启: reset 八. Android fast_boot SD卡启动(需要在前面U-Boot SD卡启动的基础上操作):
1. minicom输入U-Boot命令即可对SD卡进行分区: fdisk -c 0 320 806 518
2. 重新分区后,可重新格式化FAT分区,minicom输入U-Boot命令: fatformat mmc 0:1
3. 使用USB线连接Tiny4412的MICRO_USB口到PC,然后minicom输入U-Boot命令: fastboot
4. 在PC端将fastboot脚本拷贝到$PATH目录下,当然你也许会没有fastboot,问度娘要吧;
5. 在PC端输入以下命令进行烧写: fastboot flash kernel zImage(烧写kernel)
6. zImage传输完的时候minicom会出现假死状态,按ctrl+c退出fastboot命令状态;
7. minicom(U-Boot)加载zImage到内存0x40008000: movi read kernel 0 40008000
8. minicom(U-Boot)启动内核: bootm 0x40008000
9. minicom(U-Boot)修改bootcmd: set bootcmd "movi read kernel 0 40008000;bootm 0x40008000"
10. minicom(U-Boot)保存: save
11. minicom(U-Boot)重启: reset 九. 使用Busybox制作文件系统(本文假设nfs文件系统在PC端的/disk/A9/filesystem文件加下):
1. make menucofig,在弹出来的对话框中选择一下内容:
1. Busybox Settings --> Build Options --> [*] Build BusyBox as a static binary (no shared libs)
2. Busybox Settings --> Build Options --> (arm-linux-) Cross Compiler prefix
2. mkdir /disk/A9/filesystem -p (假设/disk/A9/filesystem为nfs提供的目录)
3. make && make install CONFIG_PREFIX=/disk/A9/filesystem
4. cd /disk/A9/filesystem && mkdir dev etc sys proc mnt tmp
5. cat > etc/init.d/rcS << EOF (rcS:run command Start)
mount -t ramfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
mount -t tmpfs none /tmp
#采用设备模型进行创建设备节点的必须加上,热插拔处理,为后面的是用驱动模型作准备
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
/sbin/mdev -s
EOF
6. mknod dev/console c 5 1
7. cat > etc/inittab << EOF
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh #/bin/sh前面的-表示sh会默认加载/etc/profile
EOF
8. cat > etc/profile << EOF
export PS1="[^_^ \W]# " #设置命令提示前面的那段文字
EOF
9. mkdir lib && cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* lib
10. chmod 777 /disk/A9/filesystem -R --> 给nfs访问所有的权限
11. 文件系统制作完毕,如果想要将文件系统保存到SD卡中,请保存在第四个分区中;
12. minicom(U-Boot)里面查看到文件系统的文件夹: ext2ls mmc 0:4 /
13. SD卡文件系统bootargs设置: set bootargs "root=/dev/mmcblk0p4 console=ttySAC0,115200 lcd=S70" 十. NFS配置(本文假设PC机的IP在局域网100段):
1. 关闭防火墙(iptables),关闭selinux
2. PC侧设置:
1. 设置PC的IP: ifconfig eth0 192.168.100.22
2. cat >> /etc/exports << EOF
/disk/A9/filesystem *(rw)
EOF
3. service nfs restart
4. showmount -e 192.168.100.22 --> 查看该目录是否已经发布出去
3. U-Boot设置(通过minicom设置)
1. 开发板IP: 192.168.100.111
2. NFS服务器IP: 192.168.100.22
3. 网关: 192.168.100.1
4. 子网掩码: 225.225.225.0
5. NFS文件系统启动,U-Boot bootargs设置: set bootargs "root=/dev/nfs nfsroot=192.168.100.22:/disk/A9/filesystem ip=192.168.100.111 console=ttySAC0,115200 lcd=S70"

Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建的更多相关文章

  1. [i.MX6q]i.MX6q处理器,linux操作系统平台搭建 从SD卡启动系统

    转自:http://www.07net01.com/linux/2016/02/1232094.html 参照1:http://blog.csdn.net/girlkoo/article/detail ...

  2. ZYNQ的Linux Linaro系统镜像制作SD卡启动

    ZYNQ的Linux Linaro系统镜像制作SD卡启动 0. 概述 ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ...

  3. OMAPL138制作SD卡启动介质及重装Linux系统

    OMAPL138制作SD卡启动盘及重装Linux系统 手里的创龙的OMAPL138平台的系统SSH坏掉了,我重新移植了openssh还是不好使,没有办法了只能重装OMAPL138的系统了,按照创龙给的 ...

  4. ZYNQ的Linux Linaro系统镜像制作SD卡启动(仅使用mkfs部分,其他部分待看)

    0. 概述 ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ZYNQ内部有一个机制,该机制不可修改,可以通过拨码开关控 ...

  5. Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap

    /**************************************************************************** * * list_head,proc fil ...

  6. Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

    /*********************************************************************************** * * 字符设备驱动基本操作及 ...

  7. arm Linux 如何自动检测并mount SD卡,以及如何得知已经mount

    一.土八路做法: SD 卡一旦插入系统,内核会自动在/dev/下创建设备文件:sdcard. 但有时可能时用户在拨出卡前并没有umount的话,第二次插卡进去后系统创建的就不是sdcard设备文件了, ...

  8. 用QEMU模拟运行uboot从SD卡启动Linux

    平台:Qemu + vexpress-a9 u-boot:u-boot-2019.10 Linux:linux-4.14.13       之前介绍过用Qemu模拟运行uboot,然后从网络启动lin ...

  9. 【linux驱动笔记】linux模块机制浅析

      1.   模块module 操作系统分微内核和宏内核,微内核优点,可以使操作系统仅作很少的事,其它事情如网络处理等都作为应用程序来实现,微内核精简的同时,必然带来性能的下降.而linux的宏内核设 ...

随机推荐

  1. ie6 ie7 绝对定位 相对定位 层被遮住

    relative 上加上z-index有多个,则z-index递减, absolute层显示则不会被其它标签挡住.

  2. JSP中,当页面为404或者500时。设置跳转到错误提示页面

    最好的就是在WEB.XML文件中配置错误代码的跳转页面,首先建立个 出现500错误的页面,提示出错了,然后再WEB.XML文件中配置,配置如下 一. 通过错误码来配置error-page <er ...

  3. iOS App Icon图标 尺寸规范

    Commit to AppStore:1024*1024 //for App IconIcon-60@3x.png:180*180 //iPhone 6 Plus (@3x)Icon-60@2x.pn ...

  4. js控制html文字提示语的出现和隐藏

    有时我们需要在点击html输入框的时候,旁边会出现提示语.在输入字符的时候,输入框下边会出现输入了多少字符的提示. 请看下面实例. <!DOCTYPE html> <html> ...

  5. 小记:利用递归调用循环寻找MP3文件的方法。

    private void findMp3Data(File mp3file) { File[] filelist = mp3file.listFiles(); if (filelist != null ...

  6. 可伸缩的textview。

    在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容. 这样 ...

  7. FLASH AS 不显示中文

    我修改一个as游戏,发现公告显示不了,整整折腾了2天. flash TextField 汉字不显示,英文会显示,如果是汉字夹杂数字,只把数字显示了,汉字被忽略了.   有人说嵌入字体,网上一搜索,好麻 ...

  8. 关于Linux下C编译错误(警告)cast from 'void*' to 'int' loses precision

    char *ptr; //此后省略部分代码 ) //出错地方 那句话的意思是从 void* 到 int 的转换丢失精度,相信看到解释有些人就明白了, 此问题只会出现在X64位的Linux上,因为在64 ...

  9. 1、ViewModel类的构建和INoyifyPropertyChanged的应用

    public class SampleItem : INotifyPropertyChanged { public SampleItem() { } private string title; pub ...

  10. 戴文的Linux内核专题:05配置内核(1)

    转自Linux中国 现在我们已经了解了内核,现在我们可以进入主要工作:配置并编译内核代码.配置内核代码并不会花费太长时间.配置工具会询问许多问题并且允许开发者配置内核的每个方面.如果你有不确定的问题或 ...