linux内核视频教程(哪家的S5PV210开发板有视频教程呢主要是Linux和Android部分)

2024-09-06 02:15:26 1

linux内核视频教程(哪家的S5PV210开发板有视频教程呢主要是Linux和Android部分)

大家好,如果您还对linux内核视频教程不太了解,没有关系,今天就由本站为大家分享linux内核视频教程的知识,包括哪家的S5PV210开发板有视频教程呢主要是Linux和Android部分的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

哪家的S5PV210开发板有视频教程呢主要是Linux和Android部分

目前210开发板视频很少,基本没有专门为某个开发板录的,基本都是第三方的。相比而言,飞凌的OK210视频还多一点儿,给你个目录参考一下吧。Android视频1、飞凌S5PV210开发板Android编译环境搭建视频教程2、飞凌S5PV210开发板Android源码编译视频教程3、飞凌S5PV210开发板将Android烧写到开发板视频教程4、飞凌S5PV210开发板将Android开发环境搭建视频教程5、飞凌S5PV210开发板将Android应用开发实例视频教程WINCE视频1、飞凌S5PV210开发板wince环境搭建与编译视频教程2、飞凌S5PV210开发板初识bsp视频教程3、飞凌S5PV210开发板bootloader的启动流程视频教程4、飞凌S5PV210开发板LED驱动与应用程序开发视频教程5、飞凌S5PV210开发板串口驱动与应用程序开发视频教程6、飞凌S5PV210开发板摄像头驱动与应用程序开发视频教程Linux视频1、飞凌S5PV210开发板Windows7安装Ubuntu12.04(32位)虚拟机视频教程2、飞凌S5PV210开发板配置虚拟机环境视频教程3、飞凌S5PV210开发板Linux内核代码的下载视频教程4、飞凌S5PV210开发板移植新的Linux内核代码到开发板视频教程5、飞凌S5PV210开发板在新的Linux内核代码中增加网络驱动视频教程6、飞凌S5PV210开发板在新的Linux内核代码中增加LED驱动视频教程7、飞凌S5PV210开发板在新的Linux内核代码中增加串口驱动视频教程8、飞凌S5PV210开发板在新的Linux内核代码中增加LCD显示功能视频教程9、飞凌S5PV210开发板在新的Linux内核代码中增加电阻触摸功能视频教程10、飞凌S5PV210开发板编写Led应用程序视频教程11、飞凌S5PV210开发板编写串口测试应用程序视频教程QT视频1、飞凌S5PV210开发板QTcreator集成开发环境介绍视频教程2、飞凌S5PV210开发板helloworld视频教程3、飞凌S5PV210开发板ubuntu环境搭建视频教程4、飞凌S5PV210开发板如何在开发板上运行qt4.7程序视频教程5、飞凌S5PV210开发板应用开发实例视频教程裸机视频1、飞凌S5PV210开发板下载bin文件到开发板视频教程2、飞凌S5PV210开发板裸机开发环境搭建视频教程3、飞凌S5PV210开发板实例1:蜂鸣器实验视频教程4、飞凌S5PV210开发板实例2:LED流水灯实验视频教程5、飞凌S5PV210开发板实例3:按键实验视频教程6、飞凌S5PV210开发板实例4:串口操实验视频教程7、飞凌S5PV210开发板实例5:IIC实验视频教程8、飞凌S5PV210开发板实例6:PWM实验视频教程硬件设计视频1、飞凌S5PV210开发板AD10的安装视频教程2、飞凌S5PV210开发板AD10的介绍视频教程3、飞凌S5PV210开发板AD10元件库的制作方法视频教程4、飞凌S5PV210开发板AD10封装库的制作方法视频教程5、飞凌S5PV210开发板OK210最小系统可行性分析视频教程6、飞凌S5PV210开发板设计原理图视频教程7、飞凌S5PV210开发板生成PCB视频教程8、飞凌S5PV210开发板制板流程讲解视频教程

内存为程序分配空间的四种分配方式

存储器是个宝贵但却有限的资源。一流的操作系统,需要能够有效地管理及利用存储器。

内存为程序分配空间有四种分配方式:

1、连续分配方式

2、基本分页存储管理方式

3、基本分段存储管理方式

4、段页式存储管理方式

首先讲连续分配方式。 连续分配方式 出现的时间比较早,曾广泛应用于20世纪60~70年代的OS中,但是它至今仍然在内存管理方式中占有一席之地,原因在于它 实现起来比较方便,所需的硬件支持最少 。连续分配方式又可细分为四种: 单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配

其中固定分区的分配方式,因为分区固定,所以缺乏灵活性,即 当程序太小时,会造成内存空间的浪费( 内部碎片 ) 程序太大时,一个分区又不足以容纳,致使程序无法运行( 外部碎片 ) 。但尽管如此,当一台计算机去控制多个相同对象的时候,由于这些对象内存大小相同,所以完全可以采用这种内存管理方式,而且是最高效的。这里我们可以看出存储器管理机制的多面性:没有那种存储器管理机制是完全没有用的,在适合的场合下,一种被认为最不合理的分配方案却可能称为最高效的分配方案。 一切都要从实际问题出发,进行设计。

为了解决固定分区分配方式的缺乏灵活性,出现了 动态分配方式 。动态分配方式采用一些 寻表(Eg: 空闲链表 ) 的方式,查找能符合程序需要的空闲内存分区。但代价是增加了系统运行的开销,而且内存空闲表本身是一个文件,必然会占用一部分宝贵的内存资源,而且有些算法还会增加内存碎片。

