摘要:关于handle_level_irq与handle_edge_irq的理解: 电平中断处理handle_level_irq: (1)mask_ack_irq; (2)标记IRQ_INPROGRESS; (3)若发生同一中断线上的中断嵌套、则退出; (4)中断处理(在驱动程序的中断处理过程中可能会unmask中断); (5)unmask中断; 由于驱动程序中可能unmask中断,因此对于同一中断线上可能发生中断嵌套(假定系统设定为IRQF_SHARED),故需要(2)、(3)步骤;可以看出对于电平触发中断方式而言,在软件上并不支持中断嵌套(硬件上支持)。 边沿中断处理handle_edge_..
阅读全文
摘要:对于ARM体系结构,每一个由用户态到内核态的中断或异常处理路径都经过kuser_cmpxchg_check,kuser_cmpxchg_check中检查被中断的地址是否大于TASK_SIZE;TASK_SIZE是内核与用户空间的分界点,那么对于ARM体系而言,为什么在用户态时其执行路径会“顺利”地进入内核空间? 查了下,在Documentation/zh_CN/arm/kernel/kernel_user_helpers.txt中解释了对于ARM体系结构,由于没有类似x86的“比较交换”指令,因此在用户态下完成一些原子操作时需要借助于内核空间的一些操作来完成(此时,仍处于用户态,只是执行的..
阅读全文
摘要:应用程序调用glibc的fork, fork发起系统调用SyS_clone(sys_clone),SyS_clone中主要调用了do_fork。关注了下内核中do_fork的流程,遗留的问题有:(1)关于进程的相关进程号的知识;(2)调度域;(3)调度实体中的一些统计量的意义;(4)父子进程的信号处理关系;(5)copy_mm()---->dup_mm()---->dup_mmap(), dup_mmap()没看懂;(6)其它,很多;关于新建进程时的vruntime的处理需要注意:新建时是减去了min_vruntime,而后在入队时又加上了min_vruntime。以下分析为系统调
阅读全文
摘要:注:glibc-2.17中fork的相应系统调用是sys_clone及SyS_clone。有人说调用的是sys_fork,但是我持否定意见,如果我们向真的来发起系统调用可以使用syscall。fork系统调用等价于直接调用的就是do_fork(CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHILD, NULL, NULL, NULL, &THREAD_SELF->tid)。&THREAD_SELF->tid放在svc状态下的栈上,前四个参数在r0~r3中。比较简单,sys_clone实际上是SyS_clone__ve
阅读全文
摘要:因为想跟踪下在新建进程时,如何处理新建进程的vruntime,所以跟踪了下fork。以glic-2.17中ARM为例(unicore架构的没找到),实际上通过寄存器向系统调用传递的参数为:r7: __NR_clone 120r0: CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLDr1: NULLr2: NULLr3: NULLr4: &THREAD_SELF->tidfork()---->__fork()---->__libc_fork()__libc_fork()---->INLINE_SYSCALL (c
阅读全文
摘要:中断处理完毕后,系统有三种执行流向: 1)直接返回中断前的状态;2)系统重新进行调度;3)进行信号处理;我们此处重点关注:在用户态下发生scheduler_tick,且已判定当前进程可被抢占的情形(此处以ARM为例)。__irq_usr:#......b ret_to_user_from_irqENTRY(ret_to_user_from_irq) ldr r1, [tsk, #TI_FLAGS]#define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_NOTIFY_RESUME) tst r1, #_T...
阅读全文
摘要:周期性调度器由中断实现,系统定时产生一个中断,然后启动周期性调度器,周期性调度器执行过程中要关闭中断, 周期性调度器执行完毕后再打开中断(handle_IRQ_event, IRQF_DISABLED) 周期性调度器主要做两个工作:a)更新相关统计量b)检查进程执行的时间是否超过了它对应的ideal_runtime,如果超过了,则告诉系统,需要启动主调度器(schedule)进行进程切换。(注意thread_info:preempt_count、thread_info:flags (TIF_NEED_RESCHED))周期性调度器 |---->do_timer() 更新jiffies..
阅读全文
摘要:引述自:http://www.unixresources.net/linux/clf/linuxK/archive/00/00/47/91/479165.htmlKevin.Liu 的《调度器笔记》中指明“有几个 CPU 就会有几个 rq 结构体,所有的结构体保存在 一个数组中(即runqueues)";《深入Linux内核架构》p_73指明”系统的所有就绪队列中都在runqueues数组中,由下定义完成: static DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues);由于unicore32是单核,所以原先就没关注过这个问题..
阅读全文
摘要:在抽象模型中vruntime决定了进程被调度的先后顺序,在真实模型中决定被调度的先后顺序的参数是由函数entity_key决定的。 static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se){ return se->vruntime - cfs_rq->min_vruntime;}enqueue_task_fair---->enqueue_entity---->__enqueue_entity---->entity_key决定插入就绪队列的位置。普通进程分为40个等级,每
阅读全文
摘要:调度器真实模型的主要成员变量及与抽象模型的对应关系I、cfs_rq结构体 a) struct sched_entity *curr 指向当前正在执行的可调度实体。调度器的调度单位不是进程,而是可调度的实体。每个task_struct都嵌入了一个可调度实体sched_entity,所以每个进程是一个可调度实体。可以将多个进程捆绑在一起作为一个调度单位(即调度实体)进行调度。因此,可调度实体可以是一个进程,也可以是多个进程构成的一个组。为了简化,暂时把curr理解为指向当前正在运行的进程。 d) struct rboot tasks_timeline cfs就绪队列是用红黑树来组织的,tasks.
阅读全文
摘要:参考资料:《调度器笔记》Kevin.Liu 《Linux kernel development》 《深入Linux内核架构》 version: 2.6.32.9 下文中对于红黑树或链表组织的就绪队列,统称为用队列组织的就绪队列。 linux中用struct rq将处于ready状态的进程组织在一起。 struct rq结构体包含cfs和rt成员,分别表示两个就绪队列:cfs就绪队列用于组织就绪的普通进程(这个队列上的进程用完全公平调度器进行调度);rt就绪队列用于组织就绪的实时进程(该队列上的进程用实时调度器调度)。 在多核cpu系统中,每个cpu对应一个struct rq结构体实例。 核..
阅读全文
摘要:固然书本上讲明jiffies是jiffies_64的低32位,但是我还是自己测试了下,重点在于链接脚本的写法。此处只是为了测试,因此简化链接脚本。 /* link.lds */1 ENTRY(_start) 2 3 jiffies = jiffies_64; 4 5 SECTIONS 6 { 7 8 . = 0x0; 9 10 . = ALIGN(4);11 .t...
阅读全文
摘要:过几天得去面试,感觉原来做的东西都忘了。有点累,无意看了下二师兄的小论文,想来原先自己也参与过一点点,所以记录下:Dalvik虚拟机中共有3种解释器,分别时SWITCH_INTERP,THREADED_INTERP,MTERP_INTERPSWITCH_INTERP,通过switch跳转实现dex字节码的解释执行,因为switch一般通过(索引+二分查找)实现,所以……THREADED_INTERP,通过预先建立好解释dex字节码的跳转表,通过go语句以索引方式实现解释执行,所以效率明显由于SWITCH_INTERP……MTERP_INTERP,以汇编形式实现:使用rIBASE记录解释字节码,
阅读全文
摘要:linux抢占发生的时间:抢占分为用户抢占和内核抢占。用户抢占在以下情况下产生:1、从系统调用返回用户空间2、从中断处理程序返回用户空间内核抢占发生在:1、当从中断处理程序返回内核空间的时候,且当时内核具有可抢占性;2、当内核代码再一次具有可抢占性的时候(如spin_unlock);3、如果内核中的任务显式调用主调度函数schedule()4、如果内核中的任务阻塞 基本的进程调度就是发生在时钟中断后,并且发现进程的时间片已经使用完了,则发生进程抢占。通常我们会利用中断处理程序返回内核空间的时候可以进行内核抢占这个特性来提高一些I/O操作的实时性,如:当I/O事件发生的时候,对应的中断处理程序.
阅读全文
摘要:完全引述自:http://blog.csdn.net/dog250/article/details/7459533自Linux 2.6以来(严格说应该是2.5),O(n)调度器被人们认为是一种千年之前就应该抛弃的东西被重重的甩开了,此后出现了O(1),CFS等,再也没人提 起O(n)了。说实话,Linux的调度器远比标准Unix的来得复杂,因为Linux被用于不同的场合,从手机一直到大型服务器,跨度如此之大就需要兼 各种情况,你既要使网络服务器的吞吐量达到最大,又要使交互体验更佳,然而有时候吞吐量和延迟却是鱼与熊掌的关系... O(n)被彻底遗忘,某种程度上反映了人们的思维误区,那就是“解决问
阅读全文
摘要:下载alsa-lib-1.0.26.tar.bz2 alsa-utils-1.0.26.tar.bz2将alsa-lib目录下的config.sub做如下修改:# Decode aliases for certain CPU-COMPANY combinations.case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 17...
阅读全文
摘要:引述自:http://blog.csdn.net/lizhibin1091666592/article/details/6976254 内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。一般来讲原子上下文指的是在中断或软中断中,以及在持有自旋锁的时候。内核提供了四个宏来判断是否处于这几种情况里:#define in_irq() (hardirq_count()) //在处理硬中断中#define in_softirq() (softirq_count()) //在处理软中断...
阅读全文
摘要:thread_info中的preempt_count域设置当前进程是否可被抢占,但是我们还得注意下内核中会用到preempt_count() & PREEMPT_ACTIVE,这就是判断preempt_count 的PREEMPT_ACTIVE是否被置位,preempt_count的PREEMPT_ACTIVE位只有在内核抢占中才会被置位。__irq_svc: svc_entry#ifdef CONFIG_PREEMPT get_thread_info tsk ldr r8, [tsk, #TI_PREEMPT] @ get preempt count add...
阅读全文
摘要:推挽输出:可输出高、低电平,连接数字器件:开漏输出:输出端相当于三级管的集电极,得到高电平状态需要上拉电阻才行,适合于电流型驱动(优点:输出灵活,缺点:上升沿延迟较大)0C门:完成线与,需要上拉一般来说,开漏用来连接不同电平的器件,匹配电平用的(由上拉电阻决定),与外部进行与操作。
阅读全文