手机版
您的当前位置: 高得文章网-分享知识 > 经典语录 > ubuntu卡在安装界面_安装ubuntu卡initramfs

ubuntu卡在安装界面_安装ubuntu卡initramfs

来源:经典语录 时间:2018-12-19 点击:
安装ubuntu卡initramfs

yabo88亚博体育app下载地址:安装ubuntu卡initramfs,记录1,安装yocto,编译kernel等 $ sudo apt-get update$ sudo apt-... file to adjust varioussettings, such as building with an initramfs.Not ...

安装ubuntu卡initramfs

安装ubuntu卡initramfs2

记录1,安装yocto,编译kernel等

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install sed wget cvssubversion git-core coreutils unzip texi2html texinfo libsdl1.2-devdocbook-utils gawk python-pysqlite2 diffstat help2man make gcc build-essentialg++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev mercurialautoconf automake groff libtool xterm

$ sudo apt-get install uboot-mkimage

// Within directory where linux-socfpga-13.02-RC10-src.bsxresides, run the following command to install the package to /opt/altera-linux directory.

$ sudo ./linux-socfpga-13.02-RC10-src.bsx

//Now run this command (NOT as root) to install Yocto. Yocto will be installeda user’s root directory. For instance, in /home/harvey.

$/opt/altera-linux/bin/install_altera_socfpga_src.sh ~/yocto

// A new build directory has been createdwith a conf subdirectory. This contains the default configuration for buildingfor altera hardware. You can modify the conf/local.conf file to adjust varioussettings, such as building with an initramfs.Not as root

注意,需要在/home/harvey/yocto/目录下运行下面的命令,每次重启linux后都需要运行一次下面的命令****************

$ source /home/harvey/yocto/altera-init /home/harvey/yocto/build

运行上面的命令后,linux 相关代码尚未有展开到build的子目录中



// we could use the following command tobuild kernel, ramdisk, and so on.

bitbakevirtual/kernel //In order to build linux

bitbakevirtual/bootloader //In order to build u-boot

bitbakealtera-image //In order to build the root filesystem

由于qspi容量不够,只能编译minimal的rootfs( In Yocto, use bitbake altera-image-minimal to generate a small rootfs)。

// To build Linux using Yocto, type thefollowing

// build all

$ bitbake virtual/kernel virtual/bootloaderaltera-image

记录:Harvey编译minimaljffs2 文件系统rootfs

在安装13.02和13.1 安装包后,需要运行命令bitbake altera-image-minimal 之后才会产生下面的目录~/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-minimal-1.0-r0/rootfs/

使用下面的命令编译出了minimal的文件系统,据说不包括ssh,即无法在ds5下同网络进行调试

cd~/yocto131/

sourcealtera-init build

bitbakealtera-image-minimal

注:使用bitbake altera-image 可以生成normal文件夹,使用bitbake altera-image-minimal可以生成minimal文件夹


*******************************************************************************

***因默认编译的minimal的jffs2 不支持ssh,导致无法使用ds5 调试linux 应用程序***

*******************************************************************************

记录:向jffs2 添加ssh ,可以比较minimal和normal的下面文件,并根据normal的文件修改minimal对应的文件,增加ssh的支持。

参考altera-image.bb修改下面的文档

./meta-altera/recipes-core/images/altera-image-minimal.bb

记录:linux中增加自动执行命令

执行/etc/init.d/rcS 文件

这是一个脚本文件,可以在里面添加想自动运行的命令。内容如下:

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

记录2,可以在yocto/build/tmp/deploy/images目录下直接执行下面的命令来生成烧写SD卡的镜像文件。**************************************************

$ cd ~/yocto/build/tmp/deploy/images

$ sudo/opt/altera-linux/bin/make_sdimage.sh -kuImage,socfpga_cyclone5.dtb -p u-boot-spl-socfpga_cyclone5.img -b u-boot-socfpga_cyclone5.img -r~/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs -o sd_image.bin

注意1,直接生成的sd卡镜像有问题,在把镜像烧写到sd卡后使用下面的命令将yocto/build/tmp/deploy/images 中的ext3 格式的rootfs 覆盖到sd卡中。

:dd if=altera-image-socfpga_cyclone5-20130806020207.rootfs.ext3of=/dev/sdb2

注意2,需要修改fat32 中的socfpga_cyclone5.dtb 为socfpga.dtb

注意3,如果sd卡启动后没有任何打印信息。请检查在生成sd卡镜像时,请检查preloader,即u-boot-spl*.*文件是否为bin文件,如果是,则需要使用mkpimage为该文件增加头信息。可以简单判断,增加了头的该文件为256KB或64KB。

记录3,重要记录,

在linux开发平台下,uboot代码路径

/home/harvey/yocto/build/tmp/work/armv7ahf-vfp-neon-poky-linux-gnueabi/u-boot-altera-2012.10-r0.0/u-boot-altera-2012.10

在window 平台下,对应的目录是

D:work_dirdemosSOCheliosoftwarespl_bspuboot-socfpga

文件系统路径

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs

linux内核代码的路径

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7

在linux将dts 编译为dtb文件,在在目录

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7中执行下面的命令可以将dts 编译为dtb。

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7/scripts/dtc/dtc-O dtb -o arch/arm/boot/socfpga_cyclone5.dtb -b 0 -d arch/arm/boot/.socfpga_cyclone5.dtb.darch/arm/boot/dts/socfpga_cyclone5.dts

重要记录4,给preloader加头。执行D:altera13.0sp1embedded中的脚本,如下操作。



注意,在15.0 下使用mkpimage时,需要增加参数-hv 0



重要记录5,烧写到sd卡的dtb文件的名字必须是socfpga.dtb。否则启动时找不到dtb文件。



在linux开发平台下,各种路径

uboot代码路径

/home/harvey/yocto/build/tmp/work/armv7ahf-vfp-neon-poky-linux-gnueabi/u-boot-altera-2012.10-r0.0/u-boot-altera-2012.10

在window 平台下,对应的目录是

D:work_dirdemosSOCheliosoftwarespl_bspuboot-socfpga

其中helio 是quartus 工程顶层目录

Linux下文件系统路径

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs

linux内核代码的路径

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7

Gnu工具链所在目录

/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/

记录6,编译出的所有文件都在目录/home/harvey/yocto/build/tmp/deploy/images下

altera-image-socfpga_cyclone5.cpio

altera-image-socfpga_cyclone5.ext3

altera-image-socfpga_cyclone5.jffs2

altera-image-socfpga_cyclone5.tar.gz

socfpga_cyclone5.dtb

socfpga_vt.dtb

u-boot-socfpga_cyclone5.bin