可重定位分区分配通过对程序实现成定位,从而可以将内存块进行搬移,将小块拼成大块,将小空闲“紧凑”成大空闲,腾出较大的内存以容纳新的程序进程。

连续分配方式 会形成许多“碎片”,虽然可以通过“紧凑”方式将许多碎片拼接成可用的大块空间,但须为之付出很大开销。所以提出了“ 离散分配方式 ”的想法。如果 离散分配的基本单位是页 ,则称为 分页管理方式 ;如果离散分配的基本单位是段,则称为 分段管理方式

分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“ 页内碎片 ”。

在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中(所以能实现离散分配方式) ,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称 页表 。在进程地址空间内的所有页,依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见, 页表的作用是实现从页号到物理块号的地址映射

为了能够将用户地址空间中的 逻辑地址,变换为内存空间中的物理地址 ,在系统中必须设置 地址变换机构 。地址变换任务是借助于页表来完成的。

页表 的功能可由一组专门的寄存器来实现。由于寄存器成本较高,且大多数现代计算机的页表又很大,使页表项总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。因为一个进程可以通过它的PCB来时时保存自己的状态,等到CPU要处理它的时候才将PCB交给寄存器,所以,系统中虽然可以运行多个进程,但也只需要一个页表寄存器就可以了。

由于 页表是存放在内存中 的,这使得 CPU在每存取一个数据时,都要两次访问内存 。为了提高地址变换速度,在地址变化机构中增设了一个 具有并行查询能力的高速缓冲寄存器 ,又称为“联想寄存器”(Associative Lookaside Buffer)。

在单级页表的基础上,为了适应非常大的逻辑空间,出现了两级和多级页表,但是,他们的原理和单级页表是一样的,只不过为了适应地址变换层次的增加,需要在地址变换机构中增设外层的页表寄存器。

分段存储管理方式 的目的,主要是为了满足用户(程序员)在编程和使用上多方面的要求,其中有些要求是其他几种存储管理方式所难以满足的。因此,这种存储管理方式已成为当今所有存储管理方式的基础。

分段管理方式和分页管理方式在实现思路上是很相似的,只不过他们的基本单位不同。分段有 段表 ,也有 地址变换机构 ,为了提高检索速度,同样增设 联想寄存器(具有并行查询能力的高速缓冲寄存器) 。所以有些具体细节在这个不再赘述。

分页和分段的主要区别:

1、两者相似之处:两者 都采用离散分配方式,且都要通过地址映射机构来实现地址变换

2、两者的不同之处:

(1)页是信息的 物理单位 ,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页仅仅是由于 系统管理的需要 而不是用户的需要。段则是信息的 逻辑单位 ,它含有一组其意义相对完整的信息。 分段的目的是为了能更好地满足用户的需要

(2) 页的大小固定 且由系统决定,而 段的长度却不固定

(3)分页的作业地址空间是 一维 的,即单一的线性地址空间;而分段的作业地址空间则是 二维 的。

前面所介绍的分页和分段存储管理方式都各有优缺点。 分页系统能有效地 提高内存利用率 ,而分段系统则能很好地 满足用户需求 。 我们希望能够把两者的优点结合,于是出现了段页式存储管理方式。

段页式系统的基本原理,是分段和分页原理的结合,即 先将用户程序分成若干个段,再把每个段分成若干个页 ,并为每一个段赋予一个段名。在段页式系统中,地址结构由段号、段内页号和页内地址三部分组成。

和前两种存储管理方式相同,段页式存储管理方式同样需要增设联想寄存器。

离散分配方式 基于将一个进程直接分散地分配到许多不相邻的分区中的思想,分为分页式存储管理,分段式存储管理和段页式存储管理. 分页式存储管理旨在提高内存利用率,满足系统管理的需要,分段式存储管理则旨在满足用户(程序员)的需要,在实现共享和保护方面优于分页式存储管理,而段页式存储管理则是将两者结合起来,取长补短,即具有分段系统便于实现,可共享,易于保护,可动态链接等优点,又能像分页系统那样很好的解决外部碎片的问题,以及为各个分段可离散分配内存等问题,显然是一种比较有效的存储管理方式。

更多Linux内核视频教程文档资料免费领取【 内核 】自行获取。

内核学习网站:

Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂

内存映射:小块内存申请brk和申请大块内存的Mmap分析

本文为内存部分最后一篇,介绍内存映射。内存映射不仅是物理内存和虚拟内存间的映射,也包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。本文首先分析用户态在堆中申请小块内存的brk和申请大块内存的mmap,之后会分析内核态的内存映射机制vmalloc,kmap_atomic,swapper_pg_dir以及内核态缺页异常。

用户态调用malloc()会分配堆内存空间,而实际上则是完成了一次用户态的内存映射,根据分配空间的大小,内存映射对应的系统调用主要有brk()和mmap()(当然我们也可以直接调用mmap()来映射文件)。对小块内存(小于 128K),C 标准库使用 brk() 来分配,也就是通过移动堆顶的位置来分配内存。这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用。而大块内存(大于 128K),则直接使用内存映射 mmap() 来分配,也就是在文件映射段找一块空闲内存分配出去。这两种方式,自然各有优缺点。

brk()方式的缓存,可以减少缺页异常的发生,提高内存访问效率。不过,由于这些内存没有归还系统,在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片。

mmap() 方式分配的内存,会在释放时直接归还系统,所以每次 mmap() 都会发生缺页异常。在内存工作繁忙时,频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 malloc() 只对大块内存使用 mmap() 的原因。

brk()系统调用为sys_brk()函数,其参数brk是新的堆顶位置,而mm-》brk是原堆顶位置。该函数主要逻辑如下

