2017年5月31日
简要:
主要涉及了, 在Ubuntu为PC的主系统时的一些烧写U-boot, 和kernel的注意事项;
主要内容:
烧写U-boot:
- 由于老版的U-boot对最新版的arm-linux-gcc支持不好所以, 编译时, 应该使用旧版的arm-linux-gcc支持不好所以, 编译时, 应该使用旧版的arm-linux-gcc。
- 编译的操作过程:
- 将U-boot压缩文件和对应的补丁文件复制到自己的工作目录下
- 解压U-boot, 命令: tar -xjf filename
- 进入解压后的U-boot目录, 并打补丁。命令: cd filename; patch -p1 < ../filenameofpatch
- 根据自己开发板的芯片不同的, 调用相关配置文件进行配置。命令: (以s3c2440为例) make 100ask24x0_config
- 修改顶层Makefile: (空白处添加)
- ARCH = arm
- CROSS_COMPILE = arm-linux-
- 开始编译。命令: make
- 烧写时, 可以参考裸机烧写方式: sudo oflash 0 1 0 0 0 u-boot.bin
烧写kernel:
- 注意: kernel的编译过程有三点:
- make menuconfig 时终端尽量全屏;
- 目测好像编译只能在32位Ubuntu上才能操作成功;
- 一定要安装 ncurses程序库, 不然最后make menuconfig 会出现错误;
- 配置方式有三:
- 直接make menuconfig,然后自己一项一项进行配置
. 在kernel的默认配置里找到与自己芯片最接近或者自己的芯片的默认配置
- 默认配置在 ./arch/arm/config 目录之下
- 命令:
make s3c2410_defconfig (以三星s3c2440为例) make menuconfig
- 使用厂家提供的配置文件, 并将厂家的配置文件更名为 .config(ps:文件一定放置在kernel的根目录下)
make menuconfig
- 编译时的注意事项:
- 由于kernel的版本过低, 与现版本的make不兼容, 所以会出现如下错误:
Makefile:416: *** mixed implicit and normal rules: deprecated syntax
Makefile:1449: *** mixed implicit and normal rules: deprecated syntax
make: *** No rule to make target 'menuconfig'. Stop.
解决方法:打开Makefile, 修改对应行: 416: config %config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@ 修改为: %config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@ 1449: / %/: prepare scripts FORCE $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ $(build)=$(build-dir) 修改为: %/: prepare scripts FORCE $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ $(build)=$(build-dir)
- 最后编译: make uImage (生成的uImage在 arch/arm/boot/uImage)
- 烧录操作: 烧录方式, 是在有U-boot的情况下通过tftp烧录
- 对于tftp的相关配置, 参考: http://www.linuxidc.com/Linux/2016-07/133255.htm
- 对于板子和PC机的连接:
- 连三条线: USB, COM, 网线,
- 设置电脑以太网静态ip, 网关, 掩码(参考相关教程)
- 通过板子 ping 电脑的静态ip 检验是否链接。(前提时修改U-boot环境变量中的serverip为电脑静态ip)
- 设置虚拟机为桥接模式, 同时选择复制物理网络连接状态, 编辑->虚拟网络编辑器->更改设置->还原默认设置->Vment0桥接模式->选择网卡;
- 选择有线网卡, 无法上网, 但可以和板子通信, 无法与主机通信;
- 选择无线网卡, 可以上网, 无法与板子通信, 可以与主机通信;
- 将uImage复制到tftpboot目录下
在板子U-boot中执行:tftp 30000000 uImage (下载 kernel) nand erase kernel (擦除分区) nand write.jffs2 30000000 kernel (烧写kernel)
文件系统
tftp:
tftp 30000000 filename.yaffs2
nand erase root
nand write.yaffs 30000000 0x00260000 $(filesize)
OR:
tftp 30000000 filename.jffs2
nand erase root
nand write.jffs2 30000000 0x00260000 $(filesize)
完成后 reboot || 重新上电
完成!!
补充说明
2017年10月31日
编译器选项(arm-linux-gcc)
1. 总体选项
- -c:
预处理, 编译和汇编源文件。不作连接, 生成OBJ文件。 - -S:
编译后停止, 输出非汇编语言文件对应的汇编语言文件。 - -E:
预处理后停止, 并且将代码送往标准输出; - -o file:
指定输出文件为file; - -v:
显示制作GCC工具自身时的配置命令; 还有一系列相关的版本号;
2. 警告选项 (-Wall)
打开所有需要注意的警告信息。
3. 调试选项 (-g)
以操作系统的本地格式产生调试信息;
4. 优化选项
- -O或-O1:
一级优化, 减少目标码大小和执行时间; - -O2
进一步优化, 执行几乎所有优化操作; - -O3
优化更多, 比-O2多打开了"-finline-functions" - -O0;
不优化; - 多个-O选项, 生效最后一个;
5. 连接器选项
- object-file-name:
没有格式说明的文件, 默认为OBJ文件或库文件。 - -library:
连接名为library的库文件; -L指定库文件路径。
(以下两个选项多用于编译bootloader, 和内核)
-nostartfiles:
不连接系统标准启动文件;-nostdlib:
不连接系统标准启动文件和标准库文件。-static
在支持动态连接的系统阻止连接共享库;-shared
生成共享OBJ文件;
生成静态库:
ar rcs libsource.a source.o
生成动态库:
gcc -shared -fPIC -o libsource.so source.o
补充说明
2017-11-06
- linux内核编译时, 若想生成uImage(内核文件的'头')。需要有mkimage命令:
安装命令:
sudo apt-get install u-boot-tool