1 Linux 分层概念
1)内核:Linux 启动首先启动内核,管理硬件,使能CPU,内存空间,硬盘接口,USB接口,网络接口等,应用所有的指令都需要通过内核传送给外设硬件,实现功能。
2)系统调用:Linux将内核功能接口设计为系统调用(system call),应用程序可以进行调用,这种系统调用大概200多个。
3) 用户空间:用户应用程序。
4)Linux定义库函数将系统调用组合某些常用的功能。
5)Shell:充当用户界面,可以通过系统调用,和内存通讯。
区分内核和用户空间原因:
1) 应用程序的移植性。
2) 保护内核,
3) 两个空间的切换条件:系统调用和硬件中断。
2 内核部分详解
内核是 *** 作系统的核心,主要负责管理系统的进程,内存,设备驱动,虚拟系统文件,网络系统,决定着系统的性能和稳定性。
1 进程调度;2 进程间通信;3 内存管理;4 虚拟文件系统;5 网络接口。
Linux 系统移植组成部分:
1) 搭建交叉开发环境
在PC机开发出能够在目标机(开发板)上运行的程序。
原因是1 嵌入式系统的硬件资源不是很丰富,入CPU的主频低内存容量小,PC机的CPU快,硬件资源多,开发效率高;2 嵌入式系统的MCU体系结构和指令集不同。
2) BootLoader的选择和移植‘
BootLoader在 *** 作系统运行之前运行的程序,初始化硬件设备,建立内存空间的映射图,将系统的软件和硬件准备好,为最终的调用 *** 作系统内核做准备好正确的环境。
SRAM上电可以运行,内存(SDRAM)需要初始化才能够工作,所以BootLoader需要对内存进行初始化,并且把内核搬到内存中。
BootLoader分类:
以Uboot为列,介绍如下:
1) 源码开放
2) 支持多种 *** 作系统,如linux,QNX,NetBSD,VxWorks,RTEMS,ARTOS,LynxOS
3) 支持多种处理器架构,如PowerPC,ARM,X86,MIPS,XScale
4) 高度灵活的功能设置
5) 丰富的设备驱动源码
6) 较高的可靠性和稳定性
Uboot的启动过程:
BootLoader分为stage1 和stage2 两部分,Stage1部分主要是依赖于CPU体系结构的代码,可以用汇编实现;Stage2 部分用C语言实现,实现复杂的功能,具有更好的可读性和移植性。
Stage1 代码通常放在start.s文件中。
- 定义入口,由于一个可执行的image文件必须有一个入口点,只能有一个全局入口,通常是ROM的0x0地址,编译器必须知道该入口,可以通过修改连接器的脚本完成。
- 设置异常向量。
- 设置CPU的速度,时钟频率,中断控制寄存器。
- 初始化内存控制器。
- 将rom中的代码复制到ram中。
- 初始化堆栈。
- 转到ram中执行,可以用指令ldrpc实现。
Stage2 ib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。
- 调用一系列的初始化函数。
- 初始化flash设备。
- 初始化系统内存分配函数。
- 初始化nand设备,显示设备,网络设备。
- 进入命令循环(整个boot的工作循环),接受用户输入的命令,执行对应的工作。
3 Kernel的配置,编译,移植
- 下载内核并拷贝到指定目录
- 修改顶层的Makefile文件,主要修改平台的体系架构和交叉编译器
- 拷贝标准版的配置文件,目的是得到我们开发板的配置信息,就是把相应平台的——deconfig直接拷贝到顶层的config文件中,config文件中记录了移植平台的平台信息,系统会选择对应的相关代码和模块,然后保存配置信息,系统会把所以的配置信息保存在顶层的config文件中。
- 配置内核,在Kconfig和Makefile 的文件进行配置。
- 编译内核,编译是静态编译,会根据config文件选择源代码进行编译。
- 通过tftp网络服务下载测试内核。
4 文件系统概念
1)文件系统是内核一部分,主要实现系统的存储介质和其他的资源交互,嵌入式 *** 作系统分为uboot,kernel,文件系统。BootLoader的加载了内核,内核启动,加载文件系统,表示整个linux系统启动。Linux 启动时,第一个挂载必须是根文件系统,成功之后才能手动或自动的挂在其他的文件系统,挂在文件系统时,需要有文件系统的类型,文件系统本身以及挂载点。
2)根文件系统目录:
- bin目录:存放用户基本命令,必须和根文件系统在一个分区,在挂在其他的文件系统之前已经可以使用。
- sbin目录:存放系统命令,主要用于存放基本的系统命令,用于启动和修复系统等,必须和根文件系统相同分区,在挂在其他文件系统之前已经可以使用。
- dev目录:存放设备文件,以文件的形式访问各种设备,读写 *** 作,类似于外设驱动。
- etc目录:存放各种配置文件,目录文件是可选的,依赖于系统中所拥有的应用程序是否需要配置文件,这部分可以裁剪。
- lib目录:存放共享库和可加载驱动程序,共享库用于启动系统。
- home目录:用户目录,可选,存放用户的相关配置文件。
- root目录:根用户目录。
- usr目录:该目录内容可以存放在另外一个分区,系统启动之后可以再挂接到该目录下。里面存放的是共享,只读的程序和数据。
- var目录:与usr目录相反,存放可变的数据,如spool目录,log文件,临时文件。
- Proc目录:空目录,可作为proc文件系统的挂接点,proc文件系统是虚拟的文件系统,没有实际的存储设备,里面的目录,文件都是由内核临时生成的,表示系统的状态,也可以 *** 作其中的文件控制系统。
- Mnt目录:用于临时挂在某个文件系统的挂接点,一般是空目录,也可创建子目录,临时挂在光盘或硬盘。
- Tmp目录:存放临时文件,并且可以访问。
可以使用Busybox制作文件系统,创建上面的目录以及目录下面的文件。
主流的文件系统格式:Ext2,Ext3,JFS,XFS,VFAT等。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)