我对linux是一窍不通的,最近在搞开发板的时候也无从下手了,所以只能上网充充电,大部分都太泛泛了,现在我对linux的认识上仅仅只停留在烧写别人的代码程序的,裸奔的话基本和ARM7无异多少,这是一项浩大的工程。也许得许多年,也许根本继续不下去,不管了。
linux分为几个部分: 1. bootloader 2.内核 3,文件系统。4。应用程序
bootloader ARM7也有的,我看来就是初始化和加载MAIN函数的入口,个人认为属于系统级别,一般都有厂家提供的文件支撑,很少用户敢于,无论是怎么写怎么搞最后都会加载 _main () ,然后开始执行用户代码,其中还可能执行某些系统的HOOK 用来初始化系统时钟。我一般的用法是屏蔽系统HOOK,然后自己偷偷的换上哈哈,但是注意的是BOOT都不一样,不同的硬件BOOT都不同,所以先下手boot至于内核和文件系统,引用程序,这些都留到后面搞,先从头开始,头就是bootloder :
第一:大概
首先嵌入式不是PC系统,无BIOS引导。而仅仅是启动代码启动内核。也就是上电后首先调到启动代码执行,而后者才会启动内核运行操作系统,他负责初始化硬件设备,和资源分配地址映射。
第二:位置
他存在于flashz之上的,他是编译系统编译完毕存入存储器然后板子加载之,但是我们看到开发板其实可以从NNAD 和NOR分别启动,就是这个道理他的启动加载地址可以从nand 或者NOR了 ,同理也应证硬件的初始化代码加载是两个入口。选一的,
第三:交互
开发板和PC之间主要依赖于USART来通讯。所以我们看到开发板都是用串口打印的信息。
第四: 模式
开发板的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。Boot Loader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口 。这也应征了这个boot里面几乎是用到了很多的硬件的驱动的,这部分驱动并不是内核管理的,因为此时内核还没启动呢,而是类似单片机驱动程序吧。所以这个也是需要单独编译的。比较复杂。好在有一些现成程序可用。
bootloder 分2段第一段ASM完成第二段 C语言完成。
第一阶段:
硬件设备初始化。
为加载 Boot Loader 的 stage2 准备 RAM 空间。
拷贝 Boot Loader 的 stage2 到 RAM 空间中。
设置好堆栈。
跳转到 stage2 的 C 入口点。第二阶段:
初始化本阶段要使用到的硬件设备。
检测系统内存映射(memory map)。
将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。
为内核设置启动参数。
调用内核。 每一个阶段的代码都是神一样的惊人。但是总归揭底,最后都是一样的,永不反回,加载操作系统后。这个和RTOS是一样的本质应该都差不多,只是手段狠了许多。 |