admin 管理员组

文章数量: 1184232

Linux编译参考文档

http://my.oschina/u/1982421/blog/304633

Uboot学习参考资料

http://blog.csdn/andy_wsj/article/category/1335685

BusyBox创建文件系统的参考

http://www.th7/system/lin/201403/50580.shtml


上面是众多参考资料中的一部分,Link君和Peter参考了N多之后,终于开始尝试着自己制作Linux系统


1.u14安装新的hf工具链:

apt-getinstall gcc-arm-linux-gnueabihf

提示会卸载掉g++mutilibgcc-mutilib


2.clone U-boot

workspace下开目录cb2,然后克隆分支

gitclone https://github/cubieboard/u-boot-sunxi.git -b cubie/sunxi

注意githububoot,内核版本很多


3.编译u-boot

切入u-boot-sunxi这个目录

cdu-boot-sunxi

清理:makedistclean CROSS_COMPILE=arm-linux-gnueabihf-

编译:makeCubieboard2 CROSS_COMPILE=arm-linux-gnueabihf-


编译完之后会出现u-boot-sunxi-with-spl.bin


4.SD卡分区 烧写

USB设备对于ubuntu来说由于插进去会自动mount,因此请看完盘符后及时umount

sudoumount /dev/sdx1,否则会被占用。


card=/dev/sdc #注意这里只要sdc,不是sdc1,sdc2

sudodd if=/dev/zero of=${card} bs=1M count=1 #SD卡前1M的区域填充为0,预留给u-boot

Q:为啥要复制完了才fdisk?不能先fdisk

A:复制流程里有清空最前面1MB的命令,这样分区表就完蛋了。


接下来回fdisk和格式化

sudofdisk ${card} #使用fdisk进行分区


建立第一个64M分区,用来存放script.binuEnv uImage

依次 n,p, 2048, +64M


建立第二个分区,用来存放文件系统

依次 n,4个回车


接下来指定分区类型,第一个分区是w95fat32LBA)分区:

t,1, c

显示Changedsystem type of partition 1 to c (W95 FAT32 (LBA))


最后一步

w #执行以上分区


接下来格式化分区:


sudomkfs.vfat ${card}1

sudomkfs.ext4 ${card}2 #需要稍等片刻


烧写bootloader

sudodd if=u-boot-sunxi-with-spl.bin of=$card bs=1024 seek=8

bs:块大小1024

seek:从输出文件开头跳过8个块后再开始复制,空出8k据说留给分区表。

注意在编译完u-boot后,在spl目录下会有一个u-boot-spl.bin,有些文档中说先要烧写spl,再烧写u-boot

#ddif=spl/sunxi-spl.bin of=/dev/sdb bs=1024 seek=8

#ddif=u-boot.bin of=/dev/sdb bs=1024 seek=32


但貌似u-boot不断升级之后,目前这个版本的u-bootwith-spl的,所以就有了u-boot-sunxi-with-spl.bin

烧写这个with版的就可以了

当然如果要分别测试验证的,又另当别论了


好了,到了这一步,拔出SD卡,插入cb2后,就可以看到u-boot

可以进入u-boot的命令提示符sun7i#


u-boot有很多东西,Link君刚刚入门,还有很多东西要学习

看友们可以尝试在sun7i#键入help查看uboot的命令,

键入 printenv打印变量参数,


命令和参数在下面的内容,有些会用到



4.制作script.bin

script.bin是由xxx.fex转换而来的

xxx.fex就是和硬件相关的配置表,即不同的板子不同的管脚是怎么分配的,

这个很简单


gitclone git://github/linux-sunxi/sunxi-tools.git

gitclone git://github/linux-sunxi/sunxi-boards.git


sunxi-tools里有一些工具,如把fex转换成binbin转换成fex...

sunxi-boards里就是各家板子的fex文件


#cdsunxi-tools

#make

#./fex2bin../sunxi-boards/sys_config/a20/cubieboard2.fex ./script.bin


这里选的是a20/cubieboard2.fex


5.准备uEnv.txt

一般到这一步,应该是构建boot.cmd,然后在mkimageboot.cmd转换成boot.scr,网上的有很多介绍,但是Peter研究过之后说,现在都已经开始在玩uEnv了,所以就uEnv

参考前面的链接http://www.th7/system/lin/201403/50580.shtml

这篇文在boot.cmd输入的东西

setenvbootargs console=ttyS0,115200 root=/dev/mmcblk0p2 init=/sbin/initrootwait

panic=10${extra}

fatloadmmc 0 0x43000000 script.bin

