Pcduino下linux的Uboot Kernel Roofs制作烧写
来源:互联网 发布:中科vipexam数据库 编辑:程序博客网 时间:2024/05/21 21:48
http://blog.csdn.net/msq19895070/article/details/17437619
http://my.oschina.net/pcduino/blog/141917
http://blog.csdn.net/morningtzh/article/details/24845667
http://blog.csdn.net/xdw1985829/article/details/39077611
http://blog.csdn.net/akunainiannian/article/details/22975279
最近买了一个pcduino,看起来硬件配置不错,有1G的主频。官方发布了他们做的系统,用起来像个电脑,体验一般但是用来开发和实现创意想法,还是很不错的。图形化界面,里面还是装了很多驱动和应用,速度上有些慢。我打算将来移植QT和Opencv,运行图像处理算法和这方面的验证性试验,这个做好的系统显得太冗余,我想做个最小的系统,以后需要什么驱动在往里面添加。顺便学学整个系统的构架,搞懂了发布最后的镜像文件。二来我觉得这样最精简的系统,跑图像处理算法会更快些。
网上也已经有网友发布了一系列文章,来讲解pcduino的移植,我也是更具这位网友的文章移植内核的,使用起来基本没有什么问题,但是有些细节我也不太明白。这文章就是解释这些细节,以及我遇到的一些问题。下面是这个网友的网站地址:
http://blog.csdn.net/u010216127/article/category/1387771
第一阶段编译UBOOT,Kernel,Rootfs
开发环境:ubuntu12.04
硬件:PCduino,Cortex_A8,主频1G
编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
UBOOT源码地址https://github.com/pcduino/kernel
交叉编译器地址http://code.google.com/p/smp-on-qemu/downloads/list
我用的各个源码都是pcduino光盘里面自带的,网上也有,可能版本或有不同,请结合其他文章参考。
1.1.1开发环境搭建
解压交叉编译器
Sudo bunzip2 arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
Sudo tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
添加编译器路径的环境变量
Sudo vim /etc/environment
在PAHT里面添加“;/…./arm-2009q3/bin”我在这里写的是省略号,请根据自己的解压路径填写完整。
如果解压和环境变量填写完整使用如下命令可以验证
Sudo arm-none-linux-gnueabi-gcc –v
这个命令是显示gcc编译器的版本信息的,我的打印信息如下
gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
如果没有显示请sudo source /etc/environment 确保环境变量被更新。至于64位系统还要安装一个库文件请参考网友的文章。
1.1.2编译UBOOT
解压UBOOT
Sudo unzip u-boot-sunxi-sunxi.zip
Sudo cd u-boot-sunxi-sunxi
Sudo make pcduino CROSS_COMPILE=arm-none-linux-gnueabi-
需要编译一段时间,编译顺利结束的话,会生成第一阶段/spl/sunxi-spl.bin 、第二阶段 /u-boot.bin
1.1.3编译内核源码
解压内核源码,网上同样有,我用的内核源码是pcduino是光盘自带的,解压到自己定义的目录,并打开进入源码目录
Sudo cd /pcduino_file/kernel/kernel/linux-sunxi/linux-sunxi-sunxi-3.0
Sudo ls
Android.mk CREDITS fs Kconfig mm REPORTING-BUGS sound vmlinux arch crypto include kernel modules rootfs System.map vmlinux.o block Documentation init lib Module.symvers samples tools build.sh drivers ipc MAINTAINERS net scripts usr COPYING firmware Kbuild Makefile README security virt
设置配置文件
Sudo make ARCH=arm sun4i_defconfig
#
# configuration written to .config
#
进入图形化配置界面,注意终端界面尺寸要够大,否则进入不了配置界面。
Sudo make ARCH=arm menuconfig
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
保存退出即可,若执行make menuconfig报错,需要安装屏幕绘制动态库,安装过程
Sudo apt-get install libncurses5
这里是调整一些内核配置,根据自己的要求修改。
编译内核源码
Sudo make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
打印文字如下说明编译成功
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.0.62
Created: Sat Apr 20 18:33:26 2013
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4693068 Bytes = 4583.07 kB = 4.48 MB
Load Address: 40008000
Entry Point: 40008000
Image arch/arm/boot/uImage is ready
在arch/arm/boot/文件夹下生成内核文件,因为我没有添加其他驱动所以编译得到的内核很小才4.5MB左右,由此看来linux系统很是短小精干哪。这里我只是先把最小的系统搭起来,驱动的添加以后肯定还要修改。
1.1.4制作根文件系统
移植根文件系统首先需要安装busybox
获取源码在:http://www.busybox.net/ 点击BusyBox 1.21.0下载源码,解压到工作目录并进入该目录
Sudo make menuconfig
先采取默认配置,不行在改回来在配置界面里面把builid option 把 Build BusyBox as astatic binary (no shared libs) 把这个选上
修改Makefile文件里面的编译器名字和平台名字
Sudo vim Makefile
修改:
164:CROSS_COMPILE ?= arm-none-linux-gnueabi-
190:ARCH ?= arm
保存退出开始编译
Sudo make
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
编译结束安装到指定位置
Sudo make CONFIG_PREFIX=../rootfs install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
安装过程完成,安装在上面新建的rootfs目录
打开安装好的rootfs目录
Sudo cd ../rootfs
创建设备文件
Sudo mkdir dev
Sudo cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
构建配置文件inittab,inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。系统的第一个进程init会读取这个配置文件
这里是直接拷贝busybox的
Sudo cp busybox-1.21.0/examples/bootfloppy/etc/ rootfs/ -r
Sudo vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:~/bin/sh
保存退出
::sysinit:/etc/init.d/rcS 告诉程序运行/etc/init.d/rcS脚本来初始化系统
配置fstab文件,这个文件是配置了系统在启动时挂载文件系统和存储设备它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。
Sudo vim 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 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
保存退出
安装glibc库,在rootfs目录下,可以看到制作的几个根目录文件 sudo ls
bin dev etc inittab inuxrc sbin usr
sudo mkdir –p lib
打开交叉编译器的解压文件,拷贝系统运行所需要的库文件到自己制作的根文件系统里
Sudo cd /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib
Sudo cp *.so* /pcduino_file/rootfs/rootfs/lib –d
Sudo /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* /pcduino_file/rootfs/rootfs/lib –d
这时候UBOOT, uImage, rootfs都已经制作好了,pcduino支持tf卡启动系统,下面要完成的工作就是把这些编译好的UBOOT二进制文件,uImage,rootfs 部署到tf卡中,这样板卡在启动的时候,就可以按照约定读取UBOOT,启动内核,挂载文件系统了。
最近买了一个pcduino,看起来硬件配置不错,有1G的主频。官方发布了他们做的系统,用起来像个电脑,体验一般但是用来开发和实现创意想法,还是很不错的。图形化界面,里面还是装了很多驱动和应用,速度上有些慢。我打算将来移植QT和Opencv,运行图像处理算法和这方面的验证性试验,这个做好的系统显得太冗余,我想做个最小的系统,以后需要什么驱动在往里面添加。顺便学学整个系统的构架,搞懂了发布最后的镜像文件。二来我觉得这样最精简的系统,跑图像处理算法会更快些。
网上也已经有网友发布了一系列文章,来讲解pcduino的移植,我也是更具这位网友的文章移植内核的,使用起来基本没有什么问题,但是有些细节我也不太明白。这文章就是解释这些细节,以及我遇到的一些问题。下面是这个网友的网站地址:
http://blog.csdn.net/u010216127/article/category/1387771
第一阶段编译UBOOT,Kernel,Rootfs
开发环境:ubuntu12.04
硬件:PCduino,Cortex_A8,主频1G
编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
UBOOT源码地址https://github.com/pcduino/kernel
交叉编译器地址http://code.google.com/p/smp-on-qemu/downloads/list
我用的各个源码都是pcduino光盘里面自带的,网上也有,可能版本或有不同,请结合其他文章参考。
1.1.1开发环境搭建
解压交叉编译器
Sudo bunzip2 arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
Sudo tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
添加编译器路径的环境变量
Sudo vim /etc/environment
在PAHT里面添加“;/…./arm-2009q3/bin”我在这里写的是省略号,请根据自己的解压路径填写完整。
如果解压和环境变量填写完整使用如下命令可以验证
Sudo arm-none-linux-gnueabi-gcc –v
这个命令是显示gcc编译器的版本信息的,我的打印信息如下
gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
如果没有显示请sudo source /etc/environment 确保环境变量被更新。至于64位系统还要安装一个库文件请参考网友的文章。
1.1.2编译UBOOT
解压UBOOT
Sudo unzip u-boot-sunxi-sunxi.zip
Sudo cd u-boot-sunxi-sunxi
Sudo make pcduino CROSS_COMPILE=arm-none-linux-gnueabi-
需要编译一段时间,编译顺利结束的话,会生成第一阶段/spl/sunxi-spl.bin 、第二阶段 /u-boot.bin
1.1.3编译内核源码
解压内核源码,网上同样有,我用的内核源码是pcduino是光盘自带的,解压到自己定义的目录,并打开进入源码目录
Sudo cd /pcduino_file/kernel/kernel/linux-sunxi/linux-sunxi-sunxi-3.0
Sudo ls
Android.mk CREDITS fs Kconfig mm REPORTING-BUGS sound vmlinux arch crypto include kernel modules rootfs System.map vmlinux.o block Documentation init lib Module.symvers samples tools build.sh drivers ipc MAINTAINERS net scripts usr COPYING firmware Kbuild Makefile README security virt
设置配置文件
Sudo make ARCH=arm sun4i_defconfig
#
# configuration written to .config
#
进入图形化配置界面,注意终端界面尺寸要够大,否则进入不了配置界面。
Sudo make ARCH=arm menuconfig
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
保存退出即可,若执行make menuconfig报错,需要安装屏幕绘制动态库,安装过程
Sudo apt-get install libncurses5
这里是调整一些内核配置,根据自己的要求修改。
编译内核源码
Sudo make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
打印文字如下说明编译成功
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.0.62
Created: Sat Apr 20 18:33:26 2013
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4693068 Bytes = 4583.07 kB = 4.48 MB
Load Address: 40008000
Entry Point: 40008000
Image arch/arm/boot/uImage is ready
在arch/arm/boot/文件夹下生成内核文件,因为我没有添加其他驱动所以编译得到的内核很小才4.5MB左右,由此看来linux系统很是短小精干哪。这里我只是先把最小的系统搭起来,驱动的添加以后肯定还要修改。
1.1.4制作根文件系统
移植根文件系统首先需要安装busybox
获取源码在:http://www.busybox.net/ 点击BusyBox 1.21.0下载源码,解压到工作目录并进入该目录
Sudo make menuconfig
先采取默认配置,不行在改回来在配置界面里面把builid option 把 Build BusyBox as astatic binary (no shared libs) 把这个选上
修改Makefile文件里面的编译器名字和平台名字
Sudo vim Makefile
修改:
164:CROSS_COMPILE ?= arm-none-linux-gnueabi-
190:ARCH ?= arm
保存退出开始编译
Sudo make
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
编译结束安装到指定位置
Sudo make CONFIG_PREFIX=../rootfs install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
安装过程完成,安装在上面新建的rootfs目录
打开安装好的rootfs目录
Sudo cd ../rootfs
创建设备文件
Sudo mkdir dev
Sudo cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
构建配置文件inittab,inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。系统的第一个进程init会读取这个配置文件
这里是直接拷贝busybox的
Sudo cp busybox-1.21.0/examples/bootfloppy/etc/ rootfs/ -r
Sudo vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:~/bin/sh
保存退出
::sysinit:/etc/init.d/rcS 告诉程序运行/etc/init.d/rcS脚本来初始化系统
配置fstab文件,这个文件是配置了系统在启动时挂载文件系统和存储设备它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。
Sudo vim 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 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
保存退出
安装glibc库,在rootfs目录下,可以看到制作的几个根目录文件 sudo ls
bin dev etc inittab inuxrc sbin usr
sudo mkdir –p lib
打开交叉编译器的解压文件,拷贝系统运行所需要的库文件到自己制作的根文件系统里
Sudo cd /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib
Sudo cp *.so* /pcduino_file/rootfs/rootfs/lib –d
Sudo /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* /pcduino_file/rootfs/rootfs/lib –d
这时候UBOOT, uImage, rootfs都已经制作好了,pcduino支持tf卡启动系统,下面要完成的工作就是把这些编译好的UBOOT二进制文件,uImage,rootfs 部署到tf卡中,这样板卡在启动的时候,就可以按照约定读取UBOOT,启动内核,挂载文件系统了。
最近买了一个pcduino,看起来硬件配置不错,有1G的主频。官方发布了他们做的系统,用起来像个电脑,体验一般但是用来开发和实现创意想法,还是很不错的。图形化界面,里面还是装了很多驱动和应用,速度上有些慢。我打算将来移植QT和Opencv,运行图像处理算法和这方面的验证性试验,这个做好的系统显得太冗余,我想做个最小的系统,以后需要什么驱动在往里面添加。顺便学学整个系统的构架,搞懂了发布最后的镜像文件。二来我觉得这样最精简的系统,跑图像处理算法会更快些。
网上也已经有网友发布了一系列文章,来讲解pcduino的移植,我也是更具这位网友的文章移植内核的,使用起来基本没有什么问题,但是有些细节我也不太明白。这文章就是解释这些细节,以及我遇到的一些问题。下面是这个网友的网站地址:
http://blog.csdn.net/u010216127/article/category/1387771
第一阶段编译UBOOT,Kernel,Rootfs
开发环境:ubuntu12.04
硬件:PCduino,Cortex_A8,主频1G
编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
UBOOT源码地址https://github.com/pcduino/kernel
交叉编译器地址http://code.google.com/p/smp-on-qemu/downloads/list
我用的各个源码都是pcduino光盘里面自带的,网上也有,可能版本或有不同,请结合其他文章参考。
1.1.1开发环境搭建
解压交叉编译器
Sudo bunzip2 arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
Sudo tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
添加编译器路径的环境变量
Sudo vim /etc/environment
在PAHT里面添加“;/…./arm-2009q3/bin”我在这里写的是省略号,请根据自己的解压路径填写完整。
如果解压和环境变量填写完整使用如下命令可以验证
Sudo arm-none-linux-gnueabi-gcc –v
这个命令是显示gcc编译器的版本信息的,我的打印信息如下
gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
如果没有显示请sudo source /etc/environment 确保环境变量被更新。至于64位系统还要安装一个库文件请参考网友的文章。
1.1.2编译UBOOT
解压UBOOT
Sudo unzip u-boot-sunxi-sunxi.zip
Sudo cd u-boot-sunxi-sunxi
Sudo make pcduino CROSS_COMPILE=arm-none-linux-gnueabi-
需要编译一段时间,编译顺利结束的话,会生成第一阶段/spl/sunxi-spl.bin 、第二阶段 /u-boot.bin
1.1.3编译内核源码
解压内核源码,网上同样有,我用的内核源码是pcduino是光盘自带的,解压到自己定义的目录,并打开进入源码目录
Sudo cd /pcduino_file/kernel/kernel/linux-sunxi/linux-sunxi-sunxi-3.0
Sudo ls
Android.mk CREDITS fs Kconfig mm REPORTING-BUGS sound vmlinux arch crypto include kernel modules rootfs System.map vmlinux.o block Documentation init lib Module.symvers samples tools build.sh drivers ipc MAINTAINERS net scripts usr COPYING firmware Kbuild Makefile README security virt
设置配置文件
Sudo make ARCH=arm sun4i_defconfig
#
# configuration written to .config
#
进入图形化配置界面,注意终端界面尺寸要够大,否则进入不了配置界面。
Sudo make ARCH=arm menuconfig
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
保存退出即可,若执行make menuconfig报错,需要安装屏幕绘制动态库,安装过程
Sudo apt-get install libncurses5
这里是调整一些内核配置,根据自己的要求修改。
编译内核源码
Sudo make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
打印文字如下说明编译成功
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.0.62
Created: Sat Apr 20 18:33:26 2013
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4693068 Bytes = 4583.07 kB = 4.48 MB
Load Address: 40008000
Entry Point: 40008000
Image arch/arm/boot/uImage is ready
在arch/arm/boot/文件夹下生成内核文件,因为我没有添加其他驱动所以编译得到的内核很小才4.5MB左右,由此看来linux系统很是短小精干哪。这里我只是先把最小的系统搭起来,驱动的添加以后肯定还要修改。
1.1.4制作根文件系统
移植根文件系统首先需要安装busybox
获取源码在:http://www.busybox.net/ 点击BusyBox 1.21.0下载源码,解压到工作目录并进入该目录
Sudo make menuconfig
先采取默认配置,不行在改回来在配置界面里面把builid option 把 Build BusyBox as astatic binary (no shared libs) 把这个选上
修改Makefile文件里面的编译器名字和平台名字
Sudo vim Makefile
修改:
164:CROSS_COMPILE ?= arm-none-linux-gnueabi-
190:ARCH ?= arm
保存退出开始编译
Sudo make
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
编译结束安装到指定位置
Sudo make CONFIG_PREFIX=../rootfs install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
安装过程完成,安装在上面新建的rootfs目录
打开安装好的rootfs目录
Sudo cd ../rootfs
创建设备文件
Sudo mkdir dev
Sudo cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
构建配置文件inittab,inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。系统的第一个进程init会读取这个配置文件
这里是直接拷贝busybox的
Sudo cp busybox-1.21.0/examples/bootfloppy/etc/ rootfs/ -r
Sudo vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:~/bin/sh
保存退出
::sysinit:/etc/init.d/rcS 告诉程序运行/etc/init.d/rcS脚本来初始化系统
配置fstab文件,这个文件是配置了系统在启动时挂载文件系统和存储设备它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。
Sudo vim 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 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
保存退出
安装glibc库,在rootfs目录下,可以看到制作的几个根目录文件 sudo ls
bin dev etc inittab inuxrc sbin usr
sudo mkdir –p lib
打开交叉编译器的解压文件,拷贝系统运行所需要的库文件到自己制作的根文件系统里
Sudo cd /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib
Sudo cp *.so* /pcduino_file/rootfs/rootfs/lib –d
Sudo /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* /pcduino_file/rootfs/rootfs/lib –d
这时候UBOOT, uImage, rootfs都已经制作好了,pcduino支持tf卡启动系统,下面要完成的工作就是把这些编译好的UBOOT二进制文件,uImage,rootfs 部署到tf卡中,这样板卡在启动的时候,就可以按照约定读取UBOOT,启动内核,挂载文件系统了。最近买了一个pcduino,看起来硬件配置不错,有1G的主频。官方发布了他们做的系统,用起来像个电脑,体验一般但是用来开发和实现创意想法,还是很不错的。图形化界面,里面还是装了很多驱动和应用,速度上有些慢。我打算将来移植QT和Opencv,运行图像处理算法和这方面的验证性试验,这个做好的系统显得太冗余,我想做个最小的系统,以后需要什么驱动在往里面添加。顺便学学整个系统的构架,搞懂了发布最后的镜像文件。二来我觉得这样最精简的系统,跑图像处理算法会更快些。
网上也已经有网友发布了一系列文章,来讲解pcduino的移植,我也是更具这位网友的文章移植内核的,使用起来基本没有什么问题,但是有些细节我也不太明白。这文章就是解释这些细节,以及我遇到的一些问题。下面是这个网友的网站地址:
http://blog.csdn.net/u010216127/article/category/1387771
第一阶段编译UBOOT,Kernel,Rootfs
开发环境:ubuntu12.04
硬件:PCduino,Cortex_A8,主频1G
编译器:arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
UBOOT源码地址https://github.com/pcduino/kernel
交叉编译器地址http://code.google.com/p/smp-on-qemu/downloads/list
我用的各个源码都是pcduino光盘里面自带的,网上也有,可能版本或有不同,请结合其他文章参考。
1.1.1开发环境搭建
解压交叉编译器
Sudo bunzip2 arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
Sudo tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
添加编译器路径的环境变量
Sudo vim /etc/environment
在PAHT里面添加“;/…./arm-2009q3/bin”我在这里写的是省略号,请根据自己的解压路径填写完整。
如果解压和环境变量填写完整使用如下命令可以验证
Sudo arm-none-linux-gnueabi-gcc –v
这个命令是显示gcc编译器的版本信息的,我的打印信息如下
gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
如果没有显示请sudo source /etc/environment 确保环境变量被更新。至于64位系统还要安装一个库文件请参考网友的文章。
1.1.2编译UBOOT
解压UBOOT
Sudo unzip u-boot-sunxi-sunxi.zip
Sudo cd u-boot-sunxi-sunxi
Sudo make pcduino CROSS_COMPILE=arm-none-linux-gnueabi-
需要编译一段时间,编译顺利结束的话,会生成第一阶段/spl/sunxi-spl.bin 、第二阶段 /u-boot.bin
1.1.3编译内核源码
解压内核源码,网上同样有,我用的内核源码是pcduino是光盘自带的,解压到自己定义的目录,并打开进入源码目录
Sudo cd /pcduino_file/kernel/kernel/linux-sunxi/linux-sunxi-sunxi-3.0
Sudo ls
Android.mk CREDITS fs Kconfig mm REPORTING-BUGS sound vmlinux arch crypto include kernel modules rootfs System.map vmlinux.o block Documentation init lib Module.symvers samples tools build.sh drivers ipc MAINTAINERS net scripts usr COPYING firmware Kbuild Makefile README security virt
设置配置文件
Sudo make ARCH=arm sun4i_defconfig
#
# configuration written to .config
#
进入图形化配置界面,注意终端界面尺寸要够大,否则进入不了配置界面。
Sudo make ARCH=arm menuconfig
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
保存退出即可,若执行make menuconfig报错,需要安装屏幕绘制动态库,安装过程
Sudo apt-get install libncurses5
这里是调整一些内核配置,根据自己的要求修改。
编译内核源码
Sudo make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
打印文字如下说明编译成功
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.0.62
Created: Sat Apr 20 18:33:26 2013
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4693068 Bytes = 4583.07 kB = 4.48 MB
Load Address: 40008000
Entry Point: 40008000
Image arch/arm/boot/uImage is ready
在arch/arm/boot/文件夹下生成内核文件,因为我没有添加其他驱动所以编译得到的内核很小才4.5MB左右,由此看来linux系统很是短小精干哪。这里我只是先把最小的系统搭起来,驱动的添加以后肯定还要修改。
1.1.4制作根文件系统
移植根文件系统首先需要安装busybox
获取源码在:http://www.busybox.net/ 点击BusyBox 1.21.0下载源码,解压到工作目录并进入该目录
Sudo make menuconfig
先采取默认配置,不行在改回来在配置界面里面把builid option 把 Build BusyBox as astatic binary (no shared libs) 把这个选上
修改Makefile文件里面的编译器名字和平台名字
Sudo vim Makefile
修改:
164:CROSS_COMPILE ?= arm-none-linux-gnueabi-
190:ARCH ?= arm
保存退出开始编译
Sudo make
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
编译结束安装到指定位置
Sudo make CONFIG_PREFIX=../rootfs install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
安装过程完成,安装在上面新建的rootfs目录
打开安装好的rootfs目录
Sudo cd ../rootfs
创建设备文件
Sudo mkdir dev
Sudo cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
构建配置文件inittab,inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。系统的第一个进程init会读取这个配置文件
这里是直接拷贝busybox的
Sudo cp busybox-1.21.0/examples/bootfloppy/etc/ rootfs/ -r
Sudo vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:~/bin/sh
保存退出
::sysinit:/etc/init.d/rcS 告诉程序运行/etc/init.d/rcS脚本来初始化系统
配置fstab文件,这个文件是配置了系统在启动时挂载文件系统和存储设备它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件。
Sudo vim 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 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
保存退出
安装glibc库,在rootfs目录下,可以看到制作的几个根目录文件 sudo ls
bin dev etc inittab inuxrc sbin usr
sudo mkdir –p lib
打开交叉编译器的解压文件,拷贝系统运行所需要的库文件到自己制作的根文件系统里
Sudo cd /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib
Sudo cp *.so* /pcduino_file/rootfs/rootfs/lib –d
Sudo /pcduino_file/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* /pcduino_file/rootfs/rootfs/lib –d
这时候UBOOT, uImage, rootfs都已经制作好了,pcduino支持tf卡启动系统,下面要完成的工作就是把这些编译好的UBOOT二进制文件,uImage,rootfs 部署到tf卡中,这样板卡在启动的时候,就可以按照约定读取UBOOT,启动内核,挂载文件系统了。
第二阶段部署UBOOT,uImage,rootfs到TF卡中
准备一张TF卡,最好是金士顿的TF卡,我一开始用的不是金士顿的卡,总是部署失败,后来我换了一张32G的金士顿TF卡,成功部署!像一般的金士顿1G,2G卡也没应该有问题。
1.2.1烧写UBOOT到TF卡
插入TF卡,ubuntu12.04会识别。在驱动文件下可以看到/dev/sdc,文件。有些会识别成/dev/sdb,根据自己的系统把TF卡识别成说明文件名而定。我的是识别成/dev/sdc文件。在部署之前最好把TF卡格式化了,确保里面没有其他数据。
清空TF卡,包括分区表
Sudo dd if=/dev/zero of=/dev/sdc bs=1M count=1 //意思是用0填充sdc的前1M的空间,注意这个命令也可以用来测试磁盘的读写速度。
查看TF卡是否忙碌sudo sfdisk -R /dev/sdc
BLKRRPART: Device or resource busy
This disk is currently in use.
如果出现这个打印语句说明TF已经被挂载,重新插拔一次即可。
磁盘分区:
sudo cat <<EOT | sudo sfdisk --in-order -uM /dev/sdc
回车输入
> 1,16,c
> ,,L
> EOT
这里的1,16,c表示的是从这第一个主分区(sdc)的第1-16M之间的文件系统类型为FAT32,这个c是FAT32的类型代码。而下面一行的就表示默认了两个值的大小和这么大(这个主分区1-16M后面的空间)的剩余空间的文件系统类型为LINUX.
root@ubuntu:/# sfdisk -l /dev/sdc //查看一下分区是否成功
Disk /dev/sdc: 30436 cylinders, 64 heads, 32 sectors/track
Units = cylinders of 1048576 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sdc1 1 16 16 16384 c W95 FAT32 (LBA)
/dev/sdc2 17 30435 30419 31149056 83 Linux
/dev/sdc3 0 - 0 0 0 Empty
/dev/sdc4 0 - 0 0 0 Empty
这是我为TF卡分好的区可以清楚的看到1-16M的空间文件系统类型为FAT32,其余的空间文件系统类型为linux
磁盘格式化:
sudo sfdisk -l /dev/sdc //先看看分好不同区磁盘的名字,我的分别是sdc1,sdc2
重新分好区之后为了使dev设备文件可以识别,最好重新插拔TF卡,在dev下可以看到sdc1,sdc2这两个问件,否则在磁盘格式化的时候会提示找不到磁盘。
sudo mkfs.vfat /dev/sdc1 //把16M的sdc1磁盘格式化为vfat格式,也就是我们经常看见的FAT32格式。
sudo mkfs.ext4 /dev/sdc2 //16M以后的空间格式化为ext4格式
向TF卡烧写UBOOT.bin文件
先打开uboot文件夹
sudo dd if=spl/sunxi-spl.bin of=/dev/sdc bs=1024 seek=8
sudo dd if=u-boot.bin of=/dev/sdc bs=1024 seek=32
通过A10相关资料,通过以上2条命令烧写spl和uboot到指定位置,暂时不清楚如何确定这2个读取位置.
1.2.2烧写linux内核
制作对对A10芯片进行配置的二进制文件script.bin
打开内核源码的文件夹,然后打开源码够工具文件夹
Sudo cd ../linux-sunxi-sunxi-3.0
Sudo cd ../sunxi-tools-master/ //这个文件夹就在内核源码里面单词里面有tools
Sudo make
make出现如下错误:
Package libusb-1.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libusb-1.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libusb-1.0' found
Package libusb-1.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libusb-1.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libusb-1.0' found
但还是在sunxi-tools-master目录下生成了fex2bin。这个错误还没解决,打算先用生成的fex2bin试试(fex2bin文件,能把 *.fex文件生成 *.bin文件
解决方法:
pkg-config 是一个提供从源代码中编译软件时查询已安装的库时使用的统一接口的计算机软件。可以解决明明在自己机器上编译好好的,在别人电脑上编译就不行问题。当安装一个库时(从RPM,deb或其他二进制包管理系统),会包括一个后缀名为pc的文件,它会同其他.pc文件一起放入一个文件夹(依赖与你的系统设置)。在这个文件里包含有数个条目。这些条目通常包含用于其他使用这个库的程序编译时需要的库设置,以及头文件的位置,版本信息和一个简介。
sudo apt-get install libusb-1.0-0-dev //安装这个软件
sudo find -name "libusb-1.0.pc" //查找这个软件的安装位置
./usr/lib/i386-linux-gnu/pkgconfig/libusb-1.0.pc //这是我的机器的位置
Sudo export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu /pkgconfig:$PKG_CONFIG_PATH
Sudo set | grep PKG_CONFIG //显示本地的环境变量
PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig //环境变量设置成功
Sudo pkg-config libusb-1.0 --cflags –libs
Sudo make
利用上面生成的工具fex2bin,将sunxi-boards/sys_config/a10/pcduino.fex文件生成对A10芯片进行配置的二进制文件script.bin
在sunxi-tools文件夹下找到fex2bin可执行文件
Sudo ./fex2bin ../sunxi-boards/sys_config/a10/pcduino.fex script.bin //其根据自己的目录找对应的文件
sudo mount /dev/sdc1 /mnt
Sudo cd /mnt
Sudo mkdir root //在mnt目录下创建root目录
打开内核源码目录
Sudo cp arch/arm/boot/uImage /mnt/root/ //烧写内核到sdc1
打开sunxi-tools文件夹
Sudo cp script.bin /mnt/boot //找到脚本文件写入dsc1分区
配置启动参数文件
A10的UBOOT读取启动参数流程如下生成过程boot.cmd——>boot.src——>uEnv.txt
制作boot.cmd
Sudo vim boot.cmd
setenv bootargs console=ttyS0,115200 noinitrd root=/dev/mmcblk0p2 init=/sbin/init rootwait
panic=10 ${extra}
fatload mmc 0 0x43000000 boot/script.bin
fatload mmc 0 0x48000000 boot/uImage
bootm 0x48000000
制作boot.scr
Sudo mkimage -C none -A arm -T script -d boot.cmd boot.scr
制作uEnv.txt
Sudo vim uEnv.txt
bootenv=boot.scr
loaduimage=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
mmcboot=echo Running boot.scr script from mmc ...; source ${loadaddr}
配置文件写入sdc1分区
Sudo cp boot.scr /mnt/
Sudo cp uEnv.txt /mnt/
卸载sdc1分区至此uboot和uimage,启动文件烧写完毕,后面是根文件系统的烧写
Sudo umount /mnt
1.2.3向TF卡烧写根文件系统
sudo mount /dev/sdc2 /mnt/ //挂载TF卡的sdc2分区到/mnt
打开制作好的rootfs目录
sudo cp -pR rootfs/* /mnt/ //把整个目录拷贝到sdc2分区
sudo umount /dev/sdc2 //卸载分区
在全部烧写完成之后,插入TF到ubuntu12.04可以识别为两个盘,一个盘里面是有boot文件夹和boot.scr文件,uEnv.txt文件。其中boot文件夹里面装着script.bin和uImage文件。另一个盘里面可以看到是文件系统的那些文件。至此系统部署成功了。
拔下TF卡,插入pcduino。至此UBOOT,启动配置文件,内核,文件系统都烧写完毕。系统上电,顺利的化,整个最小系统就启动配置成功了,可以进一步的驱动开发了。如果要修改UBOOT,内核,重新编译烧写就可以了。正常的化系统可以进入串口终端了。
/ # ls
bin home lost+found run tmp
dev lib mnt sbin usr
etc linuxrc proc sys var
/ #
- Pcduino下linux的Uboot Kernel Roofs制作烧写
- Pcduino下linux的Uboot Kernel Roofs制作烧写(一)
- Pcduino下linux 的Uboot Kenel Roofs 制作烧写(二)
- Linux Ubuntu环境下对SD卡分区(烧写uboot,kernel,及filesystem)
- 海思3518平台的uboot 和 kernel烧写
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
- 韦东山-烧写uboot、kernel、文件系统
- Uboot下的内核烧写
- 解析Linux 中的VFS文件系统机制-roofs的创建
- 嵌入式 uboot、fs、kernel制作和烧录简记-hi3518c
- 嵌入式 uboot、fs、kernel制作和烧录简记-hi3518c
- linux下编译和烧写bootloader/vivi以及kernel的操作步骤
- pcDuino的linux移植一
- pcDuino的linux移植二
- pcDuino的linux移植三
- pcDuino uboot 编译
- 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
- 嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结
- python学习笔记6--python模块
- STL源码剖析 - 第5章 关联式容器 - set
- POJ 2186 Popular Cows (强连通分量)
- Python yield 使用浅析
- TableView分割线
- Pcduino下linux的Uboot Kernel Roofs制作烧写
- Oracle XE安装详解
- 线程池
- android 之 service
- G-sensor 架构分析
- mysql主从双机配置
- 项目开发-树形层级结构中的数量统计
- MFC调用VLC动态库中出现的错误
- hdu2842---Chinese Rings(矩阵)