首页 > 其他分享 >随想录(在实践中学习kernel代码)

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

时间:2022-11-23 13:05:45浏览次数:37  
标签:count kernel probe 随想录 exit linux 在实践中 hello




    记得我在读书的时候,虽然老师也教过操作系统的课程,但是自己的理解却不是很充分,实践部分的内容就更少。对于课程中的内容,比如说中断、互斥、线程、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
{
}






标签:count,kernel,probe,随想录,exit,linux,在实践中,hello
From: https://blog.51cto.com/feixiaoxing/5881006

相关文章

  • 随想录(开源代码的学习方法)
     一、历史    开源代码作为一种特色的产物,随着物联网的进步得到了前所未有的发展。一开始,很多代码其实不是开源工程,后来软件的开发商发现根本没法用这些代码来挣钱,所......
  • 随想录(用好红黑树)
      红黑树作为一种特殊类型的二叉树,在软件中有很多的用处。但是在网络上面,讲解红黑树的文章和博客很多,可是真正找一份可以信赖的、方便使用的红黑树代码却不多。本篇文章......
  • 随想录(招聘怎样的员工)
      对很多IT公司来说,招聘都是一件大事。无论是校园招聘、社会招聘,公司都会投入到很大的人力和财力来开展招聘工作。一个公司的人员构成,很大程度上决定了这个公司的业务形......
  • 代码随想录第四十二天 | 动态规划
    今天是第四十二天,是动态规划中的背包问题 416.分割等和子集classSolution{publicbooleancanPartition(int[]nums){intsum=0;intn......
  • 随想录(关于培训)
      目前,社会上的培训很多,有技能型的培训、有团队建设的培训,还有一些少儿培训、应试培训和领导力培训。当然,其中最扯的就是成功学培训,当然今天我们不说它。我们谈一谈关于......
  • 随想录(移动app下的生活)
        我算不上很潮的人,使用移动app的时间也非常短。换成android手机也是最近一年的事情,但是它对我生活的影响还是蛮大的。这两个星期,我利用年假出去旅游了一番,收获还是......
  • 随想录(rtos和一般os的区别)
       现在在网上可以看到代码的os很多,既有rtos类型的微内核代码,也有大型的linuxkernel代码。大型的os代码包括的内容很多,就拿linux来说,它就包括了调度、文件、网络、驱动......
  • 随想录(字节序和位序)
        最近家里面没有了网络,所以写文章的次数也少了。所以,暂时只能利用一下公司加班的时间,补充一下最近的心得。曾经有一段时间,自己对字节序和位序不是很清楚。所以,前......
  • 随想录(软件调试)
       对于很多程序员朋友来说,编写代码要比调试代码快乐的多。似乎创造软件比维护软件更能给人带来成就感。然而,在企业里面维护前人留下的代码也是工作中不可缺少的一项内......
  • 随想录(写给自己的C++编程规范)
       对于我这样一个C语言的程序员来说,编写C++的机会其实不太多。但是我还是比较喜欢写C++语言,原因主要有几个方面:(1)自己学C++语言的时间比较长了,也比较了解,如果从大一的时......