一、关于init进程
系统某些程序退出的时候是可以将它重启的;
它可以产生新的进程;
它是由内核启动的;
它的进程号是1;
它是所有进程的祖先。
二、Linux系统启动流程
我们在PC上启动Windows 系统时,都知道有个东西叫BIOS(基本输入输出系统),我们Linux下也有个类似的东西,叫做U-Boot,其功能和BIOS类似,检查CPU、内存、硬盘、鼠标等设备有没有准备好,这一检查过程叫做POST,检查完后,就会去HDD(硬盘)、SDD、USB等地方寻找系统启动了。
那做嵌入式开发的时候,系统的启动流程又是怎么样的呢?
其实和Windows的情况类似,不过它的系统是放到Nandflash里面的,所有的程序都应该是放到内存中去的,启动系统之前也要做一些相应的初始化,这就需要一个启动程序Boatloader,常见的Boatloader是U-boot。
SRAM是由晶体管组成的,不用初始化,速度高,但是价格贵,面积大,一般用cache中,DRAM的话用电容充放电,用的话,CPU上有DRAM控制器才能用DRAM,DRAM控制器里面都是寄存器。
SDRAM和DDRAM又有什么区别呢?
这里以A5核的处理器为例
它其实有三级的boatloader的,它不止U-boot这个程序
第一级:RomBOOT,它是出厂固化到CPU内部的,ROM为只读存储器的意思。
第二级:为Bootstrap,其在CPU的SRAM进行运行引导,然后初始化SDRAM。
第三级:U-boot,初始化SDRAM完成后,就可以将U-boot程序搬移到SDRAM运行启动了。
不过前两级我们可以屏蔽不做考虑。
启动U-boot
关于U-boot的命令
敲boot命令启动系统
我在做4G模块的项目用的就是树莓派Linux内核的协议栈
所以Linux内核就是提供这些基础的驱动
这就是Linux内核启动的流程了,在最后,我们可以看到内核创建的第一个进程为init进程,这也是为什么init进程为所有进程的祖先的 缘故。
在用户应用程序里面,可以使用fork()函数创建子线程,可以使用exec系列的函数执行程序。
在用户应用程序,如果使用了一个野指针,会出现段错误,进程退出。
而在内核驱动使用了野指针,就会出现Kernel panic的情况,内核死掉,上层应用程序就跑不了了。