精华内容
下载资源
问答
  • 系统移植学习

    2021-02-09 09:46:40
    如何学习系统移植? 什么是系统移植? 就是将操作系统移植到对应的硬件平台 linux系统移植到开发板 为什么学习系统移植? 软硬件可裁剪 公司新的硬件平台—》移植linux系统 到硬件平台 学习系统移植的目的? 1...

    系统移植
    【1】什么是系统移植?
    为什么学习系统移植?
    学习系统移植的目的?
    如何学习系统移植?

    1. 什么是系统移植?
      就是将操作系统移植到对应的硬件平台
      linux系统移植到开发板

    2. 为什么学习系统移植?
      软硬件可裁剪

      公司新的硬件平台—》移植linux系统
      到硬件平台

    3. 学习系统移植的目的?
      1》工作的需要
      2》为后边的驱动开发搭建一个系统环境
      3》嵌入式应用层的开发离不开操作系统

    4. 如何学习系统移植?
      1》跟上我上课的思路,
      2》掌握系统移植的流程,不要关心代码

    【2】概念:本地开发和交叉开发
    本地开发:PC端编写代码,编译代码,运行代码
    交叉开发:PC端编写代码,编译代码,Target运行代码

    PC 					Target 
    X86架构 			arm架构
    
    使用交叉编译工具链将源码编译成支持ARM架构的可执行程序,
    再讲可执行程序拷贝到目标板上运行。
    
    PC:gcc
    交叉编译工具链:arm-none-linux-gnueabi-gcc 
    arm-none-linux-gnueabi-:交叉编译工具链的名字,
    名字就是一个代码
    

    【3】安装交叉编译工具链
    1. 获取交叉编译工具链
    一般交叉编译工具链和uboot和linux内核源码,
    都具有配套的关系。

    	1》自己去gnu官网获取交叉编译工具链的源码,
    		自己进行编译生成对应的交叉编译工具链。
    		不推荐:编译过程很繁琐
    	2》直接从芯片厂家获取交叉编译工具链
    	3》直接跟开发板的生成厂家获取交叉编译工具链
    	4》直接找主管获取交叉编译工具链
    

    安装交叉编译工具链:
    将代码编译成ARM架构的可执行程序
    安装步骤:
    1. 在ubuntu的家目录(~)下,创建toolchain 
    	mkdir toolchain 
    2. 拷贝gcc-4.5.1.tar.bz2到toolchain目录下
    	cp 目录/gcc-4.5.1.tar.bz2 ~/toolchain
    3. 解压缩交叉编译工具链
    	tar -vxf gcc-4.5.1.tar.bz2
    4. 配置环境变量
    	打开 sudo vi /etc/bash.bashrc 
    	在最后一行添加以下内容:
    5. 使环境变量立即生效
    	source /etc/bash.bashrc
    	export PATH=$PATH:/home/hqyj/toolchain/gcc-4.5.1/bin/
    						修改为自己的路径
    
    6. 测试交叉编译工具链是否安装成功
    	arm-none-linux-gnueabi-gcc -v
    	打印以下内容,表示成功
    	gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50) 
    

    【4】gnu命令
    1. nm
    格式:nm 可执行文件
    列出可执行文件中的符号

    	$ arm-none-linux-gnueabi-nm interface.elf
    	符号的地址   类型   符号名字
    	43c016e4       T    delay_ms
    	43c01754       T    do_irq
    	43c00200       T    fiq
    	43c01a24       T    hal_irq_gicc_init
    	43c01988       T    hal_irq_gicd_init
    	43c01844       T    hal_irq_gpio_init
    	43c01a6c       T    hal_led_init
    	43c000c4       t    init_stack
    	43c001e0       T    irq
    	43c01b44       T    main
    2. strip
    	删除可执行文件中符号表,对可执行文件进行压缩
    	符号表不影响程序的运行。
    	切记,不可以对中间文件进行压缩
    	格式:strip 可执行文件
    	使用ls -al可以查看文件的大小
    3. size	
    	查看文件中各个段的大小
    	格式:size 可执行文件
    	$ arm-none-linux-gnueabi-size interface.elf 
       text	   data	    bss	    dec	    hex	filename
       7140	   2304	      0	   9444	   24e4	interface.elf
    4. objcopy
    	将可执行文件(elf)生成纯粹的二进制文件(.bin)
    	格式:arm-none-linux-gnueabi-objcopy 
    		-O binary ***.elf ***.bin
    	-O:输出
    	binary:二进制文件
    5. objdump
    	将可执行文件(elf)生成反汇编文件(.dis)
    	格式:格式:arm-none-linux-gnueabi-objdump
    		-D ***.elf > ***.dis 
    	可以看反汇编代码,查看代码具体的实现,
    	
    	通过可执行文件生成的汇编代码叫做反汇编(汇编指令集)代码
    
      7 43c00000 <_start>:
    指令存放的地址   机器码       通过机器码生成反汇编代码
       8 43c00000:   ea00000d    b   43c0003c <reset>
       9 43c00004:   e59ff014    ldr pc, [pc, #20]   ; 43c00020 <_undefined
      10 43c00008:   e59ff014    ldr pc, [pc, #20]   ; 43c00024 <_software_
      11 43c0000c:   e59ff014    ldr pc, [pc, #20]   ; 43c00028 <_prefetch_
      12 43c00010:   e59ff014    ldr pc, [pc, #20]   ; 43c0002c <_data_abor
      13 43c00014:   e59ff014    ldr pc, [pc, #20]   ; 43c00030 <_not_used>
      14 43c00018:   e59ff014    ldr pc, [pc, #20]   ; 43c00034 <_irq>
      15 43c0001c:   e59ff014    ldr pc, [pc, #20]   ; 43c00038 <_fiq>
    
    6. readelf
    	获取可执行文件的头部信息
    	格式:readelf -h 可执行文件 
    	
    	ELF Header:
      Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
      Class:                             ELF32
      Data:                              2's complement, little endian
      Version:                           1 (current)
      OS/ABI:                            ARM
      ABI Version:                       0
      Type:                              EXEC (Executable file)
      Machine:                           ARM
      Version:                           0x1
      Entry point address:               0x43c00000
      Start of program headers:          52 (bytes into file)
      Start of section headers:          53124 (bytes into file)
      Flags:                             0x602, has entry point, GNU EABI, software FP, VFP
      Size of this header:               52 (bytes)
      Size of program headers:           32 (bytes)
      Number of program headers:         2
      Size of section headers:           40 (bytes)
      Number of section headers:         18
      Section header string table index: 15
    
    7. addr2line 
    	跟地址可以定位到地址对应的函数
    	格式:addr2line -e ****.elf 地址 -a -f 
    	作用:可以用于追踪代码的错误,追踪段错误或者空指针
    	
    	-e:后边跟可执行文几番
    	-a -f:显示函数名和行号
    	
    	$ arm-none-linux-gnueabi-addr2line -e interface.elf 0x43c01a74 -a -f
    	0x43c01a74
    	hal_led_init
    	/home/thf/1997/arm/key_irq/main.c:92
    
    
    	gun命令前边什么都不加,表示X86架构下的GUN指令
    		gcc g++ nm addr2line readelf strip objdump objcopy
    	
    	gnu命令前边添加arm-none-linux-gnueabi-的前缀
    		表示支持arm架构的gnu命令
    		
    			
    	对于交叉编译工具的的前缀到底是什么?
    	/home/thf/toolchain/gcc-4.5.1/bin
    	在交叉编译工具链的bin目录下查看交叉编译工具链的前缀。
    
    
    	arm-none-linux-gnueabi-gcc --help  查看命令的帮助手册
    
    	ubuntu中gnu命令存在的路径在:
    	/usr/bin 
    	thf@thf:bin$ pwd
    	/usr/bin
    	thf@thf:bin$ ls -al gcc
    	lrwxrwxrwx 1 root root 7 10月 28 12:21 gcc -> gcc-4.8
    	thf@thf:bin$ ls -al objcopy
    	-rwxr-xr-x 1 root root 217000  4月 26  2017 objcopy
    	thf@thf:bin$ ls -al gdb
    	-rwxr-xr-x 1 root root 5094584  6月 10  2017 gdb
    	thf@thf:bin$ ls -al g++
    	lrwxrwxrwx 1 root root 7  4月  8  2014 g++ -> g++-4.8
    

    【5】PC和Target如何进行硬件连接
    pc Target
    ---------------- -----------------
    | | 串口线 | |
    | |-----------| |
    | | | |
    | | 网线 | |
    | |-----------| |
    | | | |
    | | | |
    | | | 电源 |
    ---------------- -----------------

    串口线:打印各种调试信息得到串口工具上
    网线:用于下载uboot和内核的镜像
    	通过网络去挂载根文件系统
    	
    	需要在ubuntu中安装对应的服务器
    	通过网线下载文件---》tftp服务
    	通过网线挂载根文件系统---》nfs服务
    
    	tftp服务和nfs服务的客户端uboot和内核源码默认已经安装
    

    【6】安装tftp服务
    一个简单的文本文件传输协议,基于udp协议

    1. 检查ubuntu是否安装了tftp服务
    	dpkg -s tftpd-hpa
    	打印以下内容表示安装了tftp服务:
    	Architecture: i386
    	Source: tftp-hpa
    	Version: 5.2-7ubuntu3.1
    
    2. 安装tftp服务 (前提:ubuntu必须能连接外网)
    	sudo apt-get update 更新源
    	sudo apt-get install -f 更新依赖
    	sudo apt-get install tftpd-hpa tftp-hpa 
    
    3. 配置tftp服务
    	1. 在家目录下创建一个tftpboot文件夹
    		mkdir tftpboot 
    		目的:tftpboot目录下存放的是你要下载到
    		开发板上的可执行文件
    	2. 修改tftpboot的权限
    		chmod 777 tftpboot
    	3. 配置tftp服务的环境变量
    		打开sudo vi /etc/default/tftpd-hpa 
    		修改一下内容:
    		  1 # /etc/default/tftpd-hpa
    		  2 
    		  3 TFTP_USERNAME="tftp" 
    				tftp用户名,不需要修改
    		  4 TFTP_DIRECTORY="/home/hqyj/tftpboot"
    				tftp服务下载文件的存放的路径,需要修改
    				改成自己的对应的tftpboot的路径
    		  5 TFTP_ADDRESS="0.0.0.0:69"
    				tftp服务默认使用的69端口号
    		  6 TFTP_OPTIONS="-c -s -l"  
    				tftp服务的参数,这个需要修改
    
    4. 重启tftp服务
    	1. sudo service tftpd-hpa start  启动TFTP服务
    	2. sudo service tftpd-hpa restart  重启TFTP服务
    5. 本地测试tftp服务是否安装成功
    	$ tftp 127.0.0.1
    	tftp> get 1.txt   # 从tftpboot目录下下载
    					  # 1.txt文件到当前目录 
    	tftp> put 2.txt   # 把当前目录中的2.txt文件
    					  # 上传到tftpboot文件夹中
    
    	tftp> q   <回车>  退出
    
    6. 可能出现的问题
    	下载或上传是,一直卡,
    	原因:tftp服务安装成功,需要重启tftp服务
    		tftp服务安装不成功
    	
    	关闭windows和ubuntu的防火墙
    

    【6】nfs服务的安装
    Network File System

    1. 检查nfs服务是否安装
    	dpkg -s nfs-kernel-server
    2. 安装nfs服务(前提:可以上网)
    	sudo apt-get install nfs-kernel-server
    3. 配置nfs服务
    	1》在家目录下创建nfs文件夹
    		mkdir nfs 
    	2》设置文件夹的权限最大
    		chmod 777 nfs 
    	3》拷贝根文件系统到nfs目录下
    		cp /mnt/hgfs/share/rootfs-ok.tar.bz2 ~/nfs
    	4》对根文件系统的压缩包进行解压缩
    		cd ~/nfs
    		tar -vxf rootfs-ok.tar.bz2
    	5》配置nfs服务的环境变量
    		sudo vi /etc/exports
    		在文件的最后一行添加以下内容:
    		****************************************
    		 /home/thf/nfs/rootfs/ *(rw,sync,no_subtree_check,no_root_squash) 
    		****************************
    		解析:
    		/home/thf/nfs/rootfs/:自己的根文件系统的路径
    		*:所有的用户,注:*和后边的左括号"("之间不可以出现空格.
    		rw:可读可写的权限
    		sync:同步文件
    		no_subtree_check:不对字目录检查文件的权限
    		no_root_squash:如果客户端位root用户,那么他对整个文件具有root的权限
    		
    		注意:这段话前边不要加#,#号是这个文件中的注释符号
    		
    4. 重启nfs服务
    	1. sudo service nfs-kernel-server start  启动nfs服务
    	2. sudo service nfs-kernel-server restart  重启nfs服务
    		
    5. 本地测试nfs服务是否安装成功
    	1》回到家目录下
    		cd ~
    	2》sudo mount -t nfs 本机IP地址:/home/thf/nfs/rootfs/ /mnt
    	
    	nfs:使用nfs服务,将本机IP地址:/home/thf/nfs/rootfs/
    	文件挂载到/mnt目录下
    	3》检查/mnt目录下是否挂载成功
    		cd /mnt 
    		ls 
    	4》卸载挂载的文件
    		sudo umount /mnt
    		注意:不可以在/mnt目录下执行卸载的命令
    

    #####################################################
    【8】uboot中的命令
    1.help命令
    FS6818# help 查看当前uboot支持的所有的命令
    命令就是一个字符串,uboot收到字符串之后,
    会解析字符串,完成对应的功能。

    FS6818# help
    	0       - do nothing, unsuccessfully
    	1       - do nothing, successfully
    	?       - alias for 'help'
    	base    - print or set address offset
    	bdinfo  - print Board Info structure
    	boot    - boot default, i.e., run 'bootcmd'
    	bootd   - boot default, i.e., run 'bootcmd'
    	bootm   - boot application image from memory
    	bootp   - boot image via network using BOOTP/TFTP protocol
    	cmd     - cmd [command] options...
    	cmp     - memory compare
    	cp      - memory copy
    	crc32   - checksum calculation
    	dhcp    - boot image via network using DHCP/TFTP protocol
    	drawbmp - darw bmpfile on address 'addr' to framebuffer 
    	env     - environment handling commands
    	exit    - exit script
    	ext4load- load binary file from a Ext4 filesystem
    	ext4ls  - list files in a directory (default /)
    	ext4write- create a file in the root directory
    	fastboot- fastboot- use USB Fastboot protocol
    
    	fatinfo - print information about filesystem
    	fatload - load binary file from a dos filesystem
    	fatls   - list files in a directory (default /)
    	fatwrite- write file into a dos filesystem
    	fdisk   - mmc list or create ms-dos partition tables (MAX TABLE 7)
    	go      - start application at address 'addr'
    	goimage - start Image at address 'addr'
    	help    - print command description/usage
    	i2c     - I2C sub-system
    	i2cmod  - set I2C mode
    	iminfo  - print header information for application image
    	loadb   - load binary file over serial line (kermit mode)
    	loadbmp - load bmpfile with command or 'bootlog' environment 
    	loads   - load S-Record file over serial line
    	loadx   - load binary file over serial line (xmodem mode)
    	loady   - load binary file over serial line (ymodem mode)
    	loop    - infinite loop on address range
    	md      - memory display
    	mdio    - MDIO utility commands
    	mii     - MII utility commands
    	mm      - memory modify (auto-incrementing address)
    	mmc     - MMC sub system
    	mmcinfo - display MMC info
    	mtest   - simple RAM read/write test
    	mw      - memory write (fill)
    	nm      - memory modify (constant address)
    	ping    - send ICMP ECHO_REQUEST to network host
    	pmic    - PMIC
    	printenv- print environment variables
    	reset   - Perform RESET of the CPU
    	run     - run commands in an environment variable
    	saveenv - save environment variables to persistent storage
    	saves   - save S-Record file over serial line
    	sdfuse  - sdfuse  - read images from FAT partition of SD card and write them to booting device.
    
    	setenv  - set environment variables
    	showvar - print local hushshell variables
    	source  - run script from memory
    	test    - minimal test like /bin/sh
    	tftpboot- boot image via network using TFTP protocol
    	udown   - Download USB
    	update_mmc- update mmc data
    
    	version - print monitor, compiler and linker version	
    	
    2. help 命令 
    	查看命令的帮助手册
    		
    3. loadb 
    	loadb 下载到内存的那个地址 
    	下载二进制文件到内存的某个地址,使用kermit协议
    		
    	flash              memery
    	掉电不丢失        掉电丢失
    	速度慢			  速度快
    	价格便宜		  价格贵
    	flash访问通过     内存以字节为单位进行访问
    	块去访问,
    	每块大小位512字节
    
    4. go 
    	go  内存地址
    	跳转到内存地址处,运行程序
    
    5. printenv   打印uboot的环境变量
    	FS6818# printenv
    	baudrate=115200
    	bootargs=root=/dev/nfs nfsroot=192.168.0.222:/home/hqyj/nfs/rootfs,v4,tcp rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.0.250
    	bootcmd=loadb 43c00000;go 43c00000
    	bootdelay=3
    	bootfile=uImage
    	ethact=dwmac.c0060000
    	ethaddr=00:e2:1c:ba:e8:60
    	ethprime=RTL8211
    	fastboot=flash=mmc,2:ubootpak:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd:0x200,0x4000;flash=mmc,2:bootloader:boot:0x8000,0x70000;flash=mmc,2:boot:ext4:0x00100000,0x04000000;flash=mmc,2:system:ext4:0x04100000,0x2F200000;flash=mmc,2:cache:ext4:0x33300000,0x1AC00000;flash=mmc,2:misc:emmc:0x4E000000,0x00800000;flash=mmc,2:recovery:emmc:0x4E900000,0x01600000;flash=mmc,2:userdata:ext4:0x50000000,0x0;
    	gatewayip=192.168.0.1
    	ipaddr=192.168.0.250
    	loadb=0x43c00000;go 0x43c00000
    	netmask=255.255.255.0
    	serverip=192.168.0.222
    	stderr=serial
    	stdin=serial
    	stdout=serial
    
    	Environment size: 872/32764 bytes
    
    	注意:uboot对命令进行匹配是,是部分匹配
    	
    	pri/print/printenv 常用
    
    5. bootm  (启动内核是在用)
    	bootm 内核的运行地址 根文件系统的运行地址 设备树的运行地址  
    	
    	引导linux内核启动的
    
    6. ping命令   
    	ping  ip地址
    	用于开发板和电脑是否可以ping通
    
    7. setenv  设置环境变量
    	1》给uboot添加环境变量
    		setenv  环境变量名  环境变量对应的值
    		eg:setenv  xiaoming  nozuonodie
    		注:等号会自动添加
    	2》删除环境变量
    		setenv  要删除的环境变量名
    		eg:setenv  xiaoming 
    	3》修改环境变量
    		setenv 旧的环境变量名  新的环境变量值
    		eg:setenv xiaoming qusiba
    		
    		设置完环境变量之后,环境变量存在于内存中,
    		重新上电数据会丢失
    8. saveenv  保存环境变量到flash中
    
    9. tftpboot    
    	使用tftp服务,将可执行程序通过网线下载到内存中
    	tftpboot/tftp  内存地址   要下载的可执行文件
    	
    	要求:可执行文件必须存放在tftp服务配置是指定的目录下
    		我的目录:/home/hqyj/tftpboot 
    

    【8】uboot中环境变量的作用
    baudrate=115200 波特率
    bootdelay=3 uboot启动后倒计时时间
    gatewayip=192.168.1.1 网关
    ipaddr=192.168.1.250 开发板的ip地址(FS6818)
    netmask=255.255.255.0 子网掩码
    serverip=192.168.1.222 服务器的ip地址(PC:Ubuntu)

    【9】测试ping命令和tftp命令的使用
    0》开发板和PC电脑如何连接
    查看:开发板和PC网线进行连接.png
    1》设置ubuntu的IP地址
    1>修改电脑的网卡由自动切换到百兆全双工
    查看:网卡百兆全双工设置.png
    2>修改ubuntu的ip地址
    (1) 设置ubuntu系统使用有线网卡
    查看:ubuntu网络配置1.png
    (2) 设置ubuntu系统为固定的IP地址
    查看:Ubuntu网络配置2.png
    (3)查看IP地址是否设置成功
    ifconfig
    2》设置开发板的IP地址
    setenv serverip 192.168.1.222
    setenv ipaddr 192.168.1.250
    setenv gatewayip 192.168.1.1
    setenv netmask 255.255.255.0
    saveenv
    3》测试开发板能够平通Ubuntu
    在超级终端上执行以下命令
    FS6818# ping 192.168.1.222
    如果ping失败打印一下信息:
    dwmac.c0060000 Waiting for PHY auto negotiation to complete… TIMEOUT !
    Waiting for PHY realtime link… TIMEOUT !
    done
    dwmac.c0060000: No link.
    ping failed; host 192.168.1.222 is not alive

    	如果ping成功打印一下信息:
    	Speed: 100, full duplex
    	Using dwmac.c0060000 device
    	host 192.168.1.222 is alive
    	
    	总结:
    	ping 失败的原因
    	1》windows的防火墙可能没关
    	2》检查开发板和电脑之间的网线
    	3》重启tftp服务
    	4》检查tftp服务的环境配置是否正确
    	
    4》测试tftp命令的使用
    	拷贝ARM课程中的interface.bin文件到tftpboot目录下
    	在超级终端上执行以下命令:
    	FS6818# tftp 0x43c00000 interface.bin 
    	如果打印一下内容表示下载成功:
    	Speed: 100, full duplex
    	Using dwmac.c0060000 device
    	TFTP from server 192.168.1.222; our IP address is 192.168.1.250
    	Filename 'interface.bin'.
    	Load address: 0x43c00000
    	Loading: #
    			 708 KiB/s
    	done
    	Bytes transferred = 8700 (21fc hex)
    	
    	FS6818# go 0x43c00000   # 运行代码
    
    	总结:tftp失败的原因
    	1》包含上边ping失败的原因
    	2》检查uboot的环境变量设置是否正确
    		serverip ipaddr gatewayip netmask
    	3》检查ubuntu的网络设置
    		切记,开发板和ubuntu的ip地址在同一个网段
    

    【10】给开发板部署操作系统

    1. 部署uboot
      1》新的开发板,一切都是空白,制作一个SD卡启动盘
      1> 将sd卡启动盘的制作工具拷贝到ubuntu的toolchain目录下
      cp /mnt/hgfs/share/sdtool ~/toolchain -raf
      2> 进入到sdtool目录下
      cd ~/toolchain/sdtool
      3> 将sd卡插到电脑上,让你的ubuntu识别sd卡
      注意:必须使用读卡器,不可以使用电脑自带的SD卡卡槽
      将SD卡插到读卡器上,读卡器插到电脑上,
      在windows下讲SD卡进行格式化。

       	虚拟机--》可移动设备--》realtek USB3.0-CRW
       	---》连接
       	sdtool文件中的文件是什么?
       	s5p6818-sdmmc.sh :烧写uboot到sd卡的脚本
       	ubootpak.bin:uboot的可执行文件
       4> 烧写ubootpak.bin到sd卡中
       	在ubuntu中执行命令
       	sudo ./s5p6818-sdmmc.sh /dev/sdb ubootpak.bin
       	
       	/dev/sdb: sd卡的设备文件
       	
       	如果打印一下信息表示,部署成功:
       	688+1 records in
       	689+0 records out
       	352768 bytes (353 kB) copied, 0.00914641 s, 38.6 MB/s
       	^_^ The image is fused successfully
       	
       	总结: 报SD卡只读的错误,
       		将sd卡中开关拨到lock的位置,
       		lock靠近sd卡的触点位置
      
       5> 测试sd卡是否制作成功
       	将sd卡插到开发板板上,
       	设置开发板上的拨码开关,为sd卡启动,
       	
       	拨码开关用于设置开发板上uboot的启动方式的
       	OM1   OM2	OM3   Device
       	ON	  ON    X      nand flash
       	OFF   ON    X      USB 
       	ON    OFF   ON     EMMC   本开发板flash为EMMC
       	OFF   OFF   OFF    SD/TF 
       		
       6> 开发板重新上电,启动成功。
      
      1. 部署Linux内核
      2. 部署根文件系统
    展开全文
  • tar -xzf open_source_software.tar.gzcd open_source_software./configuremakemake install但是,如果要将开源软件移植到嵌入式Linux单板上运行,情况却略有不同。本文就来说说这项工作如何进行。不当之处,还请...

    我们知道,在PC机Linux上,安装开源软件,一般来讲,大多是如下几个步骤就搞定了。

    tar -xzf  open_source_software.tar.gz

    cd       open_source_software

    ./configure

    make

    make install

    但是,如果要将开源软件移植到嵌入式Linux单板上运行,情况却略有不同。

    本文就来说说这项工作如何进行。不当之处,还请大家斧正。

    其实,无论是在PC机Linux上安装开源软件,还是将开源软件移植到嵌入式Linux单板上,其操作过程,在本质上是完全相同的。只是在PC机Linux上,各项事宜默认就得到了正确的组合。而对于嵌入式Linux单板,我们则需要明确地为这些事宜构造正确的组合。下面,我们就来看看具体的移植过程。

    一、在PC机Linux上安装合适的交叉编译工具链。

    这一步很简单,一般就是将工具链的压缩包解压到某个路径下,就完成了安装。

    我们这里假设目标单板是arm处理器,运行Linux系统,

    用的工具链是arm-linux-gcc-3.4.1,工具链安装路径是/opt/arm-linux-gcc-3.4.1。

    并且,为了使用方便,我们已经将/opt/arm-linux-gcc-3.4.1/bin目录添加到PATH环境变量中了。这样就可以直接使用arm-linux-gcc、arm-linux-ld等命令了。

    如果不这样做的话,后面使用/设定编译器时,就得用/opt/arm-linux-gcc-3.4.1/bin/arm-linux-gcc了。

    二、开源库的移植

    由于有些开源应用程序本身又依赖于一些开源库。因此,我们的移植步骤是,先移植开源库,再移植开源应用程序。不然的话,开源应用程序的编译就会成问题。

    因此,这里先介绍开源库的移植。

    库的移植,其实就是对工具链自带的库进行了扩充。

    例如,假设上述arm工具链的stdio.h文件路径为/opt/arm-linux-gcc-3.4.1/include/stdio.h

    那么,我们移植完开源库之后:

    /opt/arm-linux-gcc-3.4.1/include/下面就会多出一些头文件。

    /opt/arm-linux-gcc-3.4.1/lib/下面就会多出一些.a文件或.so文件。

    当然,凡是单板上用到的/opt/arm-linux-gcc-3.4.1/lib/下面的.so文件,不管是工具链自带的,还是我们移植的,都需要拷贝到单板的根文件系统的/usr/lib/目录中。

    好了,下面说说具体移植步骤。

    假设我们已经获取并解压了开源库的源码包,并且在shell中已经进入了源码包的根目录。接下来的工作,分三步进行。

    1. 配置

    注意,这是最关键的一步。在这一步中,我们要指定诸如目标单板的操作系统、CPU、工具链等信息。

    如何指定这些信息呢,不同的软件可能会有相同。我们如果不熟悉,就需要仔细阅读源码包中附带的诸如README、INSTALL等文件。这些文件会告诉我们,如何指定这些信息。

    一般来讲,常见的配置方法,是通过 ./configure 命令进行。当然,有些开源包,可能叫./config或其他名字。这并不重要。

    这些configure通常都是很大的shell脚本,应该都是用自动化工具生成的。因此,我们不用费力去读他的内容。

    以opensll为例。配置命令为:

    ./config --prefix=/opt/arm-linux-gcc-3.4.1/  linux-elf:arm-linux-gcc

    这就指定了目标类型是linux-elf,工具链是arm-linux-gcc。

    安装路径是:/opt/arm-linux-gcc-3.4.1/。注意,这个路径是交叉工具链include目录及lib目录的父目录。因为头文件及编译后的库文件,需要分别安装到include与lib目录中。

    当然,在配置命令中,我们还可以指定其他选项,以做进一步的定制。

    一般来讲,可以通过  ./configure  --help 命令查看所支持的可定制选项。

    该命令会输出所支持的各种选项,选项的含义,以及默认是否打开等信息。

    当然,对于opensll来说,这里是用./config --help 命令。

    如果这一步失败,通常是编译系统依赖的某个工具没找到。这个好办,安装一下就是了。

    2. 编译

    这就简单了,一般来说,一个make命令搞定

    3. 安装

    这就简单了,一般来说,一个make install命令搞定

    对于本例来说,由于指定了安装路径为:--prefix=/opt/arm-linux-gcc-3.4.1/

    因此,头文件(例如,openssl/ssl.h)及编译后的库文件(如libcrypto.a  libssl.a),会分别被安装到/opt/arm-linux-gcc-3.4.1/include 与 /opt/arm-linux-gcc-3.4.1/lib目录中。这样一来,就相当于扩充了/opt/arm-linux-gcc-3.4.1自带的库。接下来,就可以编译使用了opensll的开源应用程序了。

    三、开源应用程序的移植

    假设我们已经获取并解压了开源应用程序的源码包,并且在shell中已经进入了源码包的根目录。接下来的工作,也分三步进行。

    1. 配置

    和开源库的移植类似。在这一步中,我们要指定诸如目标单板的操作系统、CPU、工具链等信息。

    如果不熟悉,同样需要需要仔细阅读源码包中附带的诸如README、INSTALL等文件。这些文件会告诉我们,如何指定这些信息。

    以e2fsprogs-1.42.5为例。配置过程如下(可能相对传统一点):

    mkdir release

    cd release/

    ../configure --host=arm-linux CC=arm-linux-gcc

    当然,我们同样可以带上更多的参数,做更多的定制。

    例如,带上参数 LDFLAGS=-static从而指定静态链接。

    如果这一步失败,有两个原因:

    a). 编译系统依赖的某个工具没找到。这个好办,安装一下就是了。

    b). 开源应用程序的某个功能项所依赖的某个开源库没有找到。

    这种问题,有两个解决办法:

    一是移植此开源库,按照前面的方法;

    二是通过 --disable-funcname关闭此功能项,如果确实用不到该功能项的话。

    2. 编译 这就简单了,一般来说,一个make命令搞定 3. 安装 这一步,需要将上述编译出的可执行文件、程序运行需要用到的配置文件、程序运行需要用到的所有动态库文件(无论是工具链自带的库文件,还是我们移植的库文件),都拷贝到单板的根文件系统的相应的目录下就行了。 例如, 库文件拷贝到/usr/lib/目录中。 配置文件拷贝到/etc/下面合适的路径中。 可执行文件拷贝到/bin或/usr/bin等目录中。 这一步,自己写点脚本来完成可能更合适。 因为即使在第1步中,已经指定了安装目录为单板的根文件系统。 make install命令也未必好用,他可能会安装过多的东西(如man手册页等,单板上并不需要),或者某些文件安装的路径未必正确,或者不会安装相应的库文件。

    展开全文
  • 如何移植openwrt系统

    2017-11-04 10:20:00
    系统的安装,不同型号的路由器的安装方法可能也会不一样,但一般常用的有三种方法:   1>Web 上传固件更新   2> TFTP 上传固件更新   3> 编程器写入固件   具体型号的路由器适用于哪种或哪几种方法,需...

    Cisco/Linksys2003年发布了WRT54G这款无线路由器,同年有人发现它的IOS是基于Linux的,然而Linux是基于GPL许可证发布的,按照该许可证Cisco应该把WRT54GIOS的源代码公开。20033月, Cisco迫于公众压力公开了WRT54G的源代码。此后就有了一些基于Cisco源码的第三方路由器固件,OpenWrt就是其中的一个。

    OpenWrt的特点:

    § 可扩展性好,可以在线安装您所需要的功能,目前有1000多个功能包可选;

    § 是一台完整的Linux工作站,文件系统可读可写,便于开发者学习和实践;

    现在有越来越多的Maker开始折腾OpenWrt,但作为一个Maker新手来讲,在网上还是很难找到一份系统的入门级资料。查找资料很辛苦,而且OpenWrt的门槛相对较高,希望这篇文章所提供的从零开始学OpenWrt编译 + 刷机 + 使用教程能降低新手们的入门难度,当然,编译过程非必须,一般的路由都可找到可用的稳定固件直接刷机。


    第一部分:搭建编译环境

    1、安装Ubuntu(编译需要Linux环境),到其官网下载,版本根据自己所需选择即可。可以选择安装到虚拟机或者物理机,图形化安装而且是中文版;

    2、切记不要改动软件源,同时按住Ctrl + Alt + T,调出终端;

    3、逐条输入下列命令(及时验证是否安装成功):

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    sudo apt-get install g++

    sudo apt-get install libncurses5-dev

    sudo apt-get install zlib1g-dev

    sudo apt-get install bison

    sudo apt-get install flex

    sudo apt-get install unzip

    sudo apt-get install autoconf

    sudo apt-get install gawk

    sudo apt-get install make

    sudo apt-get installgettext

    sudo apt-get install gcc

    sudo apt-get install binutils

    sudo apt-get install patch

    sudo apt-get install bzip2

    sudo apt-get install libz-dev

    sudo apt-get install asciidoc

    sudo apt-get install subversion

    sudo apt-get install sphinxsearch

    sudo apt-get install libtool

    sudo apt-get install sphinx-common

          至此编译环境搭建完成。


    第二部分:下载OpenWrt源码并编译

          OpenWrt源码分两种,一种是最新但不是最稳定的Trunk开发版,一种是最稳定的Backfire版,建议下载官方源码。下载前先在本地创建文件夹:

     

    mkdir openwrt

    sudo chmod777 openwrt

    cd openwrt

          选择你想要的版本然后执行下载命令,下载结束会显示版本号:

    Trunk版下载命令:

     

    svn co svn://svn.openwrt.org/openwrt/trunk/

    Backfire版下载命令:

     

    svn co svn://svn.openwrt.org/openwrt/branches/backfire/

    添加软件扩展包,将feeds.conf.default修改为feeds.conf

     

    cp feeds.conf.default feeds.conf

    更新扩展,安装扩展:

     

    ./scripts/feeds update-a

    ./scripts/feeds install-a

    注:如果不是刚下载的源码,为保持代码为最新状态,应定期运行svn update命令更新源码。

    测试编译环境:

     

    make defconfig

    到这里就可以开始编译自己的固件了。进入定制界面:

     

    make menuconfig

    如果一切正常,会出现一个配置菜单,可以选择要编译的固件平台(芯片类型)、型号,还能选择固件中要添加的功能和组件,配置好后保存并退出菜单即可。

    如果你想修改源码,应该在此步进行,如支持大容量Flash之类的修改,自己上网查到修改什么文件什么地方后,就在ubuntu图形界面上进去找到文件,双击打开文本编辑器修改保存。

    开始编译:

     

    make

    或者

     

    make  V=99

    或者

     

    make -j V=99

          make是编译命令,V=99表示输出debug信息,V一定要大写,如果要让CPU全速编译,就加上 -j参数,第一次编译最好不带-j参数。

          编译过程保持联网(会从网上下载一些源码包),所以断网可能造成编译中断,编译所需时间与电脑CPU及网络环境有很大关系,第一次编译时间较久,快则半小时长则23个小时,之后的编译所需时间较短。编译完成后会在源码文件目录出现bin文件夹(如trunk/bin/XXXX),如果你手里的路由是原版固件需要刷OpenWrt需要选用XXX-factory.bin固件,如果路由已经刷了OpenWrt,选用升级固件XXXX-sysupgrade.bin升级用的,在升级界面升级即可。进到文件夹找到你需要的固件传出(通过邮箱、网盘、U盘等),开始刷机吧。


    第三部分:将OpenWrt刷入路由器

          要在路由器上使用OpenWrt,首先要将路由器固件刷新为OpenWrt,即相当于OpenWrt系统的安装,不同型号的路由器的安装方法可能也会不一样,但一般常用的有三种方法:

          1>Web上传固件更新

          2>TFTP上传固件更新

          3>编程器写入固件

          具体型号的路由器适用于哪种或哪几种方法,需自行尝试。


    第四部分:开始使用OpenWrt

          要对OpenWrt进行配置,一般有两条途径:

          1>SSH登录通过命令行控制

          2>Web登录通过Web界面设置

          首次安装OpenWrt后,需要设置密码才可以使用SSH登录,方法是使用telnet登录或者Web登录设置密码。在Windows下面telnetSSH登录可以使用Putty,在LinuxMac下可分别使用如下命令:

     

    ssh –l root 192.168.1.1//Linux

    ssh root@192.168.1.1//Mac

          一般指令与常见Linux发行版相同,但是OpenWrt使用自己的包管理器:opkg,使用“opkg –help”查看帮助信息。以下是一些常用操作命令:

    1

    2

    3

    opkg update //更新软件包列表

    opkg install  //在线安装软件包

    opkg remove  //移除软件包

          登录Web管理界面,前提是该OpenWrt系统中要安装了Web界面,一般是Luci,登录方式与普通路由器无异,打开浏览器,输入路由器IP即可进入登录界面,OpenWrt的默认IP192.168.1.1

          到此,OpenWrt的大门已为你敞开。接下来,开始尝试利用OpenWrt实现更多智能应用吧,比如单号多拨榨取运营商带宽、绑定域名远程控制、挂载大容量硬盘、搭建BT下载机、搭建网络摄像头、Samba/DLNA家庭NAS共享、私有云同步、FTP、个人网站/服务器

    转载于:https://www.cnblogs.com/wanghuaijun/p/7782385.html

    展开全文
  • 如何移植嵌入式系统

    2017-09-29 21:48:43
  • 3、如何学习系统移植 系统移植都是流程化的操作,重点掌握系统移植的流程 动手操作 不要深追代码 4、GNU组织相关命令的扩展(二进制工具) gcc / g++ (重点) gdb (重点) ld (重点) 将.o文件链接生成.elf文件 ...
  • 在此,编者为大家详细讲解鸿蒙HarmonyOS系统移植的具体流程,包括鸿蒙OS Embedded Studio移植工具安装与使用,Hi3516/Hi3518开发板操作系统移植以及对应的应用驱动程序开发。长按扫码立即学习另外,还给大家准备了两...
  • 系统移植-uboot移植

    千次阅读 2016-04-28 23:26:07
    系统移植-uboot移植origen BSP: 安卓是文件系统NTFS fat32–>单文件不超过4giromELF LSB :小段1.交叉开发 在主机上编译程序,生成的可执行的程序必须是arm格式。 通过(file 可执行程序的名字),生成arm...
  • RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本;而对于资源丰富的物联网设备,RT-...
  • 如何在linux系统移植驱动 以下,就把LCD的参数设置的方法说明一下。 首先,参数设置设置的是什么?其实就是LCD屏的工作频率,垂直扫描频率,撗向扫描时间等等参数。这些参数,在LCD屏的手册都会给出。 接下来,如
  • 如何移植Linux系统到FPGA平台

    千次阅读 2017-03-20 13:31:12
    鉴于越来越多使用者将Linux移植到晶心平台(Andes Embedded)上(AndesCore N12或N10),本文的目的在协助使用者快速、有效率的将Linux 移植到自建的FPGA板子上(CPU是AndesCore 的 N12或N10)。笔者曾协助多家公司工程 ...
  • 嵌入式linux系统移植

    2020-07-21 15:47:59
    系统移植的四个点 1、交叉编译环境 2、bootloader功能子系统 (选择和移植) 3、内核核心子系统 (kernel的配置、编译、移植和调试) 4、文件系统子系统 (根文件系统的制作) 学习思路:先整体后局部,层层...
  • 本节主要讲如何在鸿蒙系统中通过移植第3方软件包 paho mqtt去实现MQTT协议功能,最后会给出测试验证。为后续的物联网项目打好基础。 友情预告,本节内容较多,源码也贴出来了,大家最好先看一遍,然后再操作一次。 ...
  • 本课程为uboot学习的第7部分,主要讲解uboot启动内核的...课程中集中讲解了zImage、uImage的区别和联系,do_bootm函数、do_bootm_linux函数的细节分析,目的是让大家对uboot启动内核的技术细节完全掌握,以便后期移植
  • 如何移植开源软件到嵌入式linux系统

    千次阅读 2017-11-08 19:48:55
    在PC机Linux上,安装开源软件,一般如下:tar -xzf open_source_software.tar.gz cd open_source_software ...其实,无论是在PC机Linux上安装开源软件,还是将开源软件移植到嵌入式Linux单板上,其操作过程本质上是完全
  • 鉴于越来越多使用者将Linux移植到晶心平台(Andes Embedded)上(AndesCore N12或N10),本文的目的在协助使用者快速、有效率的将Linux 移植到自建的FPGA板子上(CPU是AndesCore 的 N12或N10)。笔者曾协助多家公司...
  • FreeRTOS系统移植教程

    千次阅读 2018-12-23 17:40:57
     本文主要讲解如何将FreeRTOS实时操作系统移植到STM32单片机中,在本文之前已经基于MDK集成开发环境移植了stm32标准库并新建工程模板,如果您阅读本文之前没有该工程或者相关stm32工程,您可以参考...
  • Android系统移植与调试之-------)如何修改Android系统默认显示 2015-11-16 0 个评论  来源:一个人,如果你不逼自己一把,你根本不知道自己有多优秀!  收藏 我要投稿   1、首先解决【设置】界面...
  • 如何移植开源软件到嵌入式Linux系统

    千次阅读 2014-11-29 11:03:23
    linux嵌入式移植交叉编译 我们知道,在PC机Linux上,安装开源软件,一般来讲,大多是如下几个步骤就搞定了。 tar -xzf open_source_software.tar.gz cd open_source_software ./configure make make ...
  • 最近要将自己的程序兼容64位系统,本来以为是个大工程,可是查阅了相关资料后发现这个其实不难。因为,一般的32位程序都可以运行在64位系统(当然是一般情况),这个主要是因为64位系统已经考虑到了这种过渡情况。 ...
  • Qt应用如何移植到Windows CE系统

    千次阅读 2015-11-17 22:30:49
    在刚学习Qt时,一直以为Qt良好的跨平台移植性会成为很火的编程语言,可是随着诺基亚的衰落发现自己错了,而且它的移植性也没有想象中的那么好,要不是毕业设计需要用到,本人早已放弃,下面我将一个多月时间查阅各种...
  •  针对Linux系统而言,由于GNU(GNU是一种自由软件体系)套件支持大量的处理器,GNU编译器gcc在设计时就已经考虑跨平台的问题,所以在进行goo移植时可以不考虑前端高级语言解析的部分(即针对C语言等解析的过程),...
  • 如何移植sg3_utils到andriod系统

    千次阅读 2017-12-13 00:21:34
    sg3_utils包含各种可以从用户空间发命令到scsi设备, 这篇文章主要告诉大家如何移植sg3_utils到ARM平台上。 之前我们主要用sg3_utils是在台式机或者直接复制它到目标机上去编译, 但对于大多数嵌入式设备来说, 我们...
  • linux查看内核版本和发行版本号: ...华为开源镜像网站:含有不同...ARM平台上移植Ubuntu14.04系统: https://blog.csdn.net/zpcindy/article/details/79983835 定制适用于ARM平台的Ubuntu rootfs(根文件系统): https://blo

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,381
精华内容 952
关键字:

如何系统移植