`
java-mans
  • 浏览: 11711306 次
文章分类
社区版块
存档分类
最新评论

随想录(在实践中学习kernel代码)

 
阅读更多


【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】


记得我在读书的时候,虽然老师也教过操作系统的课程,但是自己的理解却不是很充分,实践部分的内容就更少。对于课程中的内容,比如说中断、互斥、线程、IO等概念常常也是一知半解,没有什么特别深刻的体会。等到毕业后,自己开始花钱买一些国外作者写的书,认识上有了很大的改变,但是自己真正动手写代码、调试的部分还是太少。等到去年的时候,自己开始在pc上面仿真ucos系统的时候,对每一行代码进行单步调试的时候,才真正从本质上理解了系统本身。


当然,我对很多计算机课程的认识,原来都是基本停留在书本上面。不管是计算机网络、编译原理还是人机界面,书本上的知识点虽然大概也知道些,但是你要说理解得有多透彻却说不上来。等到自己真正阅读了lwip、lua和ftk的相关代码,你才会大呼一声,原来是这么回事,好像也不是很复杂。所以,对于计算机的知识,要想把自己的认识提高一个层次的话,最好的方法就是实践。


在国内,喜欢研究linux的人很多,但是大多数朋友对linux kenel的理解只是停留在书本上面、视频上面以及ppt上面。真正自己动手做实验、把每一行代码都弄懂弄明白的朋友却不是那么多。其实,和以前相比,现在的linux版本更多、也更稳定,资源也特别丰富。就我个人认为,linux系统是学习计算机最好的系统。因为在这么一个系统上面,没有人帮你,很多的困惑都需要自己去解决,只有去克服一个一个难点,你才能感受到自己确实实在进步。这种进步不是停留在学会了某种配置、安装了某种软件、熟悉了某种环境,而在于你对系统本身的认识更高了,看问题的角度发生改变了。


在书店里面,介绍linux基本软件开发的书特别多,但是却有很少的书介绍如何在linux进行kernel的学习、编译、调试,哪些调试工具比较合适等等。他们做的就是直接把答案告诉你,至于为什么这样设计,交代的内容却很少。一方面这方面的需求比较少,另外一方面这些知识点有点难度,不易被大家接受。实际上,这里大家存在一个误区,现在的linux kernel开发其实不是那么难,你所需要的其实就是一个pc、一根网线,这样你就获得了学习的全部资源。下面内容主要是介绍给大家如何学习linux kernel,特别是如何在实践中学习。


(1)选择一个合适linux发行版本,我自身选用的版本是CentOS 6,使用非常方便


(2)从www.kernel.org下载kernel代码,学习如何编译linux 内核,其实步骤也不复杂


a)解压linux内核版本

b)cd linux目录

c)cp /boot/config-2.6.32-220.el6.i686 .config

d) make menuconfig

e)保存,直接exit退出

f)make bzImage

g) make modules

h) make modules_install

i) make install


(3) 重启电脑,开机选用新的linux 内核。开始编写hello.c文件,生成模块,利用模块与linux内核函数进行互动,用dmesg -c查看打印

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("feixiaoxing");
MODULE_DESCRIPTION("This is just a hello module!\n");

static int __init hello_init(void)
{
    printk(KERN_EMERG "hello, init\n");
    dump_stack();
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_EMERG "hello, exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

(4)安装elfutils-devel,systemtap安装包,用stap -v *.stp开始分析内核。你要做的就是插入调试点,编写脚本文件,自由分析内核的代码内容,


a)基础打印

probe begin{
        printf("hello begin!\n")
}

probe end{
        printf("hello end!\n")
}

b)定时打印

global number

probe begin
{
    number = 0
}

probe timer.ms(5000)
{
    number ++
    printf ("%d\n", number)
}

probe end
{
    number = 0
}

c)统计syscall调用

global syscalls

function print_top () {

        cnt = 0
        log ("SYSCALL\t\t\tCOUNT")
        foreach ([name] in syscalls-) {
                printf("%-20s  %5d\n",name, syscalls[name])
                if (cnt++ == 20)
                        break
        }

        printf("--------------------------------------\n")
        delete syscalls
}

probe kernel.function("sys_*") {
        syscalls[probefunc()]++

}

# print top syscalls every 5 seconds
probe timer.ms(5000) {
        print_top ()
}

d)统计schedule函数被调用的次数

global count

probe kernel.function("schedule")
{
    count ++
}

probe begin{
    count = 0
}

probe end{
    printf("count = %d\n", count);
}

e)打印回调堆栈

global count

probe kernel.function("schedule").return
{
    if(!count)
        print_backtrace()

    count ++
}

probe begin{
    count = 0
}

probe end{
}


f)记录一次进程切换

global count

probe begin
{
    count = 0
}

probe kernel.function("__switch_to")
{
    if(!count)
    {
        printf("from [%s] to [%s]\n", task_execname($prev_p), task_execname($next_p))
    }

    exit()
}

probe end
{
}

更多关于systemtap的范例,可以参考《systemtap language reference》这本手册。





分享到:
评论

相关推荐

    《代码随想录》最新PDF全集整理发布

    内容概要:这是关于作者针对自己的代码学习笔记《代码随想录》,进行两年后的全面更新与汇总的一则公告。新的PDF版本整合了所有最新内容,并修复和完善了一系列题目解释。尽管如此,作者仍推荐优先在网站上阅读以...

    代码随想录+刷题笔记记录

    刷题笔记记录是代码随想录提供的一个功能,用于记录用户在刷题过程中的解题思路和方法。它可以帮助用户更好地理解和掌握题目解法,加深对算法和数据结构的理解。 ## 如何使用刷题笔记记录 使用刷题笔记记录非常...

    代码随想录算法PDF.zip

    通过学习《代码随想录》中的算法知识,不仅可以提升编程技能,还能帮助开发者在面试中脱颖而出,解决实际工作中遇到的复杂问题。无论你是初学者还是有经验的开发者,这本书都能提供宝贵的指导。阅读PDF版,你可以...

    代码随想录的pdf版本,需要准备秋招的小伙伴们看过来呀!

    通过学习《代码随想录》,你可以系统地了解和掌握这些基础知识,为面试和工作中的问题解决做好准备。 书中可能包含以下核心知识点: 1. **基础数据结构**:数组、链表、栈、队列、哈希表、二叉树等。理解这些数据...

    代码随想录算法PDF.rar

    《代码随想录》通过实例引导读者逐步掌握这些知识,每个算法都会配合C++代码进行详细解释,使读者能够在实践中巩固理论知识。这本书是提升编程思维、熟练运用C++解决实际问题的理想教程。通过阅读和实践书中的例子,...

    代码随想录知识算法讲解PDF

    代码随想录贪心算法知识,非常管用

    代码随想录 动态规划、回溯、递归、二叉树、贪心

    在《代码随想录》中,读者可以学习到如何利用递归或迭代的方式处理二叉树问题。 贪心(Greedy)策略是一种局部最优的选择,每次选择当前看起来最好的选项,希望整体结果也是最优的。贪心算法适用于背包问题、活动...

    「代码随想录」二叉树专题精讲(v2.0).pdf

    「代码随想录」二叉树专题精讲(v2.0)是一套涵盖二叉树基础知识、遍历算法、递归与非递归实现、BST、AVL树等...总的来说,「代码随想录」二叉树专题精讲(v2.0)内容详实,讲解深入浅出,适合各种水平的程序员学习。

    「代码随想录」动态规划专题精讲(v1.2).pdf

    从给定的文件信息来看,「代码随想录」动态规划专题精讲(v1.2).pdf 的内容涉及到编程算法中的动态规划专题的精讲。动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息...

    代码质量随想录

    在编程世界里,代码质量的重要性不言而喻。"代码质量随想录"是一系列文档,旨在引导初学者和有经验的开发者优化他们的编码习惯...通过学习这些原则和技巧,开发者可以在编程旅程中不断进步,逐步成长为真正的代码高手。

    《代码随想录》双指针算法及其应用详解

    本文围绕程序员Carl撰写的《代码随想录》,全面系统地阐述了一系列重要的利用双指针算法解决编程问题的方法,并深入解析了其背后的逻辑与实现细节...且对于希望高效刷题的学习者而言,《代码随想录》系列资源十分宝贵。

    软件随想录 软件随想录

    《软件随想录》以其深刻的洞察力和实用的建议,为软件开发者和管理者提供了宝贵的指导,帮助他们在复杂多变的软件世界中找到正确的方向。无论是初入行的新手还是经验丰富的老兵,都能从中获益良多。

    软件随想录全集

    总之,《软件随想录》是对软件开发实践的深度反思,是每一位开发者和项目经理宝贵的参考资料,它提供了许多实用的工具和理念,可以帮助我们构建更好的软件,提高工作效率,以及培养更优秀的开发团队。

    《代码随想录》LeetCode 刷题攻略:200道经典题目刷题顺序,共60w字的详细图解,视频难点剖析,50余张思维.zip

    《代码随想录》中的200道题目按照难度和知识点进行了编排,从基础到进阶,逐步提升学习者的编程能力。 3. **数据结构**: 数据结构是解决问题的基础,包括数组、链表、栈、队列、哈希表、树(二叉树、平衡树)、图...

    软件随想录+程序员必读pdf

    《软件随想录》是许多程序员和IT从业者都推崇的一本书,它深入探讨了软件开发过程中的各种问题,包括团队协作、项目管理、代码质量、技术债务等关键议题。这本书结合作者的经验,提供了许多实用的建议,旨在帮助...

    「代码随想录」程序员求职攻略(v1.0).pdf

    标题“「代码随想录」程序员求职攻略(v1.0)”和描述“「代码随想录」程序员求职攻略”暗示这份文件应该包含了一些针对程序员求职过程的建议和策略。考虑到“算法”作为标签,我们可以合理推测文档中可能涵盖了以下...

    软件随想录(中英文)

    总的来说,《软件随想录》是一本全面剖析程序员成长历程的书籍,无论你是刚入门的新手,还是已经在行业中摸爬滚打的老兵,都能从中获取有价值的信息和启示,帮助你在软件开发的道路上不断前行。通过阅读和实践书中的...

    「代码随想录」回溯算法精讲(v1.1).pdf

    虽然文件标题和描述中提到了“代码随想录”、“回溯算法精讲”和“背包问题专题精讲”,但具体内容部分的文字存在识别错误,并且信息不完整。尽管如此,我们依旧可以根据描述和部分内容提供的信息,梳理出回溯算法和...

    「代码随想录」背包问题专题精讲(v1.0).pdf

    「代码随想录」背包问题专题精讲(v1.0)

Global site tag (gtag.js) - Google Analytics