嵌入式开发---第五章 linux内核移植

2013年12月16日 14:02
转载(0) / 评论(0) / 浏览(1892)

1.1.1          编译linux内核

具体编译办法详见,

bash> make ARCH=arm zynq_base_trd_defconfig

执行以上命令会清除原有内核配置,该命令不用每次都要执行。

配置内核

Bash>make menuconfig

 

弹出如下界面,用方向键控制方向、回车键确认、空格用于选择和取消选择。

4.3.4.1 修改串口

 

Fig 1

 

Fig 2

 

Fig 3

选择Early Printk On UART1(2nd UART),按空格键取消该项,这样内核信息会从UART0打印出来。

连续按两个ESC(或用方向键选择屏幕下方的EXIT,然后回车)返回上一页面。

4.3.4.2

 

Fig 1

弹出如上窗口后点yes,完成内核配置。

bash> make ARCH=arm uImage

编译好的linux内核是zynq_base_trd_14_3/linux-xlnx/arch/arm/boot/目录下的uImage。

1.1.2          编译系统设备树

修改设备树配置文件

zynq_base_trd_14_3/linux-xlnx/arch/arm/boot/dts/zynq_base_trd.dts.

这里对设备树代码做简单介绍.

*          根节点

                   设备树的起始节点为根节点“/”,各属性介绍如下,

                   Model:指明目标板平台或模块名称;

                   Compatible:指明和目标板为同一系列的兼容的开发板名称。

                  #address-cells和#size-cells:对于32位平台这两个的值一般为1

*          CPU节点

            /cpus节点是根节点的子节点,/cpus节点没有必须要指明的属性,但指明#address-cells=<1>和size-cells=<0>是个好习惯。

         * 系统内存节点

/memory节点用于描述目标板上物理内存范围,可以有一个或多个内存节点。有多个节点时,需要后跟单员地址予以区分;只有一个单员地址时,如果不写地址则默认为0。

需指定device_type属性,值固定为memory;

Reg属性以<起始地址 空间大小>的形式给出。

         *  chosen

                   这个节点一般指定bootargs及linux,stdout-path属性值。

                   U-BOOT在1.3.0版本后添加了对扁平设备树FDT的支持,U-BOOT在加载linux内核,ramdisk文件系统和设备树后,会修改设备树二进制文件,填充必要的信息到设备树中,如MAC地址,PCI总线数目等.

         *  SOC

         如果处理器是SOC,此节点必须存在。SOC节点名以/soc的形式命名,例如MPC8394的SOC节点是”soc8394”,属性应该指定device_type固定为soc,rangs属性值以的形式指定。SOC节点包含目标板使用的每个设备子节点。这里应该尽可能详细的描述外设。

 

4.3.5.1 修改内存大小

 

4.3.5.2 修改空间分配

 

板子内存为512MB384MBlinux系统使用;

vmalloc=128M,vmalloc 128M

memmap=64M$0x18000000,预留从0x18000000物理地址开始的64M内存空间给logicvc使用。(logivcc???fpga代码??)

 

注意:logicvcFPGA用于显示的IP核,这里是将0x18000000起始的64兆内存分给该IP核使用。

 

4.3.5.3 将内核的串口改为uart0

         Uart0控制寄存器地址为0xE0000000

         Uart0控制寄存器地址为0xE0001000

 

4.3.5.4 修改ip核的分配地址

                  

4.3.5.5 修改IP配置

            删除未使用的IP核配置。

            这样完成了基本linux内核配置。

4.3.5.6 修改外设地址

编译结构树的前提是你已经编译过内核文件,命令如下:

./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb ./arch/arm/boot/dts/zynq_base_trd.dts

在内核根目录linux-xlnx下下有生成的文件devicetree.dtb将该文件拷贝出来备用。

1.1.3          构建文件系统框架

说明:

** arm工具链安装位置

            /root/CodeSourcery

1.1.3.1    创建lib目录,拷贝编译好的库文件

Bash> cd /home/devel/_rootfs

Bash> mkdir lib

