1.系统启动流程。
uboot -> kernel -> 根文件系统。
uboot第一阶段属于汇编阶段:
定义入口(start.S):uboot中因为有汇编阶段参与,因此不能直接找main.c。
设置异常向量:当硬件发生故障的时候CPU会强制PC指针指向对应的异常入口执行代码。
设置CPU为SVC模式(设置CPU速度、时钟频率和中断控制寄存器)。
初始化内存控制器(MMU),实现虚拟地址到物理地址的映射。
跳转到lowlevel_init函数,关看门狗,供电锁存,时钟初始化。
初始化堆栈,DDR。
uboot第二阶段属于C语言阶段:
uboot的第二阶段就是要初始化剩下的还没被初始化的硬件。主要是SoC外部硬件(譬如iNand、网卡芯片····)、uboot本身的一些东西(uboot的命令、环境变量等····)。
调用一系列的初始化函数:init_sequence里的init函数是一个函数指针数组,数组中存储了很多个函数指针,会去调用其他初始化函数。
cpu_init(CPU内部的初始化),board_init(x210开发板相关的初始化),interrupt_init(初始化定时器),env_init(环境变量有关的初始化),
init_baudrate(初始化串口通信的波特率),serial_init(初始化串口),display_banner(用来串口输出显示uboot的信息)。
uboot启动内核:
启动内核第一步:加载内核到DDR中,boot只需要从SD卡的kernel分区去读取内核镜像到DDR中即可。
启动内核第二步:校验内核格式(zImage格式,uImage格式)。
启动内核第三步:内核传参。
内核启动过程:
内核启动的汇编阶段:
__lookup_processor_type:读取出硬件的CPU ID号,__lookup_machine_type:本函数校验的是机器码,
__vet_atags:用来校验uboot通过tag给内核传的参数。
内核启动C语言阶段:
lockdep_init:锁定依赖,是一个内核调试模块,处理内核自旋锁死锁问题相关的。
boot_init_stack_canary:用来防止栈溢出。
cgroup_init_early:control group,内核提供的一种来处理进程组的技术。
local_irq_disable:屏蔽当前CPU上的所有中断。
lock_kernel:获得大内核锁,该锁可以用来锁定整个内核。
page_address_init:函数初始化高端内存页表池的链表。
打印内核版本信息。
最后会执行init进程,init进程刚开始运行的时候是内核态,然后他自己运行了一个用户态下面的程序后把自己强行转成了用户态。
init进程会去挂载根文件系统,打开控制台,访问一个设备,就要去打开这个设备对应的文件描述符。譬如/dev/fb0这个设备文件就代表LCD显示器设备。
根文件系统:
根文件系统是特殊用途的文件系统,文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问.
2.什么是进程,什么是线程?
进程是系统中正在运行的一个程序,程序一旦运行就是进程,进程可以看成程序执行的一个实例。
线程是CPU独立运行和独立调度的基本单位,一个进程可以拥有多个线程,线程是进程的一个实体,是进程的一条执行路径。
3.进程和线程之间的区别是什么
因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,系统开销比较大。
而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进
程快,效率高。
通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于
共享数据段所以通信机制很方便。
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/271455.html