在 do_brk_flags() 中,调用 find_vma_links() 找到将来的 vm_area_struct 节点在红黑树的位置,找到它的父节点、前序节点。接下来调用 vma_merge(),看这个新节点是否能够和现有树中的节点合并。如果地址是连着的,能够合并,则不用创建新的 vm_area_struct 了,直接跳到 out,更新统计值即可;如果不能合并,则创建新的 vm_area_struct,添加到anon_vma_chain 链表中,也加到红黑树中。

大块内存的申请通过mmap系统调用实现,mmap既可以实现虚拟内存向物理内存的映射,也可以映射文件到自己的虚拟内存空间。映射文件时,实际是映射虚拟内存到物理内存再到文件。

这里主要调用ksys_mmap_pgoff()函数,这里逻辑如下:

vm_mmap_pgoff()函数调用do_mmap_pgoff(),实际调用do_mmap()函数。这里get_unmapped_area()函数负责寻找可映射的区域,mmap_region()负责映射该区域。

更多Linux内核视频教程文本资料免费领取后台私信【 内核大礼包 】自行获取。

首先来看看寻找映射区的函数get_unmapped_area()。

mmap_region()首先会再次检测地址空间是否满足要求,然后清除旧的映射,校验内存的可用性,在一切均满足的情况下调用vma_link()将新创建的vm_area_struct结构挂在mm_struct内的红黑树上。

vma_link()本身是__vma_link()和__vma_link_file()的包裹函数

其中__vma_link()主要是链表和红黑表的插入,这属于基本数据结构操作,不展开讲解。

而__vma_link_file()会对文件映射进行处理,在file结构体中成员f_mapping指向address_space结构体,该结构体中存储红黑树i_mmap挂载vm_area_struct。

至此,我们完成了用户态内存的映射,但是此处仅在虚拟内存中建立了新的区域,尚未真正访问物理内存。物理内存的访问只有在调度到该进程时才会真正分配,即发生缺页异常时分配。

三. 用户态缺页异常   一旦开始访问虚拟内存的某个地址,如果我们发现,并没有对应的物理页,那就触发缺页中断,调用 do_page_fault()。这里的逻辑如下

find_vma()为红黑树查找操作,在此不做展开描述,下面重点看看handle_mm_fault()。这里经过一系列校验之后会根据是否是大页而选择调用hugetlb_fault()或者__handle_mm_fault()

__handle_mm_fault()完成实际上的映射操作。这里涉及到了由pgd, p4g, pud, pmd, pte组成的五级页表,页表索引填充完后调用handle_pte_fault()创建页表项。

handle_pte_fault()处理以下三种情况:

对于匿名页映射,流程如下:

映射文件do_fault()函数调用了fault函数,该函数实际会根据不同的文件系统调用不同的函数,如ext4文件系统中vm_ops指向ext4_file_vm_ops,实际调用ext4_filemap_fault()函数,该函数会调用filemap_fault()完成实际的文件映射操作。

file_map_fault()主要逻辑为:

前文提到了我们会通过主动回收或者被动回收的方式将物理内存已映射的页面回收至硬盘中,当数据再次访问时,我们又需要通过do_swap_page()将其从硬盘中读回来。do_swap_page() 函数逻辑流程如下:查找 swap 文件有没有缓存页。如果没有,就调用 swapin_readahead()将 swap 文件读到内存中来形成内存页,并通过 mk_pte() 生成页表项。set_pte_at 将页表项插入页表,swap_free 将 swap 文件清理。因为重新加载回内存了,不再需要 swap 文件了。

通过以上步骤,用户态的缺页异常就处理完毕了。物理内存中有了页面,页表也建立好了映射。接下来,用户程序在虚拟内存空间里面可以通过虚拟地址顺利经过页表映射的访问物理页面上的数据了。页表一般都很大,只能存放在内存中。操作系统每次访问内存都要折腾两步,先通过查询页表得到物理地址,然后访问该物理地址读取指令、数据。为了加快映射速度,我们引入了 TLB(Translation Lookaside Buffer),我们经常称为快表,专门用来做地址映射的硬件设备。它不在内存中,可存储的数据比较少,但是比内存要快。所以我们可以想象,TLB 就是页表的 Cache,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。有了 TLB 之后,我们先查块表,块表中有映射关系,然后直接转换为物理地址。如果在 TLB 查不到映射关系时,才会到内存中查询页表。

和用户态使用malloc()类似,内核态也有相应的内存映射函数:vmalloc()可用于分配不连续物理页(使用伙伴系统),kmem_cache_alloc()和kmem_cache_create()使用slub分配器分配小块内存,而kmalloc()类似于malloc(),在分配大内存的时候会使用伙伴系统,分配小内存则使用slub分配器。分配内存后会转换为虚拟地址,保存在内核页表中进行映射,有需要时直接访问。由于vmalloc()会带来虚拟连续页和物理不连续页的映射,因此一般速度较慢,使用较少,相比而言kmalloc()使用的更为频繁。而kmem_cache_alloc()和kmem_cache_create()会分配更为精准的小内存块用于特定任务,因此也比较常用。

相对于用户态,内核态还有一种特殊的映射:临时映射。内核态高端内存地区为了节省空间会选择临时映射,采用kmap_atomic()实现。如果是 32 位有高端地址的,就需要调用 set_pte 通过内核页表进行临时映射;如果是 64 位没有高端地址的,就调用 page_address,里面会调用 lowmem_page_address。其实低端内存的映射,会直接使用 __va 进行临时映射。

