# OneOS-Kernel **Repository Path**: hbqs/oneos-kernel ## Basic Information - **Project Name**: OneOS-Kernel - **Description**: OneOS-Kernel是可抢占式的实时的轻量级内核,作为OneOS-Lite的子模块submodule嵌入其中https://gitee.com/cmcc-oneos/OneOS-Lite。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/cmcc-oneos/OneOS-Lite - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-10-28 - **Last Updated**: 2022-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 内核基础 内核是操作系统最核心也最重要的部分,OneOS内核总体采用可抢占式的实时的轻量级内核的方式设计,主要包含任务管理和调度、任务同步和通信、内存管理、定时器、时钟管理、工作队列等模块。内核处于组件层之下,处于驱动层和硬件层之上。 下面是对内核几个重要模块的简介: ### 任务管理及调度 任务是软件系统中运行实体的基本单位,也是内核管理和调度的最小单位。 任务管理实现了对任务的创建、销毁、阻塞、睡眠、挂起、唤醒、状态迁移、资源回收等基本功能,这些功能通过队列的方式实现,涉及的队列有任务资源队列、任务资源回收队列、就绪队列、睡眠队列、阻塞队列,例如,基于任务资源队列管理创建成功还未被销毁的任务,基于就绪队列管理处于就绪态可以投入运行的任务,基于阻塞队列管理正在等待某种资源(如信号量)的任务,任务数量理论上不做限制,但是受限于硬件本身的RAM资源。 任务调度实现了如何选取任务投入运行的策略,调度主要支持2种方式,第1种是基于优先级的抢占式调度,即当有优先级更高高的任务就绪时,就会抢占当前任务并运行更高优先级任务,优先级数值越小,优先级级别越高,第2种是相同优先级任务的时间片轮转调度,即当任务时间片耗尽时,就会退出当前任务并选取另一个相同优先级的任务投入运行。 ### 任务同步与通信 任务同步与通信是内核的基本功能。 任务同步实现了任务间的协同交替运行,同步机制包括信号量,互斥锁,事件3种方式。同步机制都可以选择按优先级方式等待和先进先出顺序方式等待,但是也有不同的应用场景,信号量主要用于任务间的同步,而且可以实现任务和中断之间的同步,互斥锁主要用于对共享资源的保护,并且可以解决优先级翻转问题,事件可以支持任务等待多个事件场景,而且也可以实现任务和中断之间的同步。 任务通信实现了任务间的数据传递,通信机制包括邮箱和消息队列,都可以选择按优先级方式等待和先进先出顺序方式等待,但是也有各自的特点,邮箱传递数据的大小固定,消息队列传递数据大小不固定,邮箱效率更高。 ### 内存管理 内存管理实现了内存的分配和释放,任务需要内存时调用分配接口得到内存,内存使用完内存后,调用释放接口把内存返还给系统,提高了系统内存的利用率。内存管理有内存池和内存堆两种方式,内存池分配的内存大小固定,分配效率高,碎片少,但是无法按需分配。内存堆可以按需分配,但是分配效率比内存池低,碎片更多;内存堆支持添加内存区域,并且内存至少要添加一个内存区域才能分配;内存堆支持选择指定的管理算法,目前有firstfit和buddy两种算法。 ### 时钟管理 时钟节拍是操作系统的心跳,任何操作系统都需要时钟节拍。时钟节拍是基于硬件定时器实现的,定时器的周期性中断到来时,就会处理一些和时间有关的事情,比如系统时钟计数,任务睡眠时间处理、任务的时间片轮转调度、定时器处理等。 ### 定时器 定时器提供了延迟一段时间执行某个用户操作的接口,分为2种,第1种是单次性定时器,即触发一次后停止,第2种是周期性定时器,即周期性地循环触发,需要手动停止。目前内核只提供软件定时器,回调函数运行在任务上下文,不支持硬件定时器,如果要使用硬件定时器,需要调用BSP相关接口。 ### 工作队列 工作队列提供了执行某个用户工作的接口,如果用户想执行某个工作,可以向工作队列提交工作,并且可以设置延时执行和不延时执行。如果想执行某个简单的或者不需要循环处理的操作,选择工作队列比较合适,不需要创建单独的任务。内核提供的工作队列有两种接口,第一种接口,用户可以创建自己的工作队列,自行决定栈大小和任务优先级,然后把需要的工作项提交到工作队列上;另外一种接口,用户不用创建工作队列,而是直接把工作项提交到系统创建的工作队列上。 ### 源码目录树 这里简单的介绍下OneOS内核源代码目录树结构。 - kernel:内核的最核心部分,包括任务调度、任务同步与通信、内存管理、定时器等。 - arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。 详细的目录树如下: ``` OneOS-Kernel ├── source //内核核心代码 │   ├── os_task.c //任务管理 │   ├── os_sched.c //调度器 │   ├── os_event.c //事件 │   ├── os_mq.c //消息队列 │   ├── os_mutex.c //互斥锁 │   ├── os_sem.c //信号量 │   ├── os_mb.c //邮箱 │   ├── os_memory.c //内存堆管理框架 │   ├── os_mem_buddy.c //内存堆管理-buddy算法 │   ├── os_mem_firstfit.c //内存堆管理-firstfit算法 │   ├── os_mem_pool.c //内存池管理 │   ├── os_clock.c //时钟管理 │   ├── os_timer.c //定时器管理 │   ├── os_workqueue.c //工作队列 │   ├── os_startup.c //系统启动管理 │   ├── os_idle.c //空闲任务管理 │   ├── os_kernel_log.c //内核日志 │   ├── os_safety.c //内核安全机制 │   ├── os_spinlock.c //自旋锁 │   ├── os_util.c //通用工具函数 │   └── os_version.c //版本管理 ├── include //头文件 arch ├── arm //arm32位体系结构 └── risc-v //risc-v体系结构 ```