在分析Linu内核启动的过程中,发现一段“不平常”的日志,感觉产生这段日志的代码肯定是“不可思议”的。因此就大致分析了一下:

日志如下:

[ 0.000000] console [ttyMT0] enabled

[ 2.157770] Calibrating delay loop... 1694.10 BogoMIPS (lpj=4235264)

更精细的日志如下:

[    0.000000] start:sched_clock_init.

[    2.100505] end  :sched_clock_init.

与这段日志有关的代码是:

void sched_clock_init(void)

{

/*printk(KERN_CRIT “start:sched_clock_init.\n”)*/

sched_clock_running = 1;

/*printk(KERN_CRIT “end  :sched_clock_init.\n”)*/

}

难道这一句简简单单的赋值就会花费两秒是的时间??那么就分析一下相关的代码:sched_clock_running作用和printk的实现。

1.      sched_clock_running的作用

分析发现,调用sched_clock_running的地方仅仅有函数sched_clock_cpu():

u64 sched_clock_cpu(int cpu)

{

if (unlikely(!sched_clock_running))

return 0;

return sched_clock();

}

很明显,如果sched_clock_running为0(unlikely已经说明sched_clock_running很少为0),则返回0;如果不为0,调用sched_clock返回当前的调度时钟时间(相对系统起始的时间,单位为纳秒)。

函数sched_clock_cpu()被大约四个函数调用cpu_clock() / local_clock / update_rq_clock() / ttwu_queue()。

综上可知,执行sched_clock_init之前,获取的调度时钟时间都是0,执行sched_clock_init之后,取得的调度时钟时间都是有非零值的。

2.      Printk()的实现

Printk的实现都在文件./kernel/printk.c中。Printk() ->  vprintk(),而在vprintk()会通过cpu_clock()获取时间。而有上可知,能否打印时间是和sched_clock_init有没有被执行是有直接关系的。

3.      结论

通过分析,可以知道,日志中显示的两秒的差距不是因为执行语句花费了两秒,而是因为在该语句之前,没有获取到有效的调度时钟时间。

Printk与sched_clock_init的一点分析的更多相关文章

  1. [系统启动]Printk与sched_clock_init的一点分析

     作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 在分析Linu内核启动的过程中,发现一段"不平常" ...

  2. App store 应用审核由于 IPv6 网络问题被拒的一点分析

    App store 应用审核由于 IPv6 网络问题被拒的一点分析   六月以后陆续有一些软件提交市场的时候被拒了,症状基本就是无法登陆啥的.我们公司的应用也未能幸免. 很多同学也想了不少办法,申诉. ...

  3. 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析

    最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑: deque<) //函数声明 deque<) //定义一个容器 式子原本的含义都是要定义一个容器,容器的内容从标准输 ...

  4. Linux移植随笔:对tslib库的ts_test测试程序代码的一点分析【转】

    转自:http://www.latelee.org/embedded-linux/porting-linux-tstest-code.html 本文是作者对tslib库的ts_test.c文件进行分析 ...

  5. 关于CoordinatorLayout与Behavior的一点分析

    Behavior是Android新出的Design库里新增的布局概念.Behavior只有是CoordinatorLayout的直接子View才有意义.可以为任何View添加一个Behavior.Be ...

  6. 关于J-LINK升级最新固件后无法连上的一点分析

    昨天升级了最新的 Keil MDK 4.53,怕它老是提示 J-Link 要升级,就去 SEGGER 的网站下了个最新版的 J-Link 软件包(4.46F 版的),装好后运行 J-Link Comm ...

  7. 关于dubbo扩展点的一点分析

    扩展点能力 能load class,这个class除了顶层接口class(在ExtensionLoader中对应type字段),还能load各实现类的class. 能创建instance. 能指定这个 ...

  8. Angular源码分析之$compile

    @(Angular) $compile,在Angular中即"编译"服务,它涉及到Angular应用的"编译"和"链接"两个阶段,根据从DO ...

  9. Cocos2d-X3.0 刨根问底(三)----- Director类源码分析

    上一章我们完整的跟了一遍HelloWorld的源码,了解了Cocos2d-x的启动流程.其中Director这个类贯穿了整个Application程序,这章随小鱼一起把这个类分析透彻. 小鱼的阅读源码 ...

随机推荐

  1. Vuex 模块化实现待办事项的状态管理

    前言 在vue里,组件之间的作用域是独立的,父组件跟子组件之间的通讯可以通过prop属性来传参,但是在兄弟组件之间通讯就比较麻烦了.比如A组件要告诉一件事给B组件,那么A就要先告诉他们的爸组件,然后爸 ...

  2. U-Boot 内核 (一)

    1.首先安装Vmware,安装Ubuntu 15.04 (安装时记住用户名和密码) 2.终端命令Ctrl+Alt+T 3.进行准备工作 安装工具 sudo apt-get update sudo ap ...

  3. springmvc框架原理

    1.  用户发送请求至前端控制器DispatcherServlet 2.  DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.  处理器映射器根据请求url ...

  4. ios 个推推送集成

    个推推送总结: 个推第三方平台官网地址:http://www.getui.com/cn/index.html 首先去官网注册账号,创建应用,应用的配置信息,创建APNs推送证书上传 P12证书(开发对 ...

  5. 构建高性能web站点-阅读笔记(一)

    看完前9章,也算是看完一半了吧,总结一下. 郭欣这个名字或许并不响亮,但是这本书写的确实真好!百度一下他的名字也能够看到他是某些公司的创始人和投资者,当然他本人必定是大牛无疑. 从网页的动静分离到网络 ...

  6. javaWEB与cookie

    Cookie1. Http协议与Cookie(了解)  * Cookie是HTTP协议制定的!先由服务器保存Cookie到浏览器,再下次浏览器请求服务器时把上一次请求得到Cookie再归还给服务器  ...

  7. iOS面试必看经典试题分析

    > **不用临时变量怎么实现两个数据的交换?** 方式一:加减法的运算方式求解new_b = a - b + b = a;new_a = a + b - a = b;一个简单的运算方式,最重要的 ...

  8. oracle索引(转)

    引,索引的建立.修改.删除 2007-10-05 13:29 来源: 作者: 网友评论 0 条 浏览次数 2986 索引索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完 ...

  9. 急速搭建SuperMap iCloudManager for Docker环境

    大家好,SuperMap iCloudManager 是超图的 GIS 云管理系统,它是出色的云GIS平台的大管家. 它很简单,部署操作都很简单. 它很智能,可以实时监控 GIS 业务环境的 CPU ...

  10. flume日志采集框架使用

    flume日志采集框架使用 本次学习使用的全部过程均不在集群上,均在本机环境,供学习参考 先决条件: flume-ng-1.6.0-cdh5.8.3.tar  去cloudrea下载flume框架,笔 ...