一、 内核开发与逻辑开发对比
内核开发:
需要应用程序调用API去在操作系统里对硬件进行操作。操作系统不允许用户直接去通过置GPIO口1或者0去控制硬件,为了管理这一切。操作系统将整个开发中分成了两个空间,一个是用户空间(上两层),一个是内核空间。
裸机开发:
应用可以直接去控制硬件,32单片机只需要去将对应引脚置0或者1就可以点灯。
经过对比,二者最大的区别在于内核是操作系统最核心的部分,而32单片机这种是不跑操作系统的。最直观的体现就是Linux可以跑多进程、线程的程序,同时运行多个程序。而32单片机如果不加Freertos是不能同时跑多个程序的。
二、什么是Linux内核(kernel)?----这里指uImage文件
上面说到区别,那么Linux为什么可以跑多个进程、并且可以对文件、内存等进行管理?由此提到Linux内核,Linux内核对于操作系统而言属于发动机。内核(kernel)是操作系统最基本、最核心的部分。
内核其本质上是一个复杂的程序,主要用于以下几点:
-
文件管理
-
进程管理
-
内存管理
-
网络管理
-
设备管理
内核对于用户是不可见的,所以在层面上分为了内核态和用户态。
内核态与用户态的几条公理:
-
用户态不能直接操作硬件
-
只有内核态才能对硬件进行操作管理
用户要想操纵硬件必须要通过用户态去调用内核态,由内核去完成对硬件的操作。而内核怎么去操纵不同的硬件呢?就需要驱动程序来操纵硬件,下面是对于用户态和内核态的图示说明
三、Linux启动流程
3.1 bootloader---------》uboot
bootloader是(一个裸机程序)为内核准备运行 环境并引导内核启动
3.1.1 bootloader的作用
初始化CPU(工作模式)初始化异常向量表初始化栈初始化时钟关闭看门狗关闭Cache关闭MMU关闭中断初始化内存初始化相关外设(flash, 网卡, 串口, led, lcd)集成相关的协议搬移内核到内存向内核传参(根文件系统类型、位置、ip、终端控制台,指定init进程)启动内核 --- 从此bootloader不再控制CPU,CPU的控制权彻底移交给内核
3.1.2 uboot
uboot是什么?
是bootloader的一种,uboot的一切都是为了启动内核
Linux系统要启动就必须需要一个bootloader程序(裸机程序),也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux镜像从flash(NAND,NOR FLASH,SD,EMMC等)拷贝到DDR中,最后启动Linux 内核。当然了,bootloader的实际工作要复杂的多,但是它最主要的工作就是启动Linux内核, bootloader和Linux内核的关系就跟PC上的BIOS和Windows的关系一样, bootloader就相当于BIOS。所以我们要先搞定bootloader,很庆幸,有很多现成的bootloader软件可以使用,比如U-Boot、 vivi、RedBoot等,其中以U-Boot使用最为广泛。
因为Linux镜像是存在Flash里面,要想运行Linux系统需要一定的RAM,芯片内部RAM一般没有辣么大所以就需要DDR,bootloader就是需要准备Linux运行条件,譬如初始化DDR,然后再从Flash中读取到DDR中运行Linux系统。Uboot的主要目的就是为系统的启动做准备。
Uboot不仅仅能启动 Linux,也可以启动其他系统,比如 vxworks。Linux不仅仅能通过uboot启动,还可以用其他bootloader启动。Uboot是个通用的bootloader,他支持多种架构。
四、总结
启动流程还有两步:配置内核与加载跟文件系统没有说,因为在操作上是一起的。
uboot做好一切准备后,启动内核程序,这时可以在uboot中配置板子的基础环境变量(用于配置网络IP连接为tftp下载程序做铺垫、挂载系统文件),在配置好环境变量后,使用tftp将内核kernel下载到板子上,我这里用的内核名叫uImage。最后启动内核。
后面可以在内核中修改内容以及写驱动:内核是一堆程序,里面包含了各种配置的.c文件,然后使用makefile生成一个名叫uImage可执行文件,所谓的编译内核,就是修改里面的.c文件,然后生成的可执行文件烧录到板子里面。
操作系统就是一个巨大的程序,内核是里面程序的一部分,不过内核这部分程序是最核心的,写在上面的属于应用层程序。
可以将内核比作表演的舞台,应用层程序是在舞台上面表演的人,操作系统是整体。内核为应用层准备基础场地,应用层自由发挥。所以:操作系统就是一个“舞台班子”。。。