fatloadmmc 0 0x48000000 uImage

bootm0x48000000


LinkuEnv.txt里的内容

bootargs=console=ttyS0,115200rootfstype=ext4 root=/dev/mmcblk0p2

aload_script=fatloadmmc 0 0x43000000 script.bin;

aload_kernle=fatloadmmc 0 0x48000000 uImage; bootm 0x43000000 - 0x48000000;

uenvcmd=setevnrun aload_script aload_kernle


大同小异吧

具体参数含义看上去挺复杂,其实也就不到5个参数,最多10

linux-sunxi社区U-boot说明http://linux-sunxi/U-boot有一些注解


uEnv.txt其实调用了一些uboot下的命令,看友们若前面在uboot下看过helpprintenv,就知道很多是对uboot环境变量的再次微调


这部分还要再研究一下


Anyway,我们现在有了uEnv.txt,有了script.bin,第一分区就差一样东西了,就是uImage,开始吧!



6.Linux内核 下载编译

gitclone git://github/cubieboard2/linux-sunxi


cdlinux-sunxi

makeARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- cubieboard2_defconfig

makeARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage modules

arch/arm/boot下生成一个uImage大小为4333kB


3条命令,第一条cd

第二条 告诉make调用cb2config

第三条 编译uImage

有些文章中 -j2INSTALL_MOD_PATH=outputmodules_installLink军有试过,结果失败,失败的过程很复杂,结果很简单:失败。

总之上面3条,可以看到uImage,期间没有menuconfig,最原汁原味的uImage


好了,第一分区的文件集齐了,开始cp吧,貌似如果是一步一步走下来,看友们若是完美主义,你的SD卡应该在cb2的卡槽里,重新插回ubuntu,因为前面分区的关系,这时应该有2个区,设/dev/sdc1,/dev/sdc2

/mntsudomkdir mnt1 mnt2


#sudomount /dev/sdb1 /mnt/mnt1

#sudocp {内核源码路径}/arch/arm/boot/uImage/mnt/mnt1

#sudocp {sunxi-tools路径}/script.bin/mnt/mnt1

#sudocp {uEnv路径}/uEnv.txt/mnt/mnt1

#sudoumount /mnt/mnt1


当然如果闲打命令烦,也可以直接把3个文件直接CtrlC – Ctrl V到第一分区去

第一分区的事情到此告一段落,接下来是第二分区,主要是放文件系统

目前只研究了最简单的文件系统BusyBox


7.构建busybox根文件系统


a.下载BusyBox及解压

wgethttp://busybox/downloads/busybox-1.21.1.tar.bz2

tar-jxvf busybox-1.21.1.tar.bz2

cdbusybox-1.21.1


b.配置BusyBox

make ARCH=arm menuconfig


设置内容如下:

i.ARM交叉编译器

busyboxsettings->build option->Cross Compiler prefix arm-linux-gnueabihf-

ii.静态编译库

busyboxsettings->build option->勾选BuildBusyBox as a static binary (no shared libs)

iii.build option ->Path to sysroot键入/,即选择安装根目录/


c.编译BusyBox

makeARCH=arm CROSS=arm-linux-gnueabihf-

makeinstall


d.复制粘帖到第二分区

#sudomount /dev/sdb2 /mnt/mnt2

#sudocp –Rv {busybox源码路径/_install/*}/mnt/mnt2

#sudocp –Rv {busybox源码路径/examples/bootfloppy/etc} /mnt/mnt2


拷贝交叉编译器的库到sdb2分区:

#sudocp –Rv /usr/arm-linux-gnueabihf/lib /mnt/mnt2


e.创建目录

#cd/mnt/mnt2

#sudomkdir dev proc sys var home tmp mnt run boot boot2 dev/pts


f.修改/mnt/mnt2/etc/fstab的内容为以下内容


proc/proc proc nosuid,noexec,nodev 0 0

sysfs/sys sysfs nosuid,noexec,nodev 0 0

devpts/dev/pts devpts gid=4,mode=620 0 0

tmpfs/tmp tmpfs defaults 0 0

devtmpfs/dev devtmpfs mode=0755,nosuid 0 0

/dev/mmcblk0p1/boot2 vfat defaults 0 2

/dev/mmcblk0p2/ ext4 defaults,noatime 0 1


g.卸载sdb2分区:


#sudoumount /mnt/mnt2


好了,拔出SD卡,插入cb2,上电启动,通过putty就可以看到最简单的linux文件系统启动出来了






本文标签: 自己的 系统 Linux