u-boot-spl-socfpga_cyclone5.bin

uImage

vmlinux

重要记录7:在yocto下编译.ko ,用于调试过程。************************

内核代码路径*************************************************

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7

uboot代码在yocto 目录下展开在下面的目录中,/home/harvey/yocto/build/tmp/work/armv7ahf-vfp-neon-poky-linux-gnueabi/u-boot-altera-2012.10-r0.0/u-boot-altera-2012.10#

*******************************************************************************

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

编译内核模块:

步骤1,设置yocto环境变量

source /home/harvey/yocto/altera-init /home/harvey/yocto/build

步骤2,设置PATH 变量,增加socfpga的工具链目录

export PATH=$PATH:/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin

步骤3,使用make编译模块

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

步骤4,加载和卸载模块

加载执行:insmod hello.ko

卸载命令:rmmod hello.ko

makefile文件内容如下

# Makefile 2.6

obj-m +=test_module.o

KDIR:=/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7

PWD=$(shell pwd)

all:

make -C $(KDIR) M=$(PWD) modules

clean:

make -C $(KDIR) M=$(PWD) clean

注意:上面的KDIR目录是内核代码根目录。尽管module.h是在linux-altera-3.7-r1/linux-altera-3.7/include/linux/下。

注意:如果在编译kernel 模块是遇到下面的错误,请检查makefile 中make -C $(KDIR) M=$(PWD) modules 前面的tab 键是否被多个空格代替了。

harveyubuntu:~/workplace/kernel_module$make all

make: Nothing to be done for `all'.

代码文件harveyubuntu:~/yocto/build/tmp/test_dir$ cat test_module.c

#include

#include

#include

MODULE_LICENSE("DualBSD/GPL");

static int hello_init(void)

{

printk("Hello moduleinit.n");

return 0;

}

static void hello_exit(void)

{

printk("Goodbye moduleexit.n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_AUTHOR("harvey");

MODULE_DESCRIPTION("a simplemodule");

MODULE_ALIAS("test_module");

遇到的错误记录

错误1,编译模块是遇到error: void value not ignored as it ought tobe

linux/fs.h头文件,里面定义了unregister_chrdev()函数为void 类型,删除下面语句中的“ret =”。 ret = unregister_chrdev ( Major, DEVICE_NAME );

错误2,加载模块是出现下面的提示,是主设备号冲突,使用命令cat /proc/devices 查看已分配的设备号。

# insmodchar_dev_harvey.ko

globalvar registerfailureError: could not insert module char_dev_harvey.ko: Device or resourcebusy

可以用命令创建设备文件:
mknod /dev/设备文件名字符设备(c是字符设备,b是块设备) 主设备号次设备号
例如:mknod /dev/testChar c 100 0
删除设备入口:
rm /dev/testChar

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

*******************************************************************************

重要记录8,配置linux内核******************************************************

// configuratelinux kernel, after the following command there'll come up a configure window. Not as root

$bitbake -cmenuconfig linux-altera

记录9,将镜像烧写到sd卡

在linux下可以使用下面的命令经sd卡镜像烧写到卡中。

$ sudo ddif=linux-socfpga-12.12-sdimage of=/dev/sdx bs=512

$ sudo sync

注意,在linux下需要使用usb接口的sd卡读卡器。Linux不能直接识别出sd卡(将大的sd卡插入笔记本的sd卡槽中)。

在windows下使用Win32DiskImager 将sd卡image烧写到sd卡中

未完待续,敬请期待;


注:版权归“FPGA那点事儿”运营团队,转载请注明出处。

欢迎扫描以下二维码,关注“FPGA那点事儿”!

安装ubuntu卡initramfs3

记录1,安装yocto,编译kernel等

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install sed wget cvssubversion git-core coreutils unzip texi2html texinfo libsdl1.2-devdocbook-utils gawk python-pysqlite2 diffstat help2man make gcc build-essentialg++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev mercurialautoconf automake groff libtool xterm

$ sudo apt-get install uboot-mkimage

// Within directory where linux-socfpga-13.02-RC10-src.bsxresides, run the following command to install the package to /opt/altera-linux directory.

//如果执行下面的命令失败,请检查文件是否可执行,或直接使用$chmod 777 filename 修改文件属性

$ sudo ./linux-socfpga-13.02-RC10-src.bsx

//Now run this command (NOT as root) to install Yocto. Yocto will be installeda user’s root directory. For instance, in /home/harvey.

$/opt/altera-linux/bin/install_altera_socfpga_src.sh ~/yocto

// A new build directory has been createdwith a conf subdirectory. This contains the default configuration for buildingfor altera hardware. You can modify the conf/local.conf file to adjust varioussettings, such as building with an initramfs.Not as root

注意,需要在/home/harvey/yocto/目录下运行下面的命令,每次重启linux后都需要运行一次下面的命令************

$ source /home/harvey/yocto/altera-init /home/harvey/yocto/build

运行上面的命令后,linux 相关代码尚未有展开到build的子目录中



// we could use the following command tobuild kernel, ramdisk, and so on.

bitbakevirtual/kernel //In order to build linux

bitbakevirtual/bootloader //In order to build u-boot

bitbakealtera-image //In order to build the root filesystem

// 编译所有镜像的命令

$ bitbake virtual/kernel virtual/bootloaderaltera-image

记录2,可以在yocto/build/tmp/deploy/images目录下直接执行下面的命令来生成烧写SD卡的镜像文件。***************

Linux启动需要的文件包括preloader、uboot、根文件系统、linuxkernel和dtb文件。

$ cd ~/yocto/build/tmp/deploy/images

$ sudo/opt/altera-linux/bin/make_sdimage.sh -kuImage,socfpga_cyclone5.dtb -p u-boot-spl-socfpga_cyclone5.img -b u-boot-socfpga_cyclone5.img -r~/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs -o sd_image.bin

注意,直接生成的sd卡镜像有问题,在把镜像烧写到sd卡后使用下面的命令将yocto/build/tmp/deploy/images 中的ext3 格式的rootfs 覆盖到sd卡中。

:dd if=altera-image-socfpga_cyclone5-20130806020207.rootfs.ext3of=/dev/sdb2

注意2,需要修改fat32分区中的socfpga_cyclone5.dtb 为socfpga.dtb

注意3,如果sd卡启动后没有任何打印信息。请检查在生成sd卡镜像时,请检查preloader,即u-boot-spl*.*文件是否为bin文件,如果是,则需要使用mkpimage为该文件增加头信息。可以简单判断,增加了头的该文件为256KB或64KB。

记录3,编译preloader和uboot

可以在windows下,使用bsp-editor进行编译preloader和uboot。

其中software文件夹是quartus工程顶层目录下的文件夹,使用bsp-editor 编译配置和编译preloader过程中自动产生的文件夹。



记录4,编译设备树dtb文件

不推荐使用altera的工具软件生成dts,因为不同版本的linux内核对dts格式的要求不同。当然,版本差异小的话,可能会使用相同的dts文件。

linux内核源码目录中有dts文件。建议直接手动修改该dts文件,并使用下面的命令编译成dtb。

在linux将dts 编译为dtb文件,在在目录

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7中执行下面的命令可以将dts 编译为dtb。

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7/scripts/dtc/dtc-O dtb -o arch/arm/boot/socfpga_cyclone5.dtb -b 0 -d arch/arm/boot/.socfpga_cyclone5.dtb.darch/arm/boot/dts/socfpga_cyclone5.dts

注意:在linux代码document 中有各个设备dts数据结构的说明手册,如下图。


记录5:编译minimal jffs2 文件系统 rootfs

在安装13.02和13.1 安装包后,需要运行命令bitbake altera-image-minimal 之后才会产生下面的目录~/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-minimal-1.0-r0/rootfs/

使用下面的命令编译出了minimal的文件系统,不包括ssh,即无法在ds5下同网络进行调试

cd~/yocto131/

sourcealtera-init build

bitbake altera-image-minimal

注:使用bitbake altera-image 可以生成normal文件夹,使用bitbake altera-image-minimal可以生成minimal文件夹


*********************因默认编译的minimal的jffs2 不支持ssh,导致无法使用ds5 调试linux 应用程序*************************************

记录6:向jffs2 添加ssh ,可以比较minimal和normal的下面文件,并根据normal的文件修改minimal对应的文件,增加ssh的支持。

参考altera-image.bb修改下面的文档

./meta-altera/recipes-core/images/altera-image-minimal.bb

记录7, linux下的重要路径

在linux开发平台下,uboot代码路径

/home/harvey/yocto/build/tmp/work/armv7ahf-vfp-neon-poky-linux-gnueabi/u-boot-altera-2012.10-r0.0/u-boot-altera-2012.10

在window 平台下,对应的目录是

D:work_dirdemosSOCheliosoftwarespl_bspuboot-socfpga

文件系统路径

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs

linux内核代码的路径

/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7

Gnu工具链所在目录

/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/

编译出的所有文件都在目录/home/harvey/yocto/build/tmp/deploy/images下

altera-image-socfpga_cyclone5.cpio

altera-image-socfpga_cyclone5.ext3

altera-image-socfpga_cyclone5.jffs2

altera-image-socfpga_cyclone5.tar.gz

socfpga_cyclone5.dtb

socfpga_vt.dtb

u-boot-socfpga_cyclone5.bin

u-boot-spl-socfpga_cyclone5.bin

uImage

vmlinux

记录8:在yocto下编译.ko ************************

编译内核模块:

步骤1,设置yocto环境变量

source /home/harvey/yocto/altera-init /home/harvey/yocto/build

步骤2,设置PATH 变量,增加socfpga的工具链目录

export PATH=$PATH:/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin

步骤3,使用make编译模块

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

步骤4,加载和卸载模块

加载执行:insmod hello.ko

卸载命令:rmmod hello.ko

makefile文件内容如下

# Makefile 2.6

obj-m +=test_module.o

KDIR:=/home/harvey/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-3.7-r1/linux-altera-3.7

PWD=$(shell pwd)

all:

make -C $(KDIR) M=$(PWD) modules

clean:

make -C $(KDIR) M=$(PWD) clean

注意:上面的KDIR目录是内核代码根目录。尽管module.h是在linux-altera-3.7-r1/linux-altera-3.7/include/linux/下。

注意:如果在编译kernel 模块是遇到下面的错误,请检查makefile 中make -C $(KDIR) M=$(PWD) modules 前面的tab 键是否被多个空格代替了。

harveyubuntu:~/workplace/kernel_module$make all

make: Nothing to be done for `all'.