Bash> cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/lib/*

Lib -r

         去除库文件中的调试符号,以减小体积

bash> arm-xilinx-linux-gnueabi-strip lib/*

拷贝工具链的必要工具

bash> cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/sbin/*

   sbin -r

bash> cp /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/bin/*

   usr/bin –r

  

 

1.1.3.2     创建和完善所需要的目录

Bash> mkdir dev etc etc/dropbear etc/init.d mnt opt proc root sys tmp var var/log var/www

完善etc目录

*** 创建"etc/fstab"文件并在文件中添加如下内容

LABEL=/     /           tmpfs   defaults        0 0

none        /dev/pts    devpts  gid=5,mode=620  0 0

none        /proc       proc    defaults        0 0

none        /sys        sysfs   defaults        0 0

none        /tmp        tmpfs   defaults        0 0

         ****创建"etc/inittab"文件并在文件中添加如下内容

         ::sysinit:/etc/init.d/rcS

# /bin/ash

#

# Start an askfirst shell on the serial ports

ttyPS0::respawn:-/bin/ash

# What to do when restarting the init process

::restart:/sbin/init

# What to do before rebooting

::shutdown:/bin/umount -a ¨r

****创建"etc/passwd"文件并在文件中添加如下内容

root:$1$qC.CEbjC$SVJyqm.IG.gkElhaeM.FD0:0:0:root:/root:/bin/sh

****创建"etc/init.d/rcS"文件并在文件中添加如下内容

                   #!/bin/sh                                 

echo "Starting rcS..."                    

echo "++ Mounting filesystem"             

mount -t proc none /proc                  

mount -t sysfs none /sys                  

mount -t tmpfs none /tmp                  

echo "++ Setting up mdev"                 

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

mdev ¨s                                   

mkdir -p /dev/pts                         

mkdir -p /dev/i2c                         

mount -t devpts devpts /dev/pts           

echo "++ Starting telnet daemon"          

telnetd -l /bin/sh                        

echo "++ Starting http daemon"            

httpd -h /var/www                          

echo "++ Starting ftp daemon"             

tcpsvd 0:21 ftpd ftpd -w /&               

echo "++ Starting dropbear (ssh) daemon"  

dropbear                                  

echo "rcS Complete"

****"etc/init.d/rcS"文件添加可执行权限

                   bash> chmod 755 etc/init.d/rcS

bash> sudo chown root:root etc/init.d/rcS

1.1.3.3     

1.1.4           编译文件系统

Root> cd ~

Root> dd if=/dev/zero of=ramdisk.img bs=1024 count=8192;

Root> mke2fs -F ramdisk.img -L "ramdisk" -b 1024 -m 0;

Root> tune2fs ramdisk.img -i 0;

Root> hmod 777 ramdisk.img;

Root> mkdir ramdisk;

Root> mount -o loop ramdisk.img ramdisk/;

Root> cp -r /home/devel/_rootfs/* ramdisk;

Root> umount ramdisk/;

Root> gzip -9 ramdisk.img;

Root> export PATH=zingsk_uboot/u-boot-xlnx/tools:$PATH;

Root> mkimage -A arm -T ramdisk -C gzip -d ramdisk.img.gz uramdisk.image.gz

uramdisk.image.gz既是内核镜像文件,如果将该文件和以前生成的uimagedevicetree.dtbboot.bin拷贝到SD卡,linux系统即可从sd卡中启动。
 
 
 
 
 

评论(0)

发表评论
登录
我可以
  • 评论
关联标签
关联热门电子辑
类似的技文

浏览(912) / 评论(0) / 2013年9月30日 22:27

浏览(781) / 评论(0) / 2013年10月12日 12:38

浏览(716) / 评论(0) / 2013年9月30日 22:28

浏览(828) / 评论(0) / 2013年9月30日 22:28

浏览(868) / 评论(0) / 2013年9月30日 22:27

浏览(937) / 评论(0) / 2013年9月30日 22:27

浏览(778) / 评论(0) / 2013年12月5日 11:52

浏览(976) / 评论(0) / 2013年12月12日 15:47

浏览(560) / 评论(0) / 2014年1月12日 10:05