本文共 1655 字,大约阅读时间需要 5 分钟。
linux内核架构7个组成部分
system call interface(SCI),Process Management(PM),Memory Management(MM),Arch(体系结构相关代码,和处理器相关代码),Virtual File System(VFS),Network Stack,Device driver; 其中与驱动开发相关的是内存管理子系统和进程管理子系统1.内存管理模型
内存管理子系统的职能 1.1虚拟地址和物理地址映射 1.2物理内存分配 2.地址映射管理 32位,则虚拟内存为4G,其中0G-3G为用户空间, 3G-4G为内核空间,内核空间分为4部分,直接映射区,vmalloc区,永久映射区,固定映射区 3.虚拟地址-物理地址的寻址方式 cr3寄存器的页目录基地址+32地址的高10位作为偏移在页目录里得到一个地址,该地址指向一个页表,该地址+中间10位的偏移,指向物理页的基地址,物理页的基地址+低12位的偏移找到物理存储单元 4.内核空间具体分析 直接映射区虚拟地址为3G+物理地址 vmalloc区虚拟映射与物理地址无线性关 永久内存映射区固定用来访问高段内存。 固定映射线性区虚拟地址和特殊寄存器建立关系 6.物理内存的分配 malloc、vmalloc调用分配 kmolloc提前分配1.进程与程序
程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体 进程:是一个执行中的程序,它是动态的实体。 2进程四要素: 2.1.有一段程序供其执行 2.2.有进程专用的内核空间堆栈 2.3.在内核中有一个task_struct数据结构,即通常说的进程控制块,有了该数据结构,进程才能成为内核调度的一个基本单位接收内核调度。 2.4.有独立的用户空间 3.有独立的用户空间:进程 没有有独立的用户空间但是有共享的用户空间:用户线程 没有有独立的用户空间没有共享的用户空间:内核线程 4.linux进程状态 TASK_RUNNING 绪态/执行 TASK_INTERRUPTIBLE 阻塞(等待唤醒) TASK_UNINTERRUPTIBLE 阻塞(大部分不可唤醒) TASK_KILLABLE (致命信号) TASK_TRACED(正在被调试) TASK_DEAD(进程正在退出) 5.linux进程的调度 5.1.调度的策略 SCHED_NORMAL(SCHED_OTHER):普通的分时进程 SCHED_FIFO:先入先出的实时进程 SCHED_RR:时间片轮转的实时进程 SCHED_BATCH:批处理进程 SCHED_IDLE:只在系统空闲的时才能被调度执行的进程 正在CPU调用进程时优先调用实时进程,再调用普通进程 全部实时进程,先来先服务。 全部实时进程,时间片的轮转,分时运行 5.2.调度的时机 即schedule()何时被调用。有两种调用方式:主动式,被动式 主动式,进程暂停使用时,将进程的状态设置为阻塞 被动式,抢占式调度(用户态抢占和内核态抢占) 用户态抢占和内核态抢占通过进程发生的时间来决定的, 用户态抢占发生在以下情况:1.系统调用返回用户空间,2.从中断处理程序返回用户空间 用户态抢占缺陷: 当线程与进程一直运行在内核线程,就可以一直执行,直到时间消耗完毕,缺乏实时性。 改进:既支持用户态抢占及内核抢占。5.3内核抢占:
A内核线程处理中断完成返回内核空间发生抢占。 不支持内核抢占情况四: 1.发生中断处理程序时 2.内核正在进行中断上下文的处理时,硬件中断返回前会执行软中断,此时任然处于中断上下文 3.进程持有自旋锁或者读写锁 4.内核正在执行scheduler 通过内核preempt_count来判断。 6.linux调度的步骤 .schedule函数工作流程如下 1.清理当前运行进程 2.选择下一个要运行的进程 3.设置新进程的运行环境 4.进程的切换。转载地址:http://nvomb.baihongyu.com/