代码文件harveyubuntu:~/yocto/build/tmp/test_dir$ cat test_module.c

#include

#include

#include

MODULE_LICENSE("DualBSD/GPL");

static int hello_init(void)

{

printk("Hello moduleinit.n");

return 0;

}

static void hello_exit(void)

{

printk("Goodbye moduleexit.n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_AUTHOR("harvey");

MODULE_DESCRIPTION("a simplemodule");

MODULE_ALIAS("test_module");

遇到的错误记录

错误1,编译模块是遇到error: void value not ignored as it ought tobe

linux/fs.h头文件,里面定义了unregister_chrdev()函数为void 类型,删除下面语句中的“ret =”。 ret = unregister_chrdev ( Major, DEVICE_NAME );

错误2,加载模块是出现下面的提示,是主设备号冲突,使用命令cat /proc/devices 查看已分配的设备号。

# insmod char_dev_harvey.ko

globalvar registerfailureError: could not insert module char_dev_harvey.ko: Device or resourcebusy

可以用命令创建设备文件:
mknod /dev/设备文件名字符设备(c是字符设备,b是块设备) 主设备号次设备号
例如:mknod /dev/testChar c 100 0
删除设备入口:
rm /dev/testChar

记录9,配置linux内核************************

// configuratelinux kernel, after the following command there'll come up a configure window. Not as root

$bitbake -cmenuconfig linux-altera

记录10,将镜像烧写到sd卡

在linux下可以使用下面的命令经sd卡镜像烧写到卡中。

$ sudo dd if=linux-socfpga-12.12-sdimageof=/dev/sdx bs=512

$ sudo sync

注意,在linux下需要使用usb接口的sd卡读卡器。Linux不能直接识别出sd卡(将大的sd卡插入笔记本的sd卡槽中)。

在windows下使用Win32DiskImager 将sd卡image烧写到sd卡中

记录11,使用git工具软件下载linux内核代码

Linux4.x使用第二个链接,带github字样

https://github.com/altera-opensource/linux-socfpga/

https://github.com/altera-opensource/linux-socfpga/branches

git clonegit://git.rocketboards.org/linux-socfpga.git

git clonegit://git.rocketboards.org/linux-socfpga.git

git clone git://git.rocketboards.org/poky-socfpga.git

git clone git://git.rocketboards.org/u-boot-socfpga.git

git clone git://git.rocketboards.org/linux-refdesigns.git

cd u-boot-socfpga

查看本地分支:$ git branch

查看远程分支:$ git branch -r

git branch

git checkout -t -b socfpga-3.10 origin/socfpga-3.10

git checkout -t -b socfpga-3.10-ltsi origin/socfpga-3.10-ltsi

git checkout -t -b socfpga-3.11 origin/socfpga-3.11

git checkout -t -b socfpga-3.12 origin/socfpga-3.12

git checkout -t -b socfpga-3.9 origin/socfpga-3.9

切换本地分支

git checkout socfpga-3.10-ltsi

使用远端版本强制覆盖本地修改,即放弃本地修改。

git fetch --all

git reset --hardorigin/master

git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本

记录12:编译git下来的linux内核代码

需要先设置编译工具链路径:

exportPATH=$PATH:/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin

设置:make ARCH=armCROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 socfpga _defconfig

如需要配置linux内核:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 menuconfig

编译linux 内核:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 uImage

重要记录:Qspi flash 烧写

打开命令窗口:E:altera14.0embeddedEmbedded_Command_Shell,在本命令窗口中使用下面的命令烧写代码到指定的地址处。

quartus_hps -c 1-o PV -a 0x0000 preloader-mkpimage.bin

quartus_hps -c 1-o PV -a 0x60000 u-boot-img.bin

quartus_hps -c 1-o PV -a 0x50000 socfpga-dtb.bin

quartus_hps -c 1-o PV -a 0xa0000 zImage.bin

quartus_hps -c 1-o PV -a 0x800000 minimal-rootfs-jffs2.bin

dts文件中包括jffs2文件系统的位置,参考下图

/home/harvey/yocto131/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/linux-altera-dist-1.0-r1/linux-socfpga/arch/arm/boot/dts



注:版权归“FPGA那点事儿”运营团队,转载请注明出处。

欢迎扫描以下二维码,关注“FPGA那点事儿”!

安装ubuntu卡initramfs4

天融信安全云服务中心

安全漏洞与安全事件日报

(2016-11-18)

最新安全漏洞

漏洞标题:Google ?Android Skia内存破坏漏洞

提交时间:2016-11-17

披露/发现时间:

漏洞等级:高

CVE-ID:CVE-2016-6701

漏洞类别:内存破坏漏洞

CNVD-ID:CNVD-2016-11179

影响组件:Google Android 7.0

漏洞描述:Google Skia是美国谷歌(Google)公司的一个开源且基于C++的图形库,它可应用于Mozilla Firefox、Google Chrome等浏览器中,也可用在Android开放手机平台中。Android 7.0版本中的Skia存在内存破坏漏洞。攻击者可借助特制的文件利用该漏洞在Gallery进程上下文中执行任意代码,也可能造成拒绝服务(内存破坏)。

安全建议:目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接:http://source.android.com/security/bulletin/2016-11-01.html

?

漏洞标题:SAP Hybris ?E-commerce Suite SQL注入漏洞

提交时间:2016-11-17

披露/发现时间:

漏洞等级:高

CVE-ID:

漏洞类别:SQL注入漏洞

CNVD-ID:CNVD-2016-11184

影响组件:SAP Hybris E-commerce Suite

漏洞描述:SAP Hybris Management Console(HMC)是德国思爱普(SAP)公司的一套企业级多渠道电子商务和产品内容管理(PCM)软件。SAP Hybris E-commerce Suite 中存在注入漏洞,该漏洞源于程序未能充分过滤用户提交的输入。攻击者可利用该漏洞在受影响网站上下文中执行任意代码,窃取基于cookie的身份验证。

安全建议:目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:http://go.sap.com/index.html

?

漏洞标题:Google Android ?Framework APIs权限提升漏洞

提交时间:2016-11-17

披露/发现时间:

漏洞等级:高

CVE-ID:CVE-2016-6715

漏洞类别:权限提升漏洞

CNVD-ID:CNVD-2016-11193

影响组件:Google Android 4.4.4;Google Android 5.0.2;Google Android 5.1.1;Google ?Android 6.0.1;Google Android 7.0

漏洞描述:Android是美国谷歌(Google)公司和开放手持设备联盟(简称OHA)共同开发的一套以Linux为基础的开源操作系统。Framework APIs是其中的一个用于创建框架的API组件。Android中的Framework APIs存在权限提升漏洞。攻击者可借助恶意的应用程序利用该漏洞记录音频。

安全建议:目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接:http://source.android.com/security/bulletin/2016-11-01.html

?

漏洞标题:HP KeyView内存破坏漏洞

提交时间:2016-11-17

披露/发现时间:

漏洞等级:中

CVE-ID:CVE-2016-4403

漏洞类别:内存破坏漏洞

CNVD-ID:CNVD-2016-11187

影响组件:HP KeyView <=10.25

漏洞描述:HP KeyView是美国惠普(HP)公司的一套文件过滤和转换软件。该软件支持对多种平台上的文件提取内容、元数据和其他相关属性等。HP KeyView存在内存破坏漏洞,允许攻击者利用该漏洞在受影响的应用程序上下文中执行任意代码,失败尝试可能导致拒绝服务。

安全建议:目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接:https://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c05325836

?

漏洞标题:Artifex ?MuJS堆缓冲区溢出漏洞

提交时间:2016-11-17

披露/发现时间:

漏洞等级:中

CVE-ID:CVE-2016-9109

漏洞类别:缓冲区溢出漏洞

CNVD-ID:CNVD-2016-11181

影响组件:Artifex Software, Inc. MuJS 0

漏洞描述:Artifex Software MuJS是美国Artifex Software公司的一款轻量级的JavaScript解释器,它用于嵌入到其他的软件中提供脚本执行功能。Artifex MuJS堆缓冲区溢出漏洞。攻击者利用漏洞可在应用程序的上下文中执行任意代码,导致拒绝服务条件。

安全建议:厂商已提供漏洞修补方案,请关注厂商主页及时更新:http://mujs.com/

?

安全资讯

5美元的设备 30秒钟内攻破你的电脑

如今黑客实施网络攻击的成本正在变得越来越低廉。据美国科技新闻网站TheNextWeb报道,已经有安全业界人士推出了只需要5美元的设备,只需半分钟,它可以破解用户的各种密码。

这位业界人士名叫卡马尔(Samy Kamkar),其设备名为“PoisonTap”,硬件使用了市场售价只有五美元的廉价迷你电脑RaspberryPi Zero,实施攻击的软件则为免费软件。

如果把这个设备连接到电脑USB接口上,它就可以开始工作。在30秒钟之内,它可以绕过用户的屏幕锁屏,并且安装一个后门程序,在拔开设备后,后门程序依然可以运行。

如果你认为使用一个强度更高的密码可以躲开它的攻击,那就错了。PoisonTap进行攻击的方式和传统不同,它不会千方百计猜测你的密码,而是选择绕过密码。

在连接个人电脑之后,这个设备充当了临时互联网的角色。电脑会认为此时已经接入了局域网或者互联网,然后开始发送各种没有加密的网络信息。即使用户的无线网络已经进行加密,但是这起不到保护作用,电脑会优先选择这个“虚假网络连接”,并且遭到攻击。

这种设备的攻击方式被称为“中间人攻击”。它会窃取用户提交的网络信息中的各种验证身份的Cookie文件,以及许多网站服务器留在用户电脑一侧的Session(状态信息)数据。这种攻击方式也能够针对目前流行的两次认证模式。

卡马尔表示,消费者可以采取一些措施,避免上述的网络攻击,其中包括:

在不使用电脑时,让电脑进入休眠状态而不是睡眠状态,在休眠状态中,电脑中所有的进程都将停止工作,安全性更高。

每一次离开自己的电脑时,关闭网络浏览器。

经常清理浏览器的缓存数据。

对于数据存储介质采用全盘加密,另外如果它具备休眠模式,则应该启动。

暂停使用USB接口。

?

Linux曝新漏洞 按住Enter键70秒可触发

目前,Linux系统再次曝出新漏洞,漏洞代码CVE-2016-4484,攻击者只需长按Enter键70秒,便能获得initramfsshell的root权限,从而让攻击者拥有破解该Linux设备的可能。

据悉,由于Linux中的常用变量Linux统一密钥设置(Linux Unified Key Setup,LUKS)中存在一个漏洞,攻击者通过访问shell,就可以解密运行Linux的设备。同时,该攻击对于云端的虚拟Linux boxen套件同样有效。而且,Debian、Ubuntu、Fedora等操作系统也被确认会受该漏洞的影响。

当攻击者不断尝试暴力破解后,LUKS可能出于调试目的,提供shell的root权限。

该漏洞由苏格兰西部大学讲师Hector Marco和瓦伦西亚理工大学助理教授Ismael Ripoll共同发现。两人指出,由于这个漏洞不需要特定的系统配置即可触发,因此危害性较大。

此外,他们表示,利用该漏洞,攻击者可以复制、修改或销毁硬盘,甚至可以设置一个网络来泄漏数据。

据介绍,该漏洞对于银行(自动提款机)、机场、实验室、图书馆等环境里搭载上述相关操作系统的电子设备危害最大。所幸的是,研究者表示该漏洞能够通过补丁进行修复,并且已经为其开发了一个防止被黑的应急方案。

不过,由于该漏洞波及面较广,研究者表示在Linux等系统未全面更新前,该漏洞仍将存在被利用的可能。

?

(内容来源:CNVD? 补天? 天融信安全云服务中心? 阿尔法实验室等相关国内热门安全论坛)

安装ubuntu卡initramfs5

by Pingbo Wen of TinyLab.org2013/08/31


目录

    零、环境搭建

    一、配置kernel

    二、通过busybox制作initramfs镜像

    三、配置物理文件系统,切换根文件系统

    四、配置Uboot,加载kernel

    五、结语

    REFERENCE


    这篇文章,将介绍如何用qemu来搭建一个基于ARM的嵌入式linux系统。通过该文章,你可以学习到如何配置kernel,如何交叉编译kernel,如何配置busybox并编译,如何制作initramfs,如何制作根文件系统,如何定制自己的uboot,如何通过uboot向kernel传递参数等。开始干活!

    零、环境搭建

    在实现我们的目标之前,我们需要搭建自己的工作环境。在这里,假设你的主机上已经有gcc本地编译环境,并运行Ubuntu 12.10。但是这并不影响在其他的linux平台上进行,只要修改一下对应的命令就可以了。

    首先,我们需要下载一个ARM交叉工具链。你可以在网上下载源码自己编译,也可以下载已经编译好的工具链。在工具链中有基本的ARM编译工具,比如:gcc, gdb, addr2line, nm, objcopy, objdump等。可能你会问,这些工具本机不是已经有了么?如果不出意外,我想你的主机应该是x86架构的。不同的架构,有不同的指令集,你不能拿一个x86的执行文件放到一个ARM机器上执行。所以我们需要一个能够在x86架构上生成ARM可执行程序的GCC编译器。有很多预先编译好的ARM工具链,这里使用的是CodeSourcery[1]。更多关于toolchain的信息可以在elinux.org找到[2]。下载下来后,直接解压,放到某个目录,然后配置一下PATH环境变量,这里是这样配置的:

    1

    export PATH=~/arm-2013.05/bin:$PATH

    配置完ARM交叉工具链后,我们需要下载一些源码,并安装一些软件。命令如下:


    # install qemu

    sudo apt-get install qemu qemu-kvm qemu-kvm-extras qemu-user qemu-system

    # install mkimage tool

    sudo apt-get install uboot-mkimage

    # install git

    sudo apt-get install git

    # prepare related directory

    mkdir -pv ~/armsource/{kernel,uboot,ramfs,busybox}

    # download latest kernel stable code to kernel dir

    git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git ~/armsource/kernel

    # download latest u-boot code to uboot dir

    git clone git://git.denx.de/u-boot.git ~/armsource/uboot

    # download latest busybox code to busybox dir

    git clone git://busybox.net/busybox.git ~/armsource/busybox

    一、配置kernel

    环境搭建完后,我们就正式进入主题了。现在我们需要配置kernel源码,编译,并用qemu运行我们自己编译的kernel。这样我们就能够对我们的kernel进行测试,并做出对应的修改。

    进入kernel源码目录,我们需要找最新的kernel稳定版本。在写这篇文章的时候,最新的稳定版本是3.10.10。我们可以通过git切换到3.10.10。由于我们编译的内核需要运行在ARM上,所以我们应该到arch/arm/configs下找到对应我们设备的kernel配置文件。但是我们没有实际意义上的设备,而是用qemu模拟的设备,所以我们应该选择qemu能够模拟的设备的配置文件。这里我们选择常用的versatile_defconfig。对应的命令如下:

    1

    2

    3

    4

    5

    cd ~/armsource/kernel

    # checkout a tag and create a branch

    git checkout v3.10.10 -b linux-3.10.10

    # create .config file

    make versatile_defconfig ARCH=arm

    配置完了,我们就可以编译了。编译的时候,我们可以用多个线程来加速编译,具体用多少个就要看你主机的配置了。这里我们用12个线程编译,命令如下:

    1

    make -j12 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    注意,如果交叉编译环境没有配置好,这个地方会提示找不到对应的gcc编译器。这里-j12是指定编译线程为12个,ARCH是指定目标架构为arm,所用的交叉编译器arm-none-linux-gnueabi-。

    OK,kernel已经编译好了,那么我们需要用qemu把它跑起来。关于qemu的具体使用,请看qemu的官方文档[3],这里直接给出命令:

    1

    qemu-system-arm -M versatilepb -kernel arch/arm/boot/zImage -nographic

    这里-M是指定模拟的具体设备型号,versatile系列的pb版本,-kernel指定的是对应的内核,-nographic是把qemu输出直接导向到当前终端。

    好,命令成功执行了。但是,好像没有任何有效输出。我们通过C-a x来退出qemu。编译的kernel好像不怎么好使,配置文件肯定有问题。打开.config配置文件,发现传递给kernel的参数没有指定console,难怪没有输出。我们定位到CMDLINE,并加入console参数:

    1

    CONFIG_CMDLINE="console=ttyAMA0 root=/dev/ram0"

    保存.config,重新编译kernel,并用qemu加载。现在终于有输出了。如果不出意外,kernel应该会停在找不到根文件系统,并跳出一个panic。为什么会找不到根文件系统?因为我们压根就没有给它传递过,当然找不到。

    那现在是不是应该制作我们自己的根文件系统了。先别急,为了让后面的路好走一点,我们这里还需对内核进行一些配置。首先,我们需要用ARM EABI去编译kernel,这样我们才能让kernel运行我们交叉编译的用户态程序,因为我们所有的程序都是用gnueabi的编译器编译的。具体可以看wikipedia相关页面[4],你也可以简单的理解为嵌入式的ABI。其次,我们需要把对kernel module的支持去掉,这样可以把相关的驱动都编译到一个文件里,方便我们之后的加载。

    当然,你可以使能kernel的debug选项,这样就可以调试内核了,并打印很多调试信息。这里就不再说了,如果感兴趣,可以看我之前写的关于kernel调试的文章[5]。

    总结起来,这一次我们对.config做了如下修改:

    1

    2

    3

    4

    5

    6

    # CONFIG_MODULES is not set

    CONFIG_AEABI=y

    CONFIG_OABI_COMPAT=y

    CONFIG_PRINTK_TIME=y

    CONFIG_EARLY_PRINTK=y

    CONFIG_CMDLINE="earlyprintk console=ttyAMA0 root=/dev/ram0"

    二、通过busybox制作initramfs镜像

    如果你注意到了之前传递给kernel的参数,你会发现有一个root=/dev/ram0的参数。没错,这就是给kernel指定的根文件系统,kernel检查到这个参数的时候,会到指定的地方加载根文件系统,并执行其中的init程序。这样就不会出现刚才那种情况,找不到根文件系统了。

    我们的目标就是让kernel挂载我们的ramfs根文件系统,并且在执行init程序的时候,调用busybox中的一个shell,这样我们就有一个可用的shell来和系统进行交互了。

    整个ramfs中的核心就是一个busybox可执行文件。busybox就像是一把瑞士军刀,可以把很多linux下的命令(比如:cp, rm, whoami等)全部集成到一个可执行文件[6]。这为制作嵌入式根文件系统提供了很大的便利,开发者不用单独编译每一个要支持的命令,还不用考虑库的依赖关系。基本上每一个制作嵌入式系统的开发者的首选就是busybox。

    busybox也是采用Kconfig来管理配置选项,所以配置和编译busybox和kernel没有多大区别。busybox很灵活,你可以自由取舍你想要支持的命令,并且还可以添加你自己写的程序。在编译busybox的时候,为了简单省事,我们这里采用静态编译,这样就不用为busybox准备其他libc,ld等依赖库了。

    具体命令如下:

    1

    2

    3

    4

    5

    6

    7

    8

    cd ~/armsource/busybox

    # using stable version 1.21

    git checkout origin/1_21_stable -b busybox-1.21

    # using default configure

    make defconfig ARCH=arm

    # compile busybox in static

    make menuconfig

    make -j12 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    编译完后,我们就得到一个busybox静态链接的文件。

    接下来,我们需要一个init程序。这个程序将是kernel执行的第一个用户态的程序,我们需要它来产生一个可交互的shell。在桌面级别的linux发行版本,使用的init程序一般是System V init(传统的init),upstart(ubuntu),systemd(fedora)等。busybox也带有一个init程序,但是我们想自己写一个。既然自己写,那有两种实现方式,用C和libc实现,或者写一个shell脚本。

    为了简单,这里选择后者,具体脚本如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    #!/bin/sh

    echo

    echo "###########################################################"

    echo "## THis is a init script for initrd/initramfs ##"

    echo "## Author: wengpingbogmail.com ##"

    echo "## Date: 2013/08/17 16:27:34 CST ##"

    echo "###########################################################"

    echo

    PATH="/bin:/sbin:/usr/bin:/usr/sbin"

    if [ ! -f "/bin/busybox" ];then

    echo "cat not find busybox in /bin dir, exit"

    exit 1

    fi

    BUSYBOX="/bin/busybox"

    echo "build root filesystem..."

    $BUSYBOX --install -s

    if [ ! -d /proc ];then

    echo "/proc dir not exist, create it..."

    $BUSYBOX mkdir /proc

    fi

    echo "mount proc fs..."

    $BUSYBOX mount -t proc proc /proc

    if [ ! -d /dev ];then

    echo "/dev dir not exist, create it..."

    $BUSYBOX mkdir /dev

    fi

    # echo "mount tmpfs in /dev..."

    # $BUSYBOX mount -t tmpfs dev /dev

    $BUSYBOX mkdir -p /dev/pts

    echo "mount devpts..."

    $BUSYBOX mount -t devpts devpts /dev/pts

    if [ ! -d /sys ];then

    echo "/sys dir not exist, create it..."

    $BUSYBOX mkdir /sys

    fi

    echo "mount sys fs..."

    $BUSYBOX mount -t sysfs sys /sys

    echo "/sbin/mdev" > /proc/sys/kernel/hotplug

    echo "populate the dev dir..."

    $BUSYBOX mdev -s

    echo "drop to shell..."

    $BUSYBOX sh

    exit 0

    我们把这个脚本保存在~/armsource目录下。在这个脚本中,我们通过busybox –install -s来构建基本文件系统,挂载相应的虚拟文件系统,然后就调用busybox自带的shell。

    现在我们已经编译好了busybox,并准备好了相应的init脚本。我们需要考虑根文件系统的目录结构了。kenel支持很多种文件系统,比如:ext4, ext3, ext2, cramfs, nfs, jffs2, reiserfs等,还包括一些伪文件系统: sysfs, proc, ramfs等。而在kernel初始化完成后,会尝试挂载一个它所支持的根文件系统。根文件系统的目录结构标准是FHS,由一些kernel开发者制定,感兴趣的可以看wikipedia相关页面[7]。

    由于我们要制作一个很简单的ramfs,其中只有一个busybox可执行文件,所以我们没必要过多的考虑什么标准。只需一些必须的目录结构就OK。这里,我们使用的目录结构如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    ├── bin

    │ ├── busybox

    │ └── sh -> busybox

    ├── dev

    │ └── console

    ├── etc

    │ └── init.d

    │ └── rcS

    ├── init

    ├── sbin

    └── usr

    ├── bin

    └── sbin

    你可以通过如下命令来创建这个文件系统:

    1

    2

    3

    4

    5

    6

    7

    8

    cd ~/armsource/ramfs

    mkdir -pv bin dev etc/init.d sbin user/{bin,sbin}

    cp ~/armsource/busybox/busybox bin/

    ln -s busybox bin/sh

    mknod -m 644 dev/console c 5 1

    cp ~/armsource/init .

    touch etc/init.d/rcS

    chmod +x bin/busybox etc/init.d/rcS init

    现在我们有了基本的initramfs,万事具备了,就差点东风了。这个东风就是怎样制作intramfs镜像,并让kernel加载它。

    在kernel文档中,对initramfs和initrd有详细的说明[8][9]。initramfs其实就是一个用gzip压缩的cpio文件。我们可以把initramfs直接集成到kernel里,也可以单独加载initramfs。在kernel源码的scripts目录下,有一个gen_initramfs_list.sh脚本,专门是用来生成initramfs镜像和initramfs list文件。你可以通过如下方式自动生成initramfs镜像:

    1

    sh scripts/gen_initramfs_list.sh -o ramfs.gz ~/armsource/ramfs

    然后修改kernel的.config配置文件来包含这个文件:

    1

    CONFIG_INITRAMFS_SOURCE="ramfs.gz"

    重新编译后,kernel就自动集成了你制作的ramfs.gz,并会在初始化完成后,加载这个根文件系统,并产生一个shell。

    你也可以用gen_initramfs_list.sh脚本生成一个列表文件,然后CONFIG_INITRAMFS_SOURCE中指定这个列表文件。也可以把你做的根文件系统自动集成到kernel里面。命令如下:

    1

    sh scripts/gen_initramfs_list.sh ~/armsource/ramfs > initramfs_list

    对应的内核配置:CONFIG_INITRAMFS_SOURCE=”initramfs_list”

    但是这里并不打算这么做,我们自己手动制作initramfs镜像,然后外部加载。命令如下:

    1

    2

    cd ~/armsource/ramfs

    find . | cpio -o -H newc | gzip -9 > ramfs.gz

    选项-H是用来指定生成的格式。

    手动生成ramfs.gz后,我们就可以通过qemu来加载了,命令如下:

    1

    qemu-system-arm -M versatilepb -kernel arch/arm/boot/zImage -nographic -initrd ramfs.gz

    现在我们的系统起来了,并且正确执行了我们自己写的脚本,进入了shell。我们可以在里面执行基本常用的命令。是不是有点小兴奋。

    三、配置物理文件系统,切换根文件系统

    不是已经配置了根文件系统,并加载了,为什么还需要切换呢?可能你还沉浸在刚才的小兴奋里,但是,很不幸的告诉你。现在制作的小linux系统还不是一个完全的系统,因为没有完成基本的初始化,尽管看上去好像已经完成了。

    在linux中initramfs和initrd只是一个用于系统初始化的小型文件系统,通常用来加载一些第三方的驱动。为什么要通过这种方式来加载驱动呢?因为由于版权协议的关系,如果要把驱动放到kernenl里,意味着你必须要开放源代码。但是有些时候,一些商业公司不想开源自己的驱动,那它就可以把驱动放到initramfs或者initrd。这样既不违背kernel版权协议,又达到不开源的目的。也就是说在正常的linux发行版本中,kernel初始化完成后,会先挂载initramfs/initrd,来加载其他驱动,并做一些初始化设置。然后才会挂载真真的根文件系统,通过一个switch_root来切换根文件系统,执行第二个init程序,加载各种用户程序。在这中间,linux kernel跳了两下。

    既然他们跳了两下,那我们也跳两下。第一下已经跳了,现在的目标是制作物理文件系统,并修改initramfs中的init脚本,来挂载我们物理文件系统,并切换root文件系统,执行对应的init。

    为了省事,我们直接把原先的initramfs文件系统复制一份,当作物理根文件系统。由于是模拟,所以我们直接利用dd来生成一个磁盘镜像。具体命令如下:

    1

    2

    3

    4

    5

    dd if=/dev/zero of=~/armsource/hda.img bs=1 count=10M

    mkfs -t ext2 hda.img

    mount hda.img /mnt

    cp -r ~/armsource/ramfs/* /mnt

    umount /mnt

    这样hda.img就是我们制作的物理根文件系统,ext2格式。现在我们需要修改原先在initramfs中的init脚本,让其通过busybox的switch_root功能切换根文件系统。这里需要注意的是,在切换根文件系统时,不能直接调用busybox的switch_root,而是需要通过exec来调用。这样才能让最终的init进程pid为1。

    修改后的init脚本如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    #!/bin/sh

    echo

    echo "###########################################################"

    echo "## THis is a init script for sd ext2 filesystem ##"

    echo "## Author: wengpingbogmail.com ##"

    echo "## Date: 2013/08/17 16:27:34 CST ##"

    echo "###########################################################"

    echo

    PATH="/bin:/sbin:/usr/bin:/usr/sbin"

    if [ ! -f "/bin/busybox" ];then

    echo "cat not find busybox in /bin dir, exit"

    exit 1

    fi

    BUSYBOX="/bin/busybox"

    echo "build root filesystem..."

    $BUSYBOX --install -s

    if [ ! -d /proc ];then

    echo "/proc dir not exist, create it..."

    $BUSYBOX mkdir /proc

    fi

    echo "mount proc fs..."

    $BUSYBOX mount -t proc proc /proc

    if [ ! -d /dev ];then

    echo "/dev dir not exist, create it..."

    $BUSYBOX mkdir /dev

    fi

    # echo "mount tmpfs in /dev..."

    # $BUSYBOX mount -t tmpfs dev /dev

    $BUSYBOX mkdir -p /dev/pts

    echo "mount devpts..."

    $BUSYBOX mount -t devpts devpts /dev/pts

    if [ ! -d /sys ];then

    echo "/sys dir not exist, create it..."

    $BUSYBOX mkdir /sys

    fi

    echo "mount sys fs..."

    $BUSYBOX mount -t sysfs sys /sys

    echo "/sbin/mdev" > /proc/sys/kernel/hotplug

    echo "populate the dev dir..."

    $BUSYBOX mdev -s

    echo "dev filesystem is ok now, log all in kernel kmsg" >> /dev/kmsg

    echo "you can add some third part driver in this phase..." >> /dev/kmsg

    echo "begin switch root directory to sd card" >> /dev/kmsg

    $BUSYBOX mkdir /newroot

    if [ ! -b "/dev/mmcblk0" ];then

    echo "can not find /dev/mmcblk0, please make sure the sd

    card is attached correctly!" >> /dev/kmsg

    echo "drop to shell" >> /dev/kmsg

    $BUSYBOX sh

    else

    $BUSYBOX mount /dev/mmcblk0 /newroot

    if [ $? -eq 0 ];then

    echo "mount root file system successfully..." >> /dev/kmsg

    else

    echo "failed to mount root file system, drop to shell" >> /dev/kmsg

    $BUSYBOX sh

    fi

    fi

    # the root file system is mounted, clean the world for new root file system

    echo "" > /proc/sys/kernel/hotplug

    $BUSYBOX umount -f /proc

    $BUSYBOX umount -f /sys

    $BUSYBOX umount -f /dev/pts

    # $BUSYBOX umount -f /dev

    echo "enter new root..." >> /dev/kmsg

    exec $BUSYBOX switch_root -c /dev/console /newroot /init

    if [ $? -ne 0 ];then

    echo "enter new root file system failed, drop to shell" >> /dev/kmsg

    $BUSYBOX mount -t proc proc /proc

    $BUSYBOX sh

    fi

    现在我们可以通过qemu来挂载hda.img,为了简单,我们这里把这个设备虚拟为sd卡,这也是为什么上面的init脚本挂载物理根文件系统时,是找/dev/mmcblk0了。具体命令如下:

    1

    qemu-system-arm -M versatilepb -kernel arch/arm/boot/zImage -nographic -initrd ramfs.gz -sd hda.img

    如果不出意外,你可以看到这个自己做的linux系统,通过调用两个init脚本,跳到最终的hda.img上的文件系统。

    四、配置Uboot,加载kernel

    可能到这里,你觉得,终于把整个流程走了一遍了。但是,还差一环。之前我们都是通过qemu来直接加载我们的kernel,initramfs和物理镜像,但是在真真的嵌入式设备,这些加载过程都需要你好好考虑。那么在这一节,我们借助uboot来模拟加载过程。

    我们的目标是让uboot来加载kernel,initramfs,并识别qemu虚拟的sd卡设备。这里我们通过tftp来向uboot传递kernel和initramfs镜像。既然要依靠uboot来加载系统镜像,那么需要按照uboot的镜像格式制作加载的镜像。而mkimage工具,就是干这活的。在制作uboot镜像时,我们需要指定镜像类型,加载地址,执行地址等,制作uboot版的initramfs命令如下:

    1

    mkimage -A arm -O linux -T ramdisk -C none -a 0x00808000 -e 0x00808000 -n ramdisk -d ramfs.gz ramfs-uboot.img

    其中-a 和 -e分别是指定加载定制和执行地址

    而kernel的uboot版就不需要这么手动生成了,在编译kernel的时候,可以通过make uImage来制作uboot格式镜像,默认的加载地址是0×00008000,你也可以通过LOADADDR指定你自己的加载地址,这里用默认的。

    镜像准备好之后,需要把这两个镜像拷贝到一个指定的目录,这样在用tftp传输的时候,能够找到对应的镜像。这里假设拷贝到~/armsource/tftp目录下。

    下一步,我们需要交叉编译uboot。在编译之前,我们需要对uboot进行一些配置。由于我们使用的是versatilepb,它对应的配置文件在include/configs/versatile.h中,这里对这个文件的修改如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    #define CONFIG_ARCH_VERSATILE_QEMU

    #define CONFIG_INITRD_TAG

    #define CONFIG_SYS_PROMPT "myboard > "

    #define CONFIG_BOOTCOMMAND

    "sete ipaddr 10.0.2.15;"

    "sete serverip 10.0.2.2;"

    "set bootargs 'console=ttyAMA0,115200 root=/dev/mmcblk0';"

    "tftpboot 0x00007fc0 uImage;"

    "tftpboot 0x00807fc0 ramfs-uboot.img;"

    "bootm 0x7fc0 0x807fc0"

    其中ARCH_VERSATILE_QEMU是为了让uboot为了适应qemu做一些配置上的调整。INITRD_TAG是让uboot通过tag_list给kernel传递initramfs的地址,如果没有这个配置选项,kernel是找不到uboot传给他的initramfs。SYS_PROMPT是指定uboot的命令提示符,你可以指定你自己的名字。BOOTCOMMAND是指定uboot起来后,自动执行的命令,这里是让uboot自动设置自己的ip和tftp服务器的ip,然后设定传递给kernel的参数,最后三个命令是把kernel镜像和initramfs镜像装载进来,并从内存指定地址开始执行指令。其实这些命令,也可以在uboot起来后,自己输入。

    注意:在设置uboot的ip的时候,一定要和qemu给定的ip对应。由于这里使用的qemu内部自带的tftp服务,所以这里的ip和qemu内部tftp服务器的ip在同一个网段。

    uboot配置完之后,可以通过如下命令来编译uboot:

    1

    2

    make versatilepb_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    make -j12 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    如果没什么错误,就会生成一个u-boot镜像,然后我们就可以通过qemu来加载它:

    1

    sudo qemu-system-arm -M versatilepb -kernel u-boot -m 256M -net nic -net user,tftp=~/armsource/tftp -sd hda.img -nographic

    命令执行后,你就可以和之前一样的内核加载,最后经过两次跳转,到我们的sd卡上的文件系统。

    五、结语

    到这里,我们最终完成了qemu — > uboot –> kernel –> initramfs –> hda.img这一过程[10]。而这也是制作嵌入式系统,甚至一个桌面发行版本的基本流程。如果看完这篇文章后,还对嵌入式系统念念不忘,还是建议你买一块开发板,然后真真走一遍这个过程,毕竟这是用qemu模拟的。现在有很多open source hardware project(Arduino, Beagle Board, Cubieboard,Odroid,PandaBoard,Raspberry Pi),你可以购买他们的板子,然后移植任何自己喜欢的东西。由于是open source,你可以获取到很多资料,并且有社区支持。

    REFERENCE

      【合作交流】新浪微博:泰晓科技;微信公众号:泰晓科技;QQ群:321737134。【本站宣言】泰晓科技 | TinyLab.org 致力于推动业界创造更极致的嵌入式Linux产品

    高得文章网-分享知识 www.gdlsz.com

    Copyright ? 2002-2018 . 高得文章网-分享知识 版权所有 京ICP备10015900号

    Top