Fork me on GitHub

11 2018 档案

摘要:在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的bootmem分配器就是系统初始化阶段使用的内存分配器. 为 阅读全文
posted @ 2018-11-30 15:07 yooooooo 阅读(1310) 评论(0) 推荐(0) 编辑
摘要:在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器. 而我们今天要讲的boot阶段就是系统初始化阶段使用的内存分配器. 1 前景回 阅读全文
posted @ 2018-11-30 11:08 yooooooo 阅读(2137) 评论(0) 推荐(2) 编辑
摘要:1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制,即 页全局目录(Page Global Directory) 页上级目录(Page Upper Di 阅读全文
posted @ 2018-11-29 14:27 yooooooo 阅读(4646) 评论(0) 推荐(2) 编辑
摘要:1 页式管理 1.1 分段机制存在的问题 分段,是指将程序所需要的内存空间大小的虚拟空间,通过映射机制映射到某个物理地址空间(映射的操作由硬件完成)。分段映射机制解决了之前操作系统存在的两个问题: 1. 地址空间没有隔离 2. 程序运行的地址不确定 不过分段方法存在一个严重的问题:内存的使用效率低。 阅读全文
posted @ 2018-11-28 17:54 yooooooo 阅读(1282) 评论(0) 推荐(0) 编辑
摘要:到目前为止,我们只考虑了实时系统上的调度。事实上, Linux可以做得更好些。除了支持多个CPU之外,内核也提供其他几种与调度相关的增强功能,在以后几节里会论述。但请注意,这些增强功能大大增加了调度器的复杂性,因此我主要考虑简化的情形,目的在于说明实质性的原理,而不考虑所有的边界情形和调度中出现的奇 阅读全文
posted @ 2018-11-28 14:34 yooooooo 阅读(659) 评论(0) 推荐(0) 编辑
摘要:1 分页机制 在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的物理地址(phisical address). 很显然,这个页表是需要常驻内存的东西, 以应对频繁的查询映射需要(实际上,现代支持VM的处理器都有一个叫TLB的硬件级页表缓存部 阅读全文
posted @ 2018-11-25 12:14 yooooooo 阅读(2171) 评论(0) 推荐(0) 编辑
摘要:1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的线性地址空间。 为了合理的利用逻辑4G空间,Linu 阅读全文
posted @ 2018-11-25 00:16 yooooooo 阅读(2235) 评论(0) 推荐(2) 编辑
摘要:1 Linux如何描述物理内存 Linux把物理内存划分为三个层次来管理 层次| 描述 | 存储节点(Node) | CPU被划分为多个节点(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个CPU node对应一个内存簇bank,即每个内存簇被认为是一个节点 管理区(Zone) 阅读全文
posted @ 2018-11-24 21:53 yooooooo 阅读(3065) 评论(0) 推荐(0) 编辑
摘要:1 内存管理域zone 为了支持NUMA模型,也即CPU对不同内存单元的访问时间可能不同,此时系统的物理内存被划分为几个节点(node), 一个node对应一个内存簇bank,即每个内存簇被认为是一个节点 首先, 内存被划分为结点. 每个节点关联到系统中的一个处理器, 内核中表示为 的实例. 系统中 阅读全文
posted @ 2018-11-23 11:58 yooooooo 阅读(7097) 评论(0) 推荐(2) 编辑
摘要:1 内存节点node 1.1 为什么要用node来描述内存 这点前面是说的很明白了, NUMA结构下, 每个处理器CPU与一个本地内存直接相连, 而不同处理器之前则通过总线进行进一步的连接, 因此相对于任何一个CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而 阅读全文
posted @ 2018-11-21 00:45 yooooooo 阅读(2038) 评论(0) 推荐(3) 编辑
摘要:在内核中代码调用过程难以跟踪,上下文关系复杂,确实让人头痛 调用dump_stack()就会打印当前cpu的堆栈的调用函数了。 如此,一目了然的就能看到当前上下文环境,调用关系了 假设: 遇到uvc_probe_video这么一个函数,不知道它最终是被谁调用到的,根据linux设备模型,初步推测,p 阅读全文
posted @ 2018-11-20 12:05 yooooooo 阅读(689) 评论(0) 推荐(0) 编辑
摘要:1 前景回顾 1.1 UMA和NUMA两种模型 共享存储型多处理机有两种模型 均匀存储器存取(Uniform Memory Access,简称UMA)模型 将可用内存以连续方式组织起来, 非均匀存储器存取(Nonuniform Memory Access,简称NUMA)模型 1.2 UMA模型 传统 阅读全文
posted @ 2018-11-19 23:53 yooooooo 阅读(2335) 评论(0) 推荐(7) 编辑
摘要:Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统仍然需要正常运行的情况下使用,比如听歌、传输很大的文件等。本文主要分析driver层wake_loc 阅读全文
posted @ 2018-11-19 09:33 yooooooo 阅读(1255) 评论(0) 推荐(0) 编辑
摘要:1. 3种系统架构与2种存储器共享方式 1.1 架构概述 从系统架构来看,目前的商用服务器大体可以分为三类 对称多处理器结构(SMP:Symmetric Multi Processor) 非一致存储访问结构(NUMA:Non Uniform Memory Access) 海量并行处理结构(MPP:M 阅读全文
posted @ 2018-11-18 23:20 yooooooo 阅读(2551) 评论(0) 推荐(1) 编辑
摘要:按照POSIX标准的强制要求,除了“普通”进程之外, Linux还支持两种实时调度类。调度器结构使得实时进程可以平滑地集成到内核中,而无需修改核心调度器,这显然是调度类带来的好处。 现在比较适合于回想一些很久以前讨论过的事实。实时进程的特点在于其优先级比普通进程高,对应地,其static_prio值 阅读全文
posted @ 2018-11-18 16:45 yooooooo 阅读(1082) 评论(0) 推荐(0) 编辑
摘要:我们也讲解了CFS的很多进程操作 信息 函数 描述 进程入队/出队 enqueue_task_fair/dequeue_task_fair 向CFS的就读队列中添加删除进程 选择最优进程(主调度器) pick_next_task_fair 主调度器会按照如下顺序调度 schedule -> __sc 阅读全文
posted @ 2018-11-18 11:47 yooooooo 阅读(815) 评论(0) 推荐(1) 编辑
摘要:1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在 "kernel/sched/core.c, line 2910" ), 在scheduler_tick中周期性调度器通过调用curr进程所属调度器类sched_class的task_tick函数完成周 阅读全文
posted @ 2018-11-18 11:30 yooooooo 阅读(1638) 评论(0) 推荐(0) 编辑
摘要:1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个将要运行的进程由pick_next_task_fair函数来完成 之前我们在将主调度器的时候, 主调 阅读全文
posted @ 2018-11-18 10:19 yooooooo 阅读(2129) 评论(1) 推荐(1) 编辑
摘要:1. CFS进程入队和出队 完全公平调度器CFS中有两个函数可用来增删队列的成员: 和`dequeue_task_fair`分别用来向CFS就绪队列中添加或者删除进程 2 enqueue_task_fair入队操作 2.1 enque_task_fair函数 向就绪队列中放置新进程的工作由函数 函数 阅读全文
posted @ 2018-11-12 16:31 yooooooo 阅读(2025) 评论(0) 推荐(1) 编辑
摘要:1 虚拟运行时间(今日内容提醒) 1.1 虚拟运行时间的引入 CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度。 具体实现时,CFS通过每个进程的虚拟运行时间(vruntime)来衡量哪个进程最值得被调度。 CFS中的就绪队列是一棵以vruntime为键值的红黑树,虚 阅读全文
posted @ 2018-11-12 15:37 yooooooo 阅读(2672) 评论(0) 推荐(0) 编辑
摘要:1. 负荷权重 1.1 负荷权重结构struct load_weight 负荷权重用struct load_weight数据结构来表示, 保存着进程权重值weight。其定义在 "/include/linux/sched.h, v=4.6, L1195" , 如下所示 1.2 调度实体的负荷权重lo 阅读全文
posted @ 2018-11-10 22:27 yooooooo 阅读(2687) 评论(0) 推荐(1) 编辑
摘要:1. 唤醒抢占 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程. 请注意该过程不涉及核心调度器. 每个调度器类都因应该实现一个chec 阅读全文
posted @ 2018-11-09 09:55 yooooooo 阅读(2879) 评论(0) 推荐(0) 编辑
摘要:1. linux优先级的表示 1.1 优先级的内核表示 linux优先级概述 在用户空间通过nice命令设置进程的静态优先级, 这在内部会调用nice系统调用, 进程的nice值在 20~+19之间. 值越低优先级越高. setpriority系统调用也可以用来设置进程的优先级. 它不仅能够修改单个 阅读全文
posted @ 2018-11-08 20:42 yooooooo 阅读(1678) 评论(0) 推荐(0) 编辑
摘要:在linux内核系统中,各个模块、子系统之间是相互独立的。Linux内核可以通过通知链机制来获取由其它模块或子系统产生的它感兴趣的某些事件。 notifier_block结构体在include/linux/notifier.h中定义: priority用来定义优先级,高优先级的处理例程将被优先执行, 阅读全文
posted @ 2018-11-05 15:11 yooooooo 阅读(4296) 评论(0) 推荐(0) 编辑
摘要:1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因此当前linux的调度程序由两个调度器组成:主调度器,周期性调度器(两者又统称为通用调 阅读全文
posted @ 2018-11-04 18:33 yooooooo 阅读(1457) 评论(0) 推荐(1) 编辑
摘要:task_struct进程描述符中包含两个跟进程地址空间相关的字段mm, active_mm, 大多数计算机上系统的全部虚拟地址空间分为两个部分: 供用户态程序访问的虚拟地址空间和供内核访问的内核空间。每当内核执行上下文切换时, 虚拟地址空间的用户层部分都会切换, 以便当前运行的进程匹配, 而内核空 阅读全文
posted @ 2018-11-04 17:30 yooooooo 阅读(4259) 评论(0) 推荐(0) 编辑
摘要:1 非抢占式和可抢占式内核 为了简化问题,我使用嵌入式实时系统uC/OS作为例子 首先要指出的是,uC/OS只有内核态,没有用户态,这和Linux不一样 多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配CPU时间, 并且负责任务之间的通讯. 内核提供的基本服务是任务切换. 调度(Sche 阅读全文
posted @ 2018-11-01 14:03 yooooooo 阅读(2526) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示