
程序的编译\链接\下载,及Makefile\bootloader相关
发布日期:2021-05-15 01:18:27
浏览次数:14
分类:精选文章
本文共 1682 字,大约阅读时间需要 5 分钟。
技术文档 - 系统开发流程与组件说明
一、开发环境配置
- 编译工具:使用
arm-linux-gcc
工具链,支持 ARM 系统编译。 - 目标文件生成:
- 目标文件
xxx.o
包含源文件xxx.c
与xxx.S
的编译生成。 - 通过
arm-linux-ld
链接生成可执行文件xxx.elf
。 - 使用
arm-linux-objcopy
工具生成最终的二进制文件xxx.bin
。
- 目标文件
二、Makefile 工作流程
- 依赖管理:
- targets: 指定需要执行的目标。
- 可进行依赖文件的递归处理(通过
$^
)。 - Glob 模式支持匹配特定文件(如
*.x
)。
- 赋值符号:支持
=
,:=
,+=
等赋值方式,延迟生效控制。
三、bootloader(U-Boot)配置
-
最初职责:读取存储设备(如 Flash),初始化硬件。
-
功能分解:
- 读取内核文件并写入 SDRAM。
- 初始化时钟、定界器和外设。
- 启动目标内核。
-
编译步骤:
- 解压源包。
- 打补丁修复代码。
- 根据硬件配置编译firmware。
- 使用工具(如
fw-util
)烧录到开发板 Flash 中。
四、内核启动流程
-
内核功能:管理应用程序运行(如 BusyBox)。
-
启动流程:
- 初始化设备节点(如
dev/console
)。 - 执行
/etc/init/rcS
初始化脚本。 - 启动根文件系统(initrd)。
- 根据配置文件启动指定应用程序(如
/etc/inittab
)。 -
内核配置选项:
- 使用
make menuconfig
手动配置。 - 或通过查找
*.defconfig
运行make xxx.defconfig
。
- 使用
五、根文件系统优化
-
最小化根目录:
- 设定设备节点 (
dev/console
,dev/none
)。 - 必要脚本和应用程序 (
init
,busybox
)。 3..vs如果是启动只需最小化配置。 -
udev自动化:
- 安装
mdev.txt
工具。 - 挿添加
/sysmount
。 - 修改
etc/fstab
和初始化脚本。
六、网络文件系统(NFS)
-
挂载方式:
- 从服务器启动根文件系统。
- 使用内核参数配置
nfsroot
]])
示例:
set bootargs noinitrd root=/dev/nfs nfsroot=IP:src_path(ip=IP)
七、应用驱动实现
-
驱动开发流程:
- 编写驱动文件,使用
asm
汇编实现硬件交互。 - 生成
.ko
模块文件并注入内核。 - 使用
/etc/init.d/rcS
autoload 模块。 -
驱动功能:
- 提供文件操作接口:
open
:初始化设备节点。write
:驱动硬件控制(如 点灯效果)。
- 模块注册与释放:
static int __init first_drv_init(void) { // 注册字符型设备 // 参数映射与硬件初始化 return 0;}
-
应用测试示例:
#include
#include // ...其余 header 加载int main(int argc, char **argv) { int fd, val = 1; fd = open("/dev/xyzy", O_RDWR); if (fd < 0) { printf("无法打开设备\n"); } // 根据参数执行操作(on/off) // 传输数据到驱动函数处理 return 0;}
八、字符设备驱动开发
- 驱动代码要点:
- 启用
asm
操作,确保内核对应架构支持。 - 使用
ioremap
实现外设访问。 - 注册设备节点及文件操作接口。
- 高效处理用户空间与内核空间数据。
九、开发流程总结
-
开发阶段:
- 需求分析与功能设计。
- 应用层与驱动层实现分离。
- 配置测试环境,验证每一步正确性。
-
优化建议:
- 采用模块化开发,方便维护。
- 做好错误处理与调试准备。
- 饱合开发工具文档,提升效率。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月02日 20时57分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
GRUB2
2019-03-11
微信JS-SDK DEMO页面和示例代码
2019-03-11
GridView自定义删除操作
2019-03-11
一张图搞定RPC框架核心原理
2019-03-11
Scala中的包
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11
获取linux 主机cpu类型
2019-03-11
Android Studio updating indices 一直刷新和闪烁
2019-03-11
pwntools编写技巧
2019-03-11
How2Heap笔记(三)
2019-03-11
layer.confirm 无效
2019-03-11
pycharm使用(新建工程、字体修改、调试)
2019-03-11
Python学习笔记——元组
2019-03-11
异常声音检测
2019-03-11
无法打开文件“opencv_world330d.lib”的解决办法
2019-03-11
算法训练 未名湖边的烦恼(递归,递推)
2019-03-11
什么是接口
2019-03-11