kmap_atomic ()发现没有页表的时候会直接创建页表进行映射。而 vmalloc ()只分配了内核的虚拟地址。所以访问它的时候,会产生缺页异常。内核态的缺页异常还是会调用 do_page_fault(),最终进入vmalloc_fault()。在这里会实现内核页表项的关联操作,从而完成分配,整体流程和用户态相似。

至此,我们分析了内存物理地址和虚拟地址的映射关系,结合前文页的分配和管理,内存部分的主要功能就算是大致分析清楚了,最后引用极客时间中的一幅图作为总结,算是全部知识点的汇总。

1、brk

2、mmap

3、page_fault

哪里有linux命令行和内核的视频教程多谢!

***隐藏网址***Linux版视频收集贴(Ubuntu全)不知道有没有你需要的

一文读懂Linux任务间调度原理和整个执行过程

在前文中,我们分析了内核中进程和线程的统一结构体task_struct,并分析进程、线程的创建和派生的过程。在本文中,我们会对任务间调度进行详细剖析,了解其原理和整个执行过程。由此,进程、线程部分的大体框架就算是介绍完了。本节主要分为三个部分:Linux内核中常见的调度策略,调度的基本结构体以及调度发生的整个流程。下面将详细展开说明。

Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同的数值,可以通过查询 /boot/config 内核选项来查看它的配置值。

Linux的调度策略主要分为实时任务和普通任务。实时任务需求尽快返回结果,而普通任务则没有较高的要求。在前文中我们提到了task_struct中调度策略相应的变量为policy,调度优先级有prio, static_prio, normal_prio, rt_priority几个。优先级其实就是一个数值,对于实时进程来说,优先级的范围是 0 99;对于普通进程,优先级的范围是 100 139。数值越小,优先级越高。

实时调度策略主要包括以下几种

普通调度策略主要包括以下几种:

首先,我们需要一个结构体去执行调度策略,即sched_class。该类有几种实现方式

普通任务调度实体源码如下,这里面包含了 vruntime 和权重 load_weight,以及对于运行时间的统计。

在调度时,多个任务调度实体会首先区分是实时任务还是普通任务,然后通过以时间为顺序的红黑树结构组合起来,vruntime 最小的在树的左侧,vruntime最多的在树的右侧。以CFS策略为例,则会选择红黑树最左边的叶子节点作为下一个将获得 CPU 的任务。而这颗红黑树,我们称之为运行时队列(run queue),即struct rq。

其中包含结构体cfs_rq,其定义如下,主要是CFS调度相关的结构体,主要有权值相关变量、vruntime相关变量以及红黑树指针,其中结构体rb_root_cached即为红黑树的节点

对结构体dl_rq有类似的定义,运行队列由红黑树结构体构成,并按照deadline策略进行管理

对于实施队列相应的rt_rq则有所不同,并没有用红黑树实现。

下面再看看调度类sched_class,该类以函数指针的形式定义了诸多队列操作,如

调度类分为下面几种:

队列操作中函数指针指向不同策略队列的实际执行函数函数,在linux/kernel/sched/目录下,fair.c、idle.c、rt.c等文件对不同类型的策略实现了不同的函数,如fair.c中定义了

以选择下一个任务为例,CFS对应的是pick_next_task_fair,而rt_rq对应的则是pick_next_task_rt,等等。

由此,我们来总结一下:

有了上述的基本策略和基本调度结构体,我们可以形成大致的骨架,下面就是需要核心的调度流程将其拼凑成一个整体,实现调度系统。调度分为两种,主动调度和抢占式调度。

说到调用,逃不过核心函数schedule()。其中sched_submit_work()函数完成当前任务的收尾工作,以避免出现如死锁或者IO中断等情况。之后首先禁止抢占式调度的发生,然后调用__schedule()函数完成调度,之后重新打开抢占式调度,如果需要重新调度则会一直重复该过程,否则结束函数。

而__schedule()函数则是实际的核心调度函数,该函数主要操作包括选取下一进程和进行上下文切换,而上下文切换又包括用户态空间切换和内核态的切换。具体的解释可以参照英文源码注释以及中文对各个步骤的注释。

其中核心函数是获取下一个任务的pick_next_task()以及上下文切换的context_switch(),下面详细展开剖析。首先看看pick_next_task(),该函数会根据调度策略分类,调用该类对应的调度函数选择下一个任务实体。根据前文分析我们知道,最终是在不同的红黑树上选择最左节点作为下一个任务实体并返回。

下面来看看上下文切换。上下文切换主要干两件事情,一是切换任务空间,也即虚拟内存;二是切换寄存器和 CPU 上下文。关于任务空间的切换放在内存部分的文章中详细介绍,这里先按下不表,通过任务空间切换实际完成了用户态的上下文切换工作。下面我们重点看一下内核态切换,即寄存器和CPU上下文的切换。

switch_to()就是寄存器和栈的切换,它调用到了 __switch_to_asm。这是一段汇编代码,主要用于栈的切换, 其中32位使用esp作为栈顶指针,64位使用rsp,其他部分代码一致。通过该段汇编代码我们完成了栈顶指针的切换,并调用__switch_to完成最终TSS的切换。注意switch_to中其实是有三个变量,分别是prev, next, last,而实际在使用时,我们会对last也赋值为prev。这里的设计意图需要结合一个例子来说明。假设有ABC三个任务,从A调度到B,B到C,最后C回到A,我们假设仅保存prev和next,则流程如下

