嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度

上传人:宝路 文档编号:48240057 上传时间:2018-07-12 格式:PPTX 页数:26 大小:119.25KB
返回 下载 相关 举报
嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度_第1页
第1页 / 共26页
嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度_第2页
第2页 / 共26页
嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度_第3页
第3页 / 共26页
嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度_第4页
第4页 / 共26页
嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度》由会员分享,可在线阅读,更多相关《嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度(26页珍藏版)》请在金锄头文库上搜索。

1、千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org嵌入式Linux内核开发教程之深 入分析Linux内核源码进程调 度(1)1 Linux时间系统 1.1 时钟硬件 1.2 时钟运作机制 1.3 Linux时间基准 1.4 Linux的时间系统 2 时钟中断 2.1 时钟中断的产生 2.2.Linux实现时钟中断的全过程 和时钟中断相关的函数 系统调用返回函数千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org计算机最基本的时间单元是时钟周期,例如取指 令、执行指令

2、、存取内存等。时间系统是计算机系 统非常重要的组成部分,特别是对于Unix类分时系 统尤为重要。时间系统主要任务是维持系统时间并 且防止某个进程独占CPU及其他资源,也就是驱动 进程的调度。嵌入式Linux内核开发教程之1 Linux 时间系统千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org大部分PC机中有两个时钟源,他们分别叫做RTC和 OS(操作系统)时钟。RTC(Real Time Clock, 实时时钟)也叫做CMOS时钟,它是PC主机板上的 一块芯片,它靠电池供电,即使系统断电,也可以 维持日期和时间。由于它独立于操

3、作系统,所以也 被称为硬件时钟,它为整个计算机提供一个计时标 准,是最原始最底层的时钟数据。 Linux只用RTC来获得时间和日期;然而,通 过作用于/dev/rtc设备文件,也允许进程对RTC编 程。通过执行/sbin/clock系统程序,系统管理员 可以配置时钟。嵌入式Linux内核开发教程之1.1 时钟 硬件千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.orgOS时钟产生于PC主板上的定时/计数芯片,由操作 系统控制这个芯片的工作,OS时钟的基本单位就是 该芯片的计数周期。在开机时操作系统取得RTC中 的时间数据来初始化OS

4、时钟,然后通过计数芯片的 向下计数形成了OS时钟,它更应该被称为一个计数 器。OS时钟只在开机时才有效,而且完全由操作系 统控制,所以也被称为软时钟或系统时钟。下面我 们重点描述OS时钟的产生。 OS时钟输出脉冲信号,接到中断控制器上,产 生中断信号,触发后面要讲的时钟中断,由时钟中 断服务程序维持OS时钟的正常工作。嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.orgRTC和OS时钟之间的关系通常也被称作操作系统的时 钟运作机制。一般来说,RTC是OS时钟的时间基准, 操作系统通过读取RTC来初始化O

5、S时钟,此后二者保 持同步运行,共同维持着系统时间。保持同步运行是什 么意思呢?就是指操作系统运行过程中,每隔一个固定 时间会刷新或校正RTC中的信息。 图2 时钟运作机制 我们可以看到,RTC处于最底层,提供最原始的时 钟数据。OS时钟建立在RTC之上,初始化完成后将完 全由操作系统控制,和RTC脱离关系。操作系统通过 OS时钟提供给应用程序所有和时间有关的服务。嵌入式Linux内核开发教程之1.2 时钟 运作机制千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org以上我们了解了RTC(实时时钟、硬件时钟)和OS时 钟(系统时钟

6、、软时钟)。下面我们具体描述OS时 钟。OS时钟是由可编程定时/计数器产生的输出脉冲触 发中断而产生的。输出脉冲的周期叫做一个“时钟滴答” 。计算机中的时间是以时钟滴答为单位的,每一次时钟滴答,系统时间就会加1。操作系统根据当前时钟滴答 的数目就可以得到以秒或毫秒等为单位的其他时间格 式。 定义“时间基准”的目的是为了简化计算,这样计算 机中的时间只要表示为从这个时间基准开始的时钟滴答数就可以了。“时间基准是由操作系统的设计者规定 的。例如DOS的时间基准是1980年1月1日,Unix的时 间基准是1970年1月1日上午12点,Linux的时间基准 是1970年1月1日凌晨0点。嵌入式Linu

7、x内核开发教程之1.3 Linux时间基准千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.orgOS时钟记录的时间也就是通常所说的系统时间。系 统时间是以“时钟滴答”为单位的,而时钟中断的频 率决定了一个时钟滴答的长短,例如每秒有100次 时钟中断,那么一个时钟滴答的就是10毫秒(记为 10ms),相应地,系统时间就会每10ms增1。 Linux中用全局变量jiffies表示系统自启动以来 的时钟滴答数目。在/kernel/time.c中定义如下: unsigned long volatile jiffies嵌入式Linux内核开发

