完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
day01 交叉编译工具制作
1.任务一:使用crosstool制作交叉编译器 crosstool crosstool-ng 2.任务二:搭建嵌入式常用服务器 xinetd-->tftp /etc/xinetd/tftp nfs /etc/exports service nfs start service portmap start Linux的服务管理工具: service serverName start/stop/restart/status/reload chkconfig chkconfig --list //查看所有受chkconfig管理的服务的启动状态 chkconfig --list | grep vsftpd //查看vsftpd的启动状态 chkconfig --add vsftpd //将vsftpd加入到chkconfig的管理列表 chkconfig --del vsftpd //将vsftpd从chkconfig管理列表中移除 chkconfig --level 35 vsftpd on/off //使用chkconfig设置vsftpd的启动状态 服务 守护进程(精灵进程) 1.后台运行 2.没有控制终端 查看服务 ps 查看当前用户当前终端的进程 ps u 查看当前用户所有终端的进程 ps au 查看所有用户所有终端的进程 ps aux 查看所有用户所有进程(包括没有控制终端的进程) Linux服务目录: /etc/init.d /etc/rcN.d --> /etc/init.d的符号链接 rcN.d下的文件是:在启动级别N时,应该自动启动或者关闭的服务 s代表开机启动 day02 Bootloader(u-boot移植) 1.任务一:配置好以后使用的交叉编译工具链 ARM-linux-gcc-3.4.5-glibc-2.3.6 arm-linux-gcc-EABI-4.4.3 2.任务二:了解Bootloader运行原理 调用内核的方法: #define KERNEL_ENTRY 0x32000000 void (*ker_entry)(); ker_entry = (void (*)())KERNEL_ENTRY; ker_entry(); typedef void (*ker_entry)(); ker_entry entry = (ker_entry)KERNEL_ENTRY; entry(); typedef int a; typedef int *p; typedef int arr[5]; arr a; typedef int *arr[5]; typedef int (*parr)[5]; typedef int (*pfunc)(int,double); BootLoader概念: 系统启动之前运行的一小段代码. 开发板加电之后运行的第一段程序. BootLoader的操作模式 下载模式(shell模式) 引导加载模式 BootLoader的媒介 NorFlash --> 复制到sdram运行 flash/sd card/eeprom ---> 映射到4ksram ---> 复制到sdram运行 Bootloader的任务框架 Stage1(体系结构相关代码,汇编实现) 1.禁用看门狗 2.禁用中断 3.切换到SVC模式 4.初始化时钟 5.初始化sdram 6.初始化nand flash 7.Bootloader自拷贝 NorFlash启动: 将NorFlash上的前2M拷贝到sdram的指定地址 NandFlash启动:将NandFlash上的前2M拷贝到sdram的指定地址 8.安排内存 初始化栈指针 9.跳转到sdram中执行stage2 Stage2(体系结构无关代码,C实现) 1.初始化一些相关的硬件 串口,网络,USB等 2.将kernel从NandFlash拷贝到sdram 3.为启动内核设置参数 4.调用内核开始执行 3.任务三:u-boot代码分析 1.U-boot目录结构 cpu ---------- 与处理器相关的文件 arm920t cpu.c ------- cpu初始化,缓存 interrupt.c ------- 中断相关 start.S ------- 入口 arm720t mips i386 board ---------- 与开发板相关的文件 smdk2410 u-boot.lds smdk2400 include ---------- 头文件 asm_arm ------- ARM体系公共头文件 arch_s3c2440 arch_arm720t asm_avr asm_mips asm_ppc configs ------- 与开发板相关的头文件 smdk2410.h smdk2400.h common --------- 与开发板和cpu都无关的通用代码:各种命令,环境变量 drivers --------- 各种外部设备驱动:dm9000,uda lib_arm --------- 各种体系相关库文件 Makefile --------- 顶层Makefile 4.任务四:移植u-boot 5.任务五:熟悉u-boot的使用 帮助指令: help/? 下载指令(串口): loadb -- kermit loady -- ymodem loadx -- xmodem loadz -- zmodem loads -- 不使用任何协议,手动指定下载文件的精确大小 下载指令(网络): tftp 0x30200000 u-boot.bin --> 依赖于环境变量:ipaddr和serverip ping 内存执行指令 go 环境变量相关指令 printenv setenv envName envValue saveenv 环境变量的说明: bootargs --> 给内核传参,主要用于:内核引导文件系统 bootcmd --> 用于设置boot命令,主要用于:u-boot引导内核 bootdelay ipaddr --> ip地址 serverip --> 服务器地址 netmask --> 子网掩码 ethaddr --> mac地址 启动指令: boot --> 执行环境变量:bootcmd所代表的指令 bootm --> 引导内存中的内核 此时不能使用go,因为bootm会首先读取 内核的前64B,然后才会调用之后的内核入口函数。 nandflash操作指令: nand read[.jffs2] sdramAddr nandAddr readLen nand write[.jffs2] sdramAddr nandAddr writeLen nand erase nandAddr eraseLen 内存操作指令: md 显示内存的值 mm 修改内存的值 mw 内存写入 重启指令: reset day03 Kernel移植 1.任务一: 移植Linux2.6.32.2 移植步骤: 1.修改Makefile ARCH = ARM CROSS_TOOL= 2.使用已有配置单作为模板 make s3c2410_defconfig -------------------------------选择了smdk2440作为移植的模板 3.修改时钟频率 4.修改机器码 #define MINI2440 1999 5.内核简单配置: 1.System Type smdk2440/mini2440 2.Kernel Features EABI 3.General Setup 内核版本 FriendlyARM-2.6.32.2 6.make zImage ------------------------------ 7.NandFlash驱动移植并且分区 8.DM9000网卡驱动移植 9.Yaffs2文件系统移植 10.LCD及背光驱动移植 11.USB设备(键盘,鼠标,摄像头,无线网卡)驱动移植 12.UDA1341音频芯片驱动移植 2.任务二:了解内核选项 * 代表选中 M 代表选中为模块 3.任务三:使用u-boot启动编译好的内核 问题一:如何保证内核不覆盖u-boot的环境变量 修改分区: bootloader: 0-0x40000 param: 0x40000 - 0x60000 kernel: 0x100000 - 0x600000 rootfs: 0x600000 - ~ 问题二:修改zImage使其可以匹配u-boot 1.u-boot可以使用的内核是uImage,而不是zImage 2.uImage是使用u-boot/tools下的mkimage工具对zImage进行封装,而产生的内核镜像 3.uImage比zImage多了64个字节的头信息 4.bootm会读取uImage的64个字节的头信息,然后才开始调用内核入口函数 5.如何制作uImage 1.将u-boot/tools/mkimage工具拷贝到系统/bin或者/usr/bin目录 2.采用make uImage编译内核 注:make -- image make zImage -- zImage make uImage -- uImage 问题三:u-boot机器码和kernel的机器码不匹配,导致内核无法引导 1.修改机器码 u-boot: u-boot/board/mini2440/mini2440.c gd->bd->bi_arch_number = MACH_TYPE_S3C2440; kernel: linux-2.6/arch/arm/mach-s3c2440/mach-mini2440.c MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board") 2.解决方案 在u-boot/include/asm-arm/mach-types.h中,添加宏定义: #define MACH_TYPE_MINI2440 1999 修改u-boot机器码 gd->bd->bi_arch_number = MACH_TYPE_MINI2440; day04 文件系统构建 1.任务一:构建文件系统 1.使用busybox创建 bin ***in usr/bin usr/***in linuxrc 2.手动创建lib目录,并且在lib目录下放入必要的库文件 库文件: 1.可以在交叉编译工具链的lib目录下找到 2.库文件:一般由 .so + 一个符号链接组成 3.如果只打算放入busybox所依赖的必须的库: arm-linux-readelf -a bin/busybox | grep 'Shared' 结果:libc和libm 3.手动创建dev目录 dev目录有两个启动时必须要用到的文件: mknod console c 5 1 mknod null c 1 3 其他设备文件可以由mdev工具生成 4.手动创建etc /etc/inittab --> init进程的配置文件 /etc/init.d/rcS /etc/fstab /etc/profile --> shell配置文件 5.手动创建 mkdir home root mnt proc opt sys var ... 6.var/run,var/log 7.将其打包为jffs2文件 2.任务二:在开发板上使用nfs挂载根文件系统 bootargs=noinitrd root=/dev/nfs console=ttySAC0 nfsroot=192.168.12.100:/home/tony/sy***uild/rootfs ip=192.168.12.101 3.任务三:将jffs2文件烧写到nandflash,进行挂载 bootargs=noinitrd root=/dev/mtdblock3 console=ttySAC0 rootfstype=jffs2 4.了解内核的启动传参: bootargs noinitrd --> 如果不适用基于内存的文件系统,则要使用noinitrd root=/dev/mtdblockN /dev/nfs console=ttySAC0,115200 init=/linuxrc(缺省) ip 如果使用nfs启动,则要指定ip=ipaddr:serverip:gateway:netmask:eth0:off rootfstype ---> 如果使用基于flash的文件系统,则要使用rootfstype指定文件系统类型 day05 应用程序移植 整体思路: 1.将应用程序交叉编译为目标板类型 2.将应用程序所用到的所有的库统统交叉编译为目标板类型 3.将应用程序和库放到开发板的相应目录 4.注意:QT尺寸 #define TARGET_ARCH_ARM //#define TARGET_ARCH_X86 #ifdef TARGET_ARCH_ARM ... #endif #ifdef TARGET_ARCH_X86 ... #endif #define TARGET_OS_WIN32 #define TARGET_OS_LINUX #ifdef TARGET_OS_WIN32 ... #endif #ifdef TARGET_OS_LINUX ... #endif gcc -DTARGET_ARCH_ARM 任务一:移植helloworld 1.编写helloworld 2.交叉编译 arm-linux-gcc hello.c -ohello 3.去除调试信息 arm-linux-strip hello 4.检查可执行文件的依赖 arm-linux-readelf -a hello | grep 'Shared' 5.将hello依赖的库交叉编译并且放到目标板的lib或者/usr/lib目录 6.将hello放到开发板上运行 ./hello 任务二:移植madplay音乐播放器 1.源码安装程序的一般步骤: step1:配置 ./configure --prefix(指定安装路径) --host(指定目标平台) 举例: ./configure --prefix=`pwd` --host=arm-linux step2:编译 make step3:安装 make install 2.注意: arm-linux-readef工具 arm-linux-strip工具 注意: 如果安装程序不支持--host,可以手动修改 Makefile中的编译器:CC |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:54 , Processed in 0.562710 second(s), Total 47, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号