Boot模块
1.Early Console解决了在内核启动最早期,内存和中断等模块还没有初始化时怎么打印调试信息的问题。AArch64架构直接往寄存器里写信息(通过基地址加上Write寄存器偏移量)。

2.串口驱动:正式的硬件设备怎么被内核发现,匹配和初始化

在系统初始化的时候要把非常必要的驱动(字符设备,块/网络设备,用于串口收发字符,磁盘读写,网络收发)注册一下,对于键盘,鼠标,显示屏这种对于内核不是很重要,但是后边也走这条驱动注册的流程。

驱动注册的流程:注册-->匹配-->Probe-->使用

注册:写入驱动的名字和match(检验设备是否能被驱动)/Probe(驱动初始化函数)/remove(驱动卸载函数)

匹配:先检验compatible 列表字符串,然后运行match(地址无效,资源被占用,寄存器大小不够都会检验失败)进行二次检验(比如设备已经被),检验是否能被驱动

Probe:匹配成功之后,驱动初始化(映射寄存器地址,修改设备状态)

使用:驱动注册成功,并且初始化之后,直接拿到驱动就可以调用它的函数

注意:驱动是“我能驱动什么类型”,compatible 列表里面就是“我能驱动的类型”,所以驱动和设备是一对多的关系,一个驱动能驱动多个设备。但是同一时间只能有一个设备实例。

3.设备树解析(FDT):设备树上记录了有那些硬件,以及硬件的信息和地址。匹配驱动的时候就可以用到

4.ELF(可执行于可链接格式):动态链接,运行时链接器通过符号表查找对应的函数,符号表就是(符号名-->地址的映射,不只由函数还有全局变量),优点是可执行文件的体积小,容易更新,如果其中的某个文件修改了,只需要重新编译文件,然后重启程序(重启程序符号表自动更新)。

栈回溯能通过( 地址→名字)打印出"函数的调用路径"(调用链)。

Interrupter模块

分为异常和中断,中断分为软件中断和硬件中断,中断发生时cpu压栈保存现场,处理中断,恢复栈信息。

举例说明:

异常:由程序内部发生的,比如我们程序里面执行write就会发生异常,内核去处理写的操作

软件中断:核间通信(核1给核2发送一个通知,需要核2处理任务,核2停下手头工作去处理任务)

硬件中断:分为时钟中断,外部中断(外部设备,如键盘鼠标)

时钟中断:每次系统tick之后发生时钟中断

        1.处理某些进程是否需要唤醒,

        2.时间+1(系统时钟)

        3.扣当前任务片时间(每个任务开始的时候都会给分配一个任务片时间,防止一个任务一直占用cpu)

        4.问调度器是否需要更换任务(任务是一个能上cpu得执行流,不光有进程和线程和)

中断控制器:

1.将大量的中断按优先级排列,优先处理重要的中断(中断仲裁)。

2.将中断处理,路由给cpu进行处理

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