最终调用__switch_to()函数。该函数中涉及到一个结构体TSS(Task State Segment),该结构体存放了所有的寄存器。另外还有一个特殊的寄存器TR(Task Register)会指向TSS,我们通过更改TR的值,会触发硬件保存CPU所有寄存器在当前TSS,并从新的TSS读取寄存器的值加载入CPU,从而完成一次硬中断带来的上下文切换工作。系统初始化的时候,会调用 cpu_init()给每一个 CPU 关联一个 TSS,然后将 TR 指向这个 TSS,然后在操作系统的运行过程中,TR 就不切换了,永远指向这个 TSS。当修改TR的值得时候,则为任务调度。

更多Linux内核视频教程文本资料免费领取后台私信【 内核大礼包 】自行获取。

在完成了switch_to()的内核态切换后,还有一个重要的函数finish_task_switch()负责善后清理工作。在前面介绍switch_to三个参数的时候我们已经说明了使用last的重要性。而这里为何让prev和last均赋值为prev,是因为prev在后面没有需要用到,所以节省了一个指针空间来存储last。

至此,我们完成了内核态的切换工作,也完成了整个主动调度的过程。

抢占式调度通常发生在两种情况下。一种是某任务执行时间过长,另一种是当某任务被唤醒的时候。首先看看任务执行时间过长的情况。

该情况需要衡量一个任务的执行时间长短,执行时间过长则发起抢占。在计算机里面有一个时钟,会过一段时间触发一次时钟中断,通知操作系统时间又过去一个时钟周期,通过这种方式可以查看是否是需要抢占的时间点。

时钟中断处理函数会调用scheduler_tick()。该函数首先取出当前CPU,并由此获取对应的运行队列rq和当前任务curr。接着调用该任务的调度类sched_class对应的task_tick()函数进行时间事件处理。

以普通任务队列为例,对应的调度类为fair_sched_class,对应的时钟处理函数为task_tick_fair(),该函数会获取当前的调度实体和运行队列,并调用entity_tick()函数更新时间。

在entity_tick()中,首先会调用update_curr()更新当前任务的vruntime,然后调用check_preempt_tick()检测现在是否可以发起抢占。

check_preempt_tick() 先是调用 sched_slice() 函数计算出一个调度周期中该任务运行的实际时间 ideal_runtime。sum_exec_runtime 指任务总共执行的实际时间,prev_sum_exec_runtime 指上次该进程被调度时已经占用的实际时间,所以 sum_exec_runtime - prev_sum_exec_runtime 就是这次调度占用实际时间。如果这个时间大于 ideal_runtime,则应该被抢占了。除了这个条件之外,还会通过 __pick_first_entity 取出红黑树中最小的进程。如果当前进程的 vruntime 大于红黑树中最小的进程的 vruntime,且差值大于 ideal_runtime,也应该被抢占了。

如果确认需要被抢占,则会调用resched_curr()函数,该函数会调用set_tsk_need_resched()标记该任务为_TIF_NEED_RESCHED,即该任务应该被抢占。

某些任务会因为中断而唤醒,如当 I/O 到来的时候,I/O进程往往会被唤醒。在这种时候,如果被唤醒的任务优先级高于 CPU 上的当前任务,就会触发抢占。try_to_wake_up() 调用 ttwu_queue() 将这个唤醒的任务添加到队列当中。ttwu_queue() 再调用 ttwu_do_activate() 激活这个任务。ttwu_do_activate() 调用 ttwu_do_wakeup()。这里面调用了 check_preempt_curr() 检查是否应该发生抢占。如果应该发生抢占,也不是直接踢走当前进程,而是将当前进程标记为应该被抢占。

由前面的分析,我们知道了不论是是当前任务执行时间过长还是新任务唤醒,我们均会对现在的任务标记位_TIF_NEED_RESCUED,下面分析实际抢占的发生。真正的抢占还需要一个特定的时机让正在运行中的进程有机会调用一下 __schedule()函数,发起真正的调度。

实际上会调用__schedule()函数共有以下几个时机

从系统调用返回用户态:以64位为例,系统调用的链路为do_syscall_64-》syscall_return_slowpath-》prepare_exit_to_usermode-》exit_to_usermode_loop。在exit_to_usermode_loop中,会检测是否为_TIF_NEED_RESCHED,如果是则调用__schedule()

内核态启动:内核态的执行中,被抢占的时机一般发生在 preempt_enable() 中。在内核态的执行中,有的操作是不能被中断的,所以在进行这些操作之前,总是先调用 preempt_disable() 关闭抢占,当再次打开的时候,就是一次内核态代码被抢占的机会。preempt_enable() 会调用 preempt_count_dec_and_test(),判断 preempt_count 和 TIF_NEED_RESCHED 是否可以被抢占。如果可以,就调用 preempt_schedule-》preempt_schedule_common-》__schedule 进行调度。

   本文分析了任务调度的策略、结构体以及整个调度流程,其中关于内存上下文切换的部分尚未详细叙述,留待内存部分展开剖析。

1、调度相关结构体及函数实现

2、schedule核心函数

关于本次linux内核视频教程和哪家的S5PV210开发板有视频教程呢主要是Linux和Android部分的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

linux内核视频教程(哪家的S5PV210开发板有视频教程呢主要是Linux和Android部分)

本文编辑:admin

本文相关文章:


网页开发是前端吗(网页设计跟前端开发一样吗)

网页开发是前端吗(网页设计跟前端开发一样吗)

大家好,关于网页开发是前端吗很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于网页设计跟前端开发一样吗的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录网页

2024年9月8日 09:40

天津嵌入式培训(天津应届生嵌入式软件开发工资水平)

天津嵌入式培训(天津应届生嵌入式软件开发工资水平)

