Linux引导主要分为如下几个流程:
一、第一阶段
1、处理器进入管理模式,禁止中断,,读取CPU的id。
2、调用函数,通过枚举结构体,判断是否有与当前CPU的相同的结构体,确定内核是否支持当前CPU和当前机器。
3、调用start_kernel()函数进入下一阶段。
二、第二阶段
1、获得处理器和开发板的结构体。
2、确定bootloader传入的启动参数地址。对于S3C2440中,该地址为0x30000000+0x100,即0x30000100。
3、tag信息处理,命令行处理。
4、重新初始化页表。配置io,时钟,串口。
5、注册控制台,将串口结构链入全局链表中。
至此,内核引导完毕。
后续可进行对MTD分区的修改以及YAFFS文件系统的移植。
Linux启动后运行的第一个进程init:内核首先打开标准输入输出,启动某些execute_command变量指定要运行的程序。然后依次进行/sbin/init、etc/init等程序。
Linux中驱动移植,中断配置:主要是通过对Linux中的某些结构体进行填充,该结构体中包含函数指针,以完成特定的功能。添加相应的文件,添加到makeflie中,即可编译到内核中去,成为内核的模块。内核通过加载模块的形式实现对硬件的驱动。
GUI的移植、根文件的搭建和移植:主要是在主机根据开发板架构进行修改,编译,最后以yaffs文件系统的形式进行烧写到开发板中。
Linux内核调试:
1、内核打印函数printk,可根据级别进行输出;
2、KGDB,源码级别的内核调试机器。需要主机和目标机,通过串口线相连。要调试的内核需要增加KGDB功能,它在目标机上运行,GDB在主机上运行,串口线被GDB用来和内核进行通信。先给内核打上KGDB补丁,重新烧写内核。
3、可视化图形前端DDD。
Scratchbox:用于构建Linux软件和整个Linux发行版的配置和编译环境。 Scratchbox的基本思想是为开发人员提供一个在目标环境可用之前可以正常工作并看起来像目标环境的环境。