也正是因为Linux内核的唯一性,各个不同发布版本拥有相同的框架。Linux内核是在整个Linux系统的最底层,它负责管理硬件,运行用户程序,并保持系统整体的安全性和完整性。可以说是Linux系统的根和灵魂。图3-1中看到Linux内核还有另一层面的含义。这对于Linux内核同样适用。所以对Linux内核的剖析、学习和研究也不能独立于系统进行,而是要综合考虑应用、内核和硬件等各方面的信息和内容。这样才能更全面、深刻地理解Linux内核。......
2023-11-22
在Linux 2.6.16之前,内核一直使用一种称为timer wheel的机制来管理时钟。这就是熟知的基于Hz的timer机制。timer wheel有占用的内存少等优点,但timer wheel的实现机制仍然存在弊端。一方面timer wheel是为timeout类型的定时器优化的,并不适合精准定时timer;另一方面,由于timer wheel是建立在Hz的基础上的,因此其计时精度无法进一步提高。毕竟一味的通过提高Hz值来提高计时精度并无意义,结果只能是产生大量的定时中断,增加额外的系统开销。因此,有必要将高精度的timer与低精度的timer分开,这样既可以确保低精度的timeout类型的定时器应用,也便于高精度的timer类型定时器的应用。另外timer wheel的实现与jiffies的耦合性太强,非常不便于扩展。
2ᤫ新的时间管理框架
为了解决timer wheel低精度以及与内核其他模块的高耦合性的缺点,Linux内核引入了hrtimer。另外为了能在电源管理方面进行优化,有必要去除以频率(Hz)触发的定时时钟中断,改为动态时钟机制(dynamic tick)或者说NO_HZ机制。新的时间管理框架如图4-48所示。
下面介绍其中的各个模块。
①时钟源设备(clock-source device)。它是系统中可以提供一定精度的计时设备。不同的时钟源提供的时钟精度是不一样的。此外,时钟源的计时都是单调递增的(monotoni-cally)。时钟源作为系统时钟的提供者,在可靠并且可用的前提下精度越高越好。在Linux中不同的时钟源有不同的频率,具有更高频率的时钟源会优先被系统使用。
②时钟事件设备(clock-event device)。它是系统中可以触发one-shot(单次)或者周期性中断的设备。某些设备既可以做时钟源设备也可以做时钟事件设备。时钟事件设备的类型分为全局和per-cpu两种类型。全局的时钟事件设备完成的是系统相关的工作,例如完成系统的tick更新;per-cpu的时钟事件设备主要完成本地CPU上的一些功能,例如对在当前CPU上运行进程的时间统计,profile,设置本地CPU上的下一次事件中断等。和时钟源设备的实现类似,时钟事件设备也通过频率来区分优先级关系。(www.chuimin.cn)
③tick device。它是用来处理周期性的tick event。tickdevice其实是对时钟事件设备的整合,因此tick device也有one-shot和周期性这两种中断触发模式。每注册一个时钟事件设备,这个设备会自动被注册为一个tick device。全局的tickdevice用来更新诸如jiffies这样的全局信息,per-cpu的tick device则用来更新每个CPU相关的特定信息。
④hrtimer。它是建立在per-cpu时钟事件设备基础上的。对于一个SMP系统,如果只有全局的时钟事件设备,hrtimer无法工作。ktime_t是hrtimer主要使用的时间结构。无论使用哪种体系结构,ktime_t始终保持64bit的精度,并且考虑了大小端的影响。hrtimer有两种工作模式:低精度模式(low-resolution mode)与高精度模式(high-resolution mode)。虽然hrtimer子系统是为高精度的timer准备的,但是系统可能在运行过程中动态切换到不同精度的时钟源设备,因此hrtimer需要能够在低精度模式与高精度模式下自由切换。低精度模式是建立在高精度模式基础之上的,在低精度模式下,hrtimer的核心处理函数是hrtimer_run_queues,每一次tick中断都要执行一次。hrtimer_bases是实现hrtimer的核心数据结构,通过hrtimer_bases,hrtimer可以管理挂在每一个CPU上的所有timer。在update_process_times中,除了处理处于低精度模式的hrtimer外,还要唤醒时间中断的softirq(TIMER_SOFTIRQ)以便执行timer wheel的代码。由于hrtimer子系统的加入,在时间中断的softirq中还需要通过hrtimer_run_pending检查是否可以将hrtimer切换到高精度模式,如果可以将hrtimer切换到高精度模式,则调用hrtimer_switch_to_hres函数进行切换。
图4-48 Linux内核时间管理框架
⑤dynamic tick。它能在系统空闲时通过停止tick的运行以达到降低处理器功耗的目的。使用dynamic tick的系统,只有在实际工作时才会产生tick,否则tick处于停止状态。dynamic tick是为彻底替换掉周期性的tick机制而产生的。它对周期性运行的tick机制所完成的(如进程时间片的计算、更新profile、协助CPU进行负载均衡等)诸多工作都提供了相应的模拟机制。hrtimer从低精度模式切换到高精度模式的切换点,也是低精度模式下从周期性tick到dynamic tick的切换点,会将tick切换到one-shot模式下,另外通过tick_nohz_handler模拟周期性tick device完成的工作:如果当前CPU负责全局tick device的工作,则更新jiffies,同时完成对本地CPU的进程时间统计等工作;如果当前tick device在此之前已经处于停止状态,为了防止tick停止时间过长造成watchdog超时,从而引发soft-lockdep的错误,需要通过调用touch_softlockup_watchdog软件复位看门狗防止其溢出;设置了下一次的超时事件,但是由于系统空闲时会停止tick,因此下一次的超时事件可能发生,也可能不发生。在高精度模式下tick_sched_timer用来模拟周期性tick device的功能。dynamic tick的实现也使用了这个函数。这是因为hrtimer在高精度模式时必须使用one-shot模式的tick device,这也同时符合dynamic tick的要求。虽然使用同样的函数,表面上都会触发周期性的tick中断,但是使用dynamic tick的系统在空闲时会停止tick工作,因此tick中断不会是周期产生的。对于tick的开关在cpuidle中通过tick_nohz_stop_sched_tick和tick_nohz_restart_sched_tick来实现,其中通过tick_do_update_jiffies64来更新时间,保证模拟的正确性。
有关深入剖析Linux内核与设备驱动的文章
也正是因为Linux内核的唯一性,各个不同发布版本拥有相同的框架。Linux内核是在整个Linux系统的最底层,它负责管理硬件,运行用户程序,并保持系统整体的安全性和完整性。可以说是Linux系统的根和灵魂。图3-1中看到Linux内核还有另一层面的含义。这对于Linux内核同样适用。所以对Linux内核的剖析、学习和研究也不能独立于系统进行,而是要综合考虑应用、内核和硬件等各方面的信息和内容。这样才能更全面、深刻地理解Linux内核。......
2023-11-22
VFS的实现是以“一切皆是文件”为需求出发点的。要理解VFS的框架首先看一下VFS和系统的静态关系框图,如图5-1所示。从图5-1可见,VFS是用户层的直接接口,是面向用户的服务。图5-1VFS和系统静态关系图在图5-2中每个节点被使用时都会在VFS层中创建dentry,这样可以快速通过文件名进行查找和定位,Linux内核中对dentry的管理组织形式如图5-3所示。以上是系统运行时VFS对文件名的组织管理,这是VFS管理的一个方面。......
2023-11-22
DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。......
2023-11-22
考虑到电源管理的需求涉及处理器和各种设备,一方面是处理器尽可能减少功耗,另一方面是设备尽可能减少功耗。图5-30Linux电源管理各个功能从图5-30可见Linux内核的电源管理功能有与处理器相关的CPUIdle和CPUFreq,也有与设备相关的runtime pm,另外还有与整个系统待机时SLM相关的低功耗电源管理功能。下面分别对这些功能框架进行介绍。具体的驱动同样会在SoC电源管理部分进行讲解。对具体设备的电源管理实现,将在设备驱动中进行详细分析。......
2023-11-22
图3-3Linux内核整体框架③bridges:桥梁层。Linux内核通过统一的接口操作设备,这样就屏蔽了各个设备的差异,从而降低了和硬件的耦合关系。Linux内核为了简化实现,将共享资源的进程作为线程。考虑到外部事件需要对执行流程进行转换,另外不同的应用执行流程之间需要切换,这就要在Linux内核的逻辑层抽象出调度器这一逻辑功能。......
2023-11-22
SPI总线框架对这两类设备进行管理,具体的框架如图7-6所示。通常的SPI驱动都是在内核实现并在内核态执行的,所以就不对spidev进行详细的分析。SPI总线框架整体的功能就是这样,接下来看看具体各部分的实现。在SPI总线框架中相应的实体是spi_board_info,内容如下:其中的主要信息是与总线信号相关的属性。......
2023-11-22
整体的frame buffer框架如图6-5所示。了解frame buffer的框架还要先从为用户提供的接口开始。图6-7可变参数中硬件信息的含义固定信息是在frame buffer的操作过程中并不发生变化的。从整体分析,frame buffer的框架很直接,主要就是直接管理实际的设备,而相关的操作与应用层直接相关。......
2023-11-22
相关推荐