大家好,今天小编来为大家解答以下的问题,关于天津嵌入式培训,天津应届生嵌入式软件开发工资水平这个很多人还不知道,现在让我们一起来看看吧!本文目录天津应届生嵌入式软件开发工资水平汇文教育怎么样web前端值得去学习吗天津web前端培训在天津干嵌

2024年9月8日 04:15

c++单元测试工具(c++开发必备:最好用的单元测试工具:Parasoftc++Test9.0,该如何解决)

c++单元测试工具(c++开发必备:最好用的单元测试工具:Parasoftc++Test9.0,该如何解决)

其实c++单元测试工具的问题并不复杂,但是又很多的朋友都不太了解c++开发必备:最好用的单元测试工具:Parasoftc++Test9.0,该如何解决,因此呢,今天小编就来为大家分享c++单元测试工具的一些知识,希望可以帮助到大家,下面我们

2024年9月7日 06:45

head first java英文版电子书(推荐几本适合java开发者必看的书,并且拍个序,先看什么后看什么谢谢~~)

head first java英文版电子书(推荐几本适合java开发者必看的书,并且拍个序,先看什么后看什么谢谢~~)

本篇文章给大家谈谈head first java英文版电子书,以及推荐几本适合java开发者必看的书,并且拍个序,先看什么后看什么谢谢~~对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可

2024年9月6日 10:05

java编程游戏推荐(《java程序设计》实训——网络三子棋游戏开发)

java编程游戏推荐(《java程序设计》实训——网络三子棋游戏开发)

本篇文章给大家谈谈java编程游戏推荐,以及《java程序设计》实训——网络三子棋游戏开发对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录《

2024年9月4日 19:35

java开发工程师需要具备的能力(合格的Java开发人员应该具备的能力)

java开发工程师需要具备的能力(合格的Java开发人员应该具备的能力)

