ARM学习笔记012之mini2440上电的启动和初始化程序分析(即Bootloader分析)

嵌入式系统中的boot Loader 的实现完全依赖于CPU 的体系结构,因此大多数Boot
Loader 都分为第一阶段和第二阶段两大部分,依赖于CPU 体系结构的代码,比如设备初始
化代码等,通常都放在阶段1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而阶段2 则通常用C 语言来实现,这样可以实现一些复杂的功能,而且代码会具有更好的

可读性和可移植性。

第一阶段包括:

(1)硬件设备的初始化

①初始化GPIO 功能

②设置CPU的速度和时钟频率

③存储控制单元初始化

(2)拷贝Bootloader的程序到RAM空间中

(3)设置好堆栈

(4)跳转到阶段2的C人口地址


第二阶段包括:

(1)初始化本阶段要使用到的硬件设备;

①初始化至少一个串口

②初始化计时器(定时器)

③初始化网络传输等

(2)系统内存映射(memory map);

(3)将kernel 映像和根文件系统映像从Flash 读到RAM 空间中;

即加载内核映象和根文件系统映象

(4)为内核设置启动参数;

(5)调用内核。


详见我的360网盘文件《实验三 Bootloader实验》pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux的启动初始化程序通常由两个部分组成:引导程序bootloader)和初始化程序(init)。 引导程序是在计算机开机时最先执行的程序,主要负责加载操作系统内核和初始化系统环境。常见的Linux引导程序有GRUB和LILO。 初始化程序是Linux系统中第一个用户空间进程,它负责启动系统中的其他进程和服务,并建立用户环境。常见的Linux初始化程序有SysVinit和systemd。 下面是一个简单的初始化程序的示例: ``` #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { pid_t pid; pid = fork(); // 创建子进程 if (pid < 0) { printf("fork error\n"); return -1; } else if (pid == 0) { // 子进程执行的代码 printf("child process\n"); // 启动其他服务和进程 execl("/bin/bash", "/bin/bash", NULL); } else { // 父进程执行的代码 printf("parent process\n"); // 等待子进程结束 waitpid(pid, NULL, 0); } return 0; } ``` 这个程序使用fork()系统调用创建一个子进程,并使用execl()系统调用启动其他进程和服务。在父进程中,使用waitpid()系统调用等待子进程结束。 需要注意的是,初始化程序的编写需要考虑系统的安全性和稳定性,需要遵循一些规范和最佳实践,例如使用权限控制、错误处理、日志记录等。同时,不同的Linux发行版可能有不同的初始化程序启动脚本,需要根据实际情况进行相应的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉尼拔勇闯天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值