8、教程之1.4 Linux的时间系统千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org在jiffies基础上,Linux提供了如下适合人们习惯的 时间格式,在/include/linux/time.h中定义如下 : struct timespec * 这是精度很 高的表示* long tv_sec; * 秒 (second) * long tv_nsec; /* 纳秒:十亿分之一秒 ( nanosecond)* ;嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mo

9、biletrain.org struct timeval * 普通精度 * int tv_sec; /* 秒 * int tv_usec; /* 微秒:百万分之一秒( microsecond)* ; struct timezone /* 时区 * int tz_minuteswest; * 格林尼治时间 往西方的时差 * int tz_dsttime; /* 时间修正方式 * ;嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.orgtv_sec表示秒(second),tv_usec表示微秒( micros

10、econd),tv_nsec表示纳秒( nanosecond)。定义tb_usec和tv_nsec的目的是 为了适用不同的使用要求,不同的场合根据对时间 精度的要求选用这两种表示。另外,Linux还定义 了用于表示更加符合大众习惯的时间表示:年、 月、日。但是万变不离其宗,所有的时间应用都是 建立在jiffies基础之上的。简而言之,jiffies产生于 时钟中断!嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org.1 时钟中断的产生 “时钟中断”是特别重要的一个中断,因为整个 操作系统的活动都受到它

11、的激励。系统利用时钟中 断维持系统时间、促使环境的切换,以保证所有进 程共享CPU;利用时钟中断进行记帐、监督系统工 作以及确定未来的调度优先级等工作。可以说,“时 钟中断”是整个操作系统的脉搏。 时钟中断的物理产生如图3所示: 图3 8253和8259A的物理连接方式嵌入式Linux内核开发教程之2 时钟中 断千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org脉冲信号接到中断控制器8259A_1的0号管脚,触 发一个周期性的中断,我们就把这个中断叫做时钟 中断,时钟中断的周期,也就是脉冲信号的周期, 我们叫做“滴答”或“时标”

12、(tick)。从本质上说,时 钟中断只是一个周期性的信号,完全是硬件行为, 该信号触发CPU去执行一个中断服务程序,我们就 把这个服务程序叫做时钟中断。嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org 和时钟中断相关的函数下面我们看时钟中断触发的服务程序,该程序代码 比较复杂,分布在不同的源文件中,主要包括如下 函数: 时钟中断程序:timer_interrupt( ); 中断服务通用例程do_timer_interrupt(); 时钟函数:do_timer( ); 中断安装程序:setup_irq

13、( ); 中断返回函数:ret_from_intr( );嵌入式Linux内核开发教程之 2.2.Linux实现时钟中断的全过程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org 前三个函数的调用关系如下: timer_interrupt( ) do_timer_interrupt() do_timer( ) (1) timer_interrupt( ) 这个函数大约每10ms被调用一次,实际上, timer_interrupt( )函数是一个封装例程,它真正做 的事情并不多,该函数主要语句就是调用 do_timer_inter

14、rupt()函数。嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org (2) do_timer_interrupt() do_timer_interrupt()函数有两个主要任务, 一个是调用do_timer( ),另一个是维持实时时钟 (RTC,每隔一定时间段要回写),其实现代码在 /arch/i386/kernel/time.c中, 为了突出主题, 笔者对以下函数作了改写,以便于读者理解: static inline void do_timer_interrupt(int irq, void *d

15、ev_id, struct pt_regs *regs) do_timer(regs); /* 调用时钟函数,将时钟函 数等同于时钟中断未尝不可*/嵌入式Linux内核开发教程千锋3G嵌入式移动互联网技术研发培训中心www.embedtrain.org www.mobiletrain.org if(xtime.tv_sec last_rtc_update + 660) update_RTC(); /*每隔11分钟就更新RTC中的时间信息,以使OS时钟 和RTC时钟保持同步,11分钟即660秒,xtime.tv_sec的单 位是秒,last_rtc_update记录的是上次RTC更新时的值 */ 其中,xtime是前面所提到的timeval类型,这是一个全 局变量。 (3) 时钟函数do_timer() (在/kernel/sched.c中) void do_timer(struct pt_regs * regs) (*(unsigned long *) /*更新系统时间,这 种写法保证对jiffies操作的原子性*/嵌入式Linux内核开发教程千锋3G嵌入式移动

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号