这篇文章给大家聊聊关于java开发工程师需要具备的能力,以及合格的Java开发人员应该具备的能力对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录合格的Java开发人员应该具备的能力JAVA软件工程师应该具备哪些基本素质(jav

2024年9月3日 10:55

小程序云开发的优势(开发微信小程序的好处是什么)

小程序云开发的优势(开发微信小程序的好处是什么)

大家好,今天小编来为大家解答以下的问题,关于小程序云开发的优势,开发微信小程序的好处是什么这个很多人还不知道,现在让我们一起来看看吧!本文目录开发微信小程序的好处是什么小程序开发的优势有哪些小程序的6大优势小程序开发的好处是什么小程序开发的

2024年9月1日 18:40

swift playground(swift playground里怎么开发ui界面)

swift playground(swift playground里怎么开发ui界面)

大家好,今天小编来为大家解答以下的问题,关于swift playground,swift playground里怎么开发ui界面这个很多人还不知道,现在让我们一起来看看吧!本文目录swift playground里怎么开发ui界面Swift

2024年8月30日 18:20

学java有什么要点(学习Java开发需要注意哪些要点)

学java有什么要点(学习Java开发需要注意哪些要点)

“学java有什么要点”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看学java有什么要点(学习Java开发需要注意哪些要点)!本文目录学习Java开发需要注意哪些要点初学Java的关键主要是什么初学Java语言有哪些技巧J

2024年8月30日 10:10

miui官方网站(小米手机开发版系统哪里下载)

miui官方网站(小米手机开发版系统哪里下载)

大家好,今天小编来为大家解答以下的问题,关于miui官方网站,小米手机开发版系统哪里下载这个很多人还不知道,现在让我们一起来看看吧!本文目录小米手机开发版系统哪里下载小米固件哪里下载不要直接说小米官网,小米官网是卖东西的,不是下载固件的压根

2024年8月28日 09:10

java容器的概念(java开发中很多都提到了容器,容器到底里什么概念,详细点说一下,谢谢)

java容器的概念(java开发中很多都提到了容器,容器到底里什么概念,详细点说一下,谢谢)

本篇文章给大家谈谈java容器的概念,以及java开发中很多都提到了容器,容器到底里什么概念,详细点说一下,谢谢对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了

2024年8月28日 07:10

安卓系统属于系统软件吗(请问 安卓系统是硬件还是软件开发后使用也需要服务器吗怎么开发的)

安卓系统属于系统软件吗(请问 安卓系统是硬件还是软件开发后使用也需要服务器吗怎么开发的)

本篇文章给大家谈谈安卓系统属于系统软件吗,以及请问 安卓系统是硬件还是软件开发后使用也需要服务器吗怎么开发的对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏

2024年8月28日 04:35

小程序建站系统(小程序建站系统开发费用多少)

小程序建站系统(小程序建站系统开发费用多少)

大家好,如果您还对小程序建站系统不太了解,没有关系,今天就由本站为大家分享小程序建站系统的知识,包括小程序建站系统开发费用多少的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录小程序建站系统开发费用多少小程序建站系统

2024年8月28日 01:45

xamarin安卓开发(用xamarin和原生开发有什么区别)

xamarin安卓开发(用xamarin和原生开发有什么区别)

其实xamarin安卓开发的问题并不复杂,但是又很多的朋友都不太了解用xamarin和原生开发有什么区别,因此呢,今天小编就来为大家分享xamarin安卓开发的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录用xa

2024年8月27日 22:50

女生0基础学java怎么样(女生学java软件开发怎么样)

女生0基础学java怎么样(女生学java软件开发怎么样)

大家好,今天小编来为大家解答以下的问题,关于女生0基础学java怎么样,女生学java软件开发怎么样这个很多人还不知道,现在让我们一起来看看吧!本文目录女生学java软件开发怎么样零基础学Java怎么样好找工作吗女生学Java开发怎么样女生

2024年8月25日 08:45

it软件培训(昌平IT培训分享学习软件开发技术的几个阶段)

it软件培训(昌平IT培训分享学习软件开发技术的几个阶段)

各位老铁们好,相信很多人对it软件培训都不是特别的了解,因此呢,今天就来为大家分享下关于it软件培训以及昌平IT培训分享学习软件开发技术的几个阶段的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录昌平IT培训分享学

2024年8月24日 20:15

昆山今日疫情实时报(昆山市体育中心开放时间+区域昆山开发区体育休闲中心什么时候可以建好)

昆山今日疫情实时报(昆山市体育中心开放时间+区域昆山开发区体育休闲中心什么时候可以建好)

“昆山今日疫情实时报”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看昆山今日疫情实时报(昆山市体育中心开放时间+区域昆山开发区体育休闲中心什么时候可以建好)!本文目录昆山市体育中心开放时间+区域昆山开发区体育休闲中心什么时候

2024年8月24日 06:51

有了源码怎么做小程序(有小程序前端源码如何基于该基础开发后端)

有了源码怎么做小程序(有小程序前端源码如何基于该基础开发后端)

本篇文章给大家谈谈有了源码怎么做小程序,以及有小程序前端源码如何基于该基础开发后端对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录有小程序前

2024年8月23日 15:00

手机网页开发者工具(哪个手机浏览器有开发者工具)

手机网页开发者工具(哪个手机浏览器有开发者工具)

“手机网页开发者工具”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看手机网页开发者工具(哪个手机浏览器有开发者工具)!本文目录哪个手机浏览器有开发者工具如何开发手机端网页开发调试工具手机端的页面怎么开发,和webhtml有区

2024年8月23日 04:40

编程和软件开发哪个好(学习软件开发和计算机哪个好)

编程和软件开发哪个好(学习软件开发和计算机哪个好)

各位老铁们,大家好,今天由我来为大家分享编程和软件开发哪个好,以及学习软件开发和计算机哪个好的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录学习软件

2024年8月22日 00:55

更多文章:


福昕pdf编辑器文本框调整字体(Foxit PDF Editor编辑文本时怎样才能把字体加粗)

福昕pdf编辑器文本框调整字体(Foxit PDF Editor编辑文本时怎样才能把字体加粗)

本文目录Foxit PDF Editor编辑文本时怎样才能把字体加粗foxit pdf editor怎么编辑文字怎么修改福昕阅读器pdf字体打开文档的字体变得很奇怪,怎么修改成正常字体福昕阅读器打字机字体加粗foxit pdf editor

2024年7月21日 00:47

365day电影(365天的女主是谁)

365day电影(365天的女主是谁)

本文目录365天的女主是谁《365day》是什么电影呢365dni结局有第二部新预告365dni一共几部365明日之欲结局啥意思《365天:明日之欲》的结局是什么黑帮大佬的我的365日是实战吗365dni是真做还是假做啊 两个主演现实不是情

2024年7月21日 00:19

中英文语音翻译器(翻译英语的软件)

中英文语音翻译器(翻译英语的软件)

本文目录翻译英语的软件英译汉翻译软件哪个好用求中英文翻译软件有没有英语语音翻译软件翻译英语的软件翻译英语的软件有《网易有道词典》《百度翻译》《有道翻译官》《出国翻译官》《英语翻译》《必应词典》等。1、《网易有道词典》具备多种翻译模式,无需输

2024年7月3日 12:53

遗传算法matlab(matlab 遗传算法)

遗传算法matlab(matlab 遗传算法)

本文目录matlab 遗传算法怎么通过MATLAB使用遗传算法实现pid参数整定遗传算法的matlab代码实现是什么如何用matlab解决多元遗传算法问题MATLAB如何画遗传算法,用matlab实现的遗传算法matlab 遗传算法func

2023年11月18日 17:40

grab什么意思(grab的翻译是:什么意思)

grab什么意思(grab的翻译是:什么意思)

本文目录grab的翻译是:什么意思grab 是抓 的意思吗capure,catch,seize,grab,grasp的区别请问高手catch、 grab、 grasp、 seize、 snatch的区别和用法grab的翻译是:什么意思vt.

2024年6月6日 00:18

validation code(.net 的ValidationCode控件的dll怎么下载不了)

validation code(.net 的ValidationCode控件的dll怎么下载不了)

本文目录.net 的ValidationCode控件的dll怎么下载不了validation code是什么意思啊validation code是什么意思.net 的ValidationCode控件的dll怎么下载不了NuGet安装,搜索“

2023年6月5日 11:20

win2008r2直接进入修复模式(winserver2008取消系统修复命令)

win2008r2直接进入修复模式(winserver2008取消系统修复命令)

本文目录winserver2008取消系统修复命令windows server 2008 r2 系统断电后启动报错,如何修复windows server 2008 r2系统怎么修复windows server 2008 r2 系统可以用光盘

2024年7月16日 23:19

捕梦网的寓意(捕梦网的寓意)

捕梦网的寓意(捕梦网的寓意)

本文目录捕梦网的寓意捕梦网的颜色寓意谁告诉我吖????捕梦网忌讳挂在哪里捕梦花丝的寓意我的世界捕梦网有什么用女生送男生捕梦网的含义捕梦网的寓意是什么捕梦网手镯的寓意捕梦网的寓意无论是现实还是心中的捕梦网,都承载着自己对美好梦想的向往,是一种

2024年7月22日 04:51

一建报考条件及专业要求(一建考试报名有哪些专业要求)

一建报考条件及专业要求(一建考试报名有哪些专业要求)

本文目录一建考试报名有哪些专业要求一级建造师需要什么条件才能报考 学历专业如何要求一级建造师报考条件及专业要求一建报名条件及学历专业要求是什么一建的报考条件和要求一级建造工程师报考条件及专业要求一建报考条件有专业限制吗 需要满足哪些要求一建

2024年7月9日 12:15

css速成教程(CSS 详细教程)

css速成教程(CSS 详细教程)

大家好,css速成教程相信很多的网友都不是很明白,包括CSS 详细教程也是一样,不过没有关系,接下来就来为大家分享关于css速成教程和CSS 详细教程的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录CSS 详细教

2024年9月4日 08:25

record的中文是什么(record是什么意思:同义词,反义词和发音)

record的中文是什么(record是什么意思:同义词,反义词和发音)

本文目录record是什么意思:同义词,反义词和发音record 什么意思Record什么意思record是什么意思英语record翻译汉语什么意思record是什么意思啊record是什么意思呢record是什么意思英语record是什么

2024年4月28日 12:00

零基础学photoshop教程(请问年近50岁,零基础可以自学ps吗)

零基础学photoshop教程(请问年近50岁,零基础可以自学ps吗)

本文目录请问年近50岁,零基础可以自学ps吗零基础的人怎么学PS60天能成为设计大神吗零基础可以自学ps吗难度如何请问年近50岁,零基础可以自学ps吗观点1你是否具备努力的精神首先呢,抛开年龄不说,你具备这种精神之后呢?你做这件事情无疑是如

2024年7月24日 07:52

maven配置视频(为什么收不到短信验证码)

maven配置视频(为什么收不到短信验证码)

本文目录为什么收不到短信验证码零基础小白如何学习java和web前端为什么收不到短信验证码首先确认注册手机号是否填写正确,然后确认手机是否欠费或安装了短信拦截工具,若都没有问题请拨打学龄人口信息采集系统客服电话咨询具体情况。零基础小白如何学

2024年7月22日 08:31

在线课程开发(在线课程设计与开发要写代码吗)

在线课程开发(在线课程设计与开发要写代码吗)

本文目录在线课程设计与开发要写代码吗在线课程的开发也应该包括()在线课程小程序开发公司哪家好开发一个直播在线课程系统需要多少钱_直播课程哪个软件好免费课程研发是干什么的在线课程设计与开发要写代码吗需要。根据相关资料查询:尽管这个专业在日后的

2024年7月20日 17:34

removeclass(怎么用js实现jq的removeClass方法)

removeclass(怎么用js实现jq的removeClass方法)

本文目录怎么用js实现jq的removeClass方法js中removeclass怎么用,是js,不要jq怎么用js实现jq的removeClass方法1、addClass:为指定的dom元素添加样式。2、removeClass:删除指定d

2024年7月7日 15:44

织梦侵权换程序有用吗(我想问一下程序高手们!我把别人的网站模版套下来用织梦CMS怎么做,安全性怎么样)

织梦侵权换程序有用吗(我想问一下程序高手们!我把别人的网站模版套下来用织梦CMS怎么做,安全性怎么样)

本文目录我想问一下程序高手们!我把别人的网站模版套下来用织梦CMS怎么做,安全性怎么样B网站是用dedecms主程序仿的A网站界模板,B网站除了logo不相同其他页面相同,算不算侵权有哪些后果我想问一下程序高手们!我把别人的网站模版套下来用

2024年6月24日 02:00

vb语言是高级语言吗(vb语言属于什么语言)

vb语言是高级语言吗(vb语言属于什么语言)

这篇文章给大家聊聊关于vb语言是高级语言吗,以及vb语言属于什么语言对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录vb语言属于什么语言请问VB是高级编程语言吗VB语言和C语言有什么联系吗二者又有什么区别VB语言比C语言高级吗

2024年8月19日 00:50

sql在数据库中创建表(sql语句如何创建一个表啊(创建一个表的sql语句))

sql在数据库中创建表(sql语句如何创建一个表啊(创建一个表的sql语句))

各位老铁们,大家好,今天由我来为大家分享sql在数据库中创建表,以及sql语句如何创建一个表啊(创建一个表的sql语句)的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面

2024年8月28日 23:15

神经网络concat(为什么接入本地融合网神经就出问题)

神经网络concat(为什么接入本地融合网神经就出问题)

本文目录为什么接入本地融合网神经就出问题常用NLP模型的简介为什么接入本地融合网神经就出问题本人深度学习小白,想用matlab做两组传感器数据的神经网络特征融合,不知道我的想法对不对,我在工具箱里这么编写了一个基于AlexNet的神经网络模

2024年7月24日 13:53

nasa公布韦伯太空望远镜首批照片(韦伯望远镜拍摄的首张全彩照片公布,此照片传递了什么样的信息)

nasa公布韦伯太空望远镜首批照片(韦伯望远镜拍摄的首张全彩照片公布,此照片传递了什么样的信息)

本文目录韦伯望远镜拍摄的首张全彩照片公布,此照片传递了什么样的信息NASA公布韦伯空间望远镜第一张全彩深空照片,照片传递了哪些信息NASA韦伯望远镜拍摄的首张全彩照片公布,对探索宇宙有哪些意义詹姆斯-韦伯太空望远镜首批图像所带来的宇宙信息N

2024年5月26日 16:23

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1154
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1151
标签列表

热门搜索