原文:十天学Linux内核之第一天---内核探索工具类

  寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续待在实验室里想总结一下Linux内核编程,十天肯定完全掌握不了Linux内核,这里我也只是把自己认为不是很好懂并且很重要的难点疑点写出来,和大家一起分享,希望大家改正互相学习。

  Linux的具体概述这里就不多说了,今天主要讲的是Linux内核中常用的数据结构和语法的使用,并简述一些工具和实用程序,从而获取理解内核内幕所需要的信息,还会介绍一下在每个内核子系统所涉及的基本概念,并且粗略分析下子系统功能的必要代码。

  内核中常见的数据类型有链表、查找、树等等。链表可以说贯穿整个Linux内核,在Linux中,链表才常常以循环双向链表的形式出现,所以给定链表中的任一结点,均可以找到下一结点和前一结点,链表是个很重要的知识点,需要学学数据结构才能掌握,这里不多阐释,有关链表定义的所有代码可以在头文件include/linux/list.h中查看。至于查找算法,主要表现在大O表示法,它代表对于一个定值n在最坏情况下所花费的查找时间,另外就是数,数被用在Linux的内存管理中,能够有效访问并操作数据,前几天恶补了一下树的相关知识以及代码,收获颇丰,树在Linux中通常以链表和数组的形式实现,其中二叉树和红黑树在Linux中使用最多,这里提出来有助大家理解Linux的内核,这样可以更好的理解复杂的操作。

  作为一个操作系统,处理器当然是不可获取的知识点了,Linux的某些部分和它密切相关,汇编是最好理解底层的语言,因为在之前大二学过微机原理,在此就不介绍x86和PowerPC体系结构的汇编语言了。但是需要简述几个特殊的C语言用法,这里着眼Linux2.6内核中的常见C语言规范,澄清一下几个C语言知识。

  asmlinkage

  asmlinkage要使用局部堆栈来传递参数,这就涉及到了宏FASTCALL,它通知汇编程序使用通用寄存器来传递参数,下面举一个asmlinkage的例子:

asmlinkage long sys_gettimeofday(struct timeval *tv, struct timezone __user *tz)

  UL

  UL其实就是unsigned long啦,它告诉编译程序将这个数值当作long型数值处理,使用UL有助于编写出和体系结构无关的代码,内核中有些这样的例子,例如include/linux.h中

#define ULONG_MAX  (~0UL)

  inline

  inline 表明要优化 函数的可执行代码,Linux内核中时用的 inline函数大多被定义为static类型(static inline),,这样的申明意味着直接将它加入调用程序中,优点是可以免除函数调用的任何开销,不足之处在于使用inline会增加二进制映象的大小,因此会降低访问CPU高速缓存的速度,所以不能始终使用inline。

  const和volatile

  这两个真的很容易混淆并且不是很好懂,const不一定只代表常数有时会是“只读”的意思,这里提问一下“const int *x”和“int const * x”有什么区别??一下是一个const的例子

static inline void prefetch(const void *x)
{
__asm__ __volatile__ ("dcbt 0,%0" : : "r" (x));
}

  关键字volatile表明变量无需警告就可以被修改,它通知编译程序每次使用该变量时候都要重新加载其值,一下是include/linux/spinlock.h关于如何使用volatile的一个例子

typedef struct {
...
volatile unsigned int lock;
...
} spinlock_t;

  

  那么内核在运行当中有什么内部的奥秘呢,接下来介绍内核中常用的探究各种内核文件的工具。

  objdump/readelf

 objdump/readelf可以分别用于显示目标文件和ELF文件的任何信息,可以在终端上借助命令行参数使用命令来查看给定的目标文件的头文件、文件大小和结构,

  hexdump

 hexdump可以显示给定的十六进制/ASCII/八进制文件的内容。这些需要一些命令来举例,大家可以在实践的 时候自己去掌握如何使用hexdump这个命令

  nm

 nm可以列出指定目标文件的符号,能够显示符号的值,类型和名字。

  objcopy

 objcopy,看半个单词就知道是复制的意思,当你想复制一个目标文件而忽略或改变其某方面的内容时候,就可以使用该命令。

  ar

 ar命令最常用在Make文件中,它将一些常用的函数连接到单个库文件中,也可以将单个程序库中的目标文件分离出来,有助于维护链接程序时用的索引库函数库。

  当Linux系统更新后正在运行时,内核会记录一些消息,并提供整个操作过程系统的状态信息,那么我们怎么“倾听”内核的消息呢?下面介绍最常用的几种内核和终端对话的方式。

  printk()

 大家都知道printf()函数,那么为什么Linux为什么不使用呢,这是因为内核中没有链接标准C函数库,但是两者的接口是一样的 ,printk是在内核中运行的向控制台输出显示的函数,Linux内核首先在内核空间分配一个静态缓冲区,作为显示用的空间,然后调用sprintf,格式化显示字符串,最后调用tty_write向终端进行信息的显示。

  dmesg

 dmesg内核有多种方式可以用在存储日志和信息上,dmesg是一种程序,用于检测和控制内核环缓冲,可以用于显示存储在/proc/kmsg中的缓冲内容,并能够根据消息级别来选择是否过滤这个缓冲区,并且这个程序用来帮助用户了解系统的启动信息。

  /var/log/messages

 Linux系统的  /var/log/messages下存储的大都是已经登录系统的消息。 messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在 messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。

  

  小结:

  今天主要讲的就是这些,在探索Linux内核之前应该具备的基础知识和背景,对上述讲到的数据结构的基本了解有助于理解以后会讲到的进程和分页机制,关于内核、的工具集也是粗了点讲解了一下,但是需要在实际操作中多运用才能体会才能更加深刻的了解,有哪些问题希望大家指正。

 

  版权所有,转载请注明转载地址:http://www.cnblogs.com/lihuidashen/p/4236635.html

十天学Linux内核之第一天---内核探索工具类的更多相关文章

  1. 十天学Linux内核之第八天---构建Linux内核

    原文:十天学Linux内核之第八天---构建Linux内核 今天是腊八节,说好的女票要给我做的腊八粥就这样泡汤了,好伤心,好心酸呀,看来代码写久了真的是惹人烦滴,所以告诫各位技术男敲醒警钟,不要想我看 ...

  2. 十天学Linux内核之第七天---电源开和关时都发生了什么

    原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...

  3. 十天学Linux内核之第四天---如何处理输入输出操作

    原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...

  4. 十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见)

    原文:十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见) 非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的 ...

  5. 十天学Linux内核之第九天---向内核添加代码

    原文:十天学Linux内核之第九天---向内核添加代码 睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种 ...

  6. 十天学Linux内核之第六天---调度和内核同步

    原文:十天学Linux内核之第六天---调度和内核同步 心情大好,昨晚我们实验室老大和我们聊了好久,作为已经在实验室待了快两年的大三工科男来说,老师让我们不要成为那种技术狗,代码工,说多了都是泪啊,, ...

  7. 十天学Linux内核之第五天---有关Linux文件系统实现的问题

    原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...

  8. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  9. 十天学Linux内核之第二天---进程

    原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...

随机推荐

  1. 【原创】leetCodeOj --- Interleaving String 解题报告

    题目地址: https://oj.leetcode.com/problems/interleaving-string/ 题目内容: Given s1, s2, s3, find whether s3  ...

  2. 191. Number of 1 Bits Leetcode Python

    Write a function that takes an unsigned integer and returns the number of '1' bits it has (also know ...

  3. 抓取csdn上的各类别的文章 (制作csdn app 二)

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23532797 这篇博客接着上一篇(Android 使用Fragment,View ...

  4. 深入理解spring中的各种注解(转)

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  5. WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

    原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

  6. 【Web探索之旅】第一部分:什么是Web?

    内容简介 1.Web探索之旅:开宗明义 2.第一部分第一课:什么是Web? 3.第一部分第二课:Web,服务和云 4.第一部分第三课:Web的诞生史 Web探索之旅:开宗明义 大家好. 我们这个系列课 ...

  7. 黑马程序员—创建JDBC框架及原理分析

    对于Java数据库的连接,由最初学习的每次全部手工代码,到后面的不断利用知识简化代码量:这是不断学习的过程,就像人类由原始社会的钻木取火到当代的文明,都是一步步过来的! 本文不从最开始的JDBC入门开 ...

  8. VS2010使整个过程说明了安装包

    该项目的第一个版本出来,要成为一个包,很长一段时间没做了一些被遗忘,上差了差资料,写了一个,总结下,可能还不是非常完好,仅作參考. 1.首先在打开 VS2010    >新建>项目 2.创 ...

  9. java流的性能优化1-文件复制

    传统的I/O速度相对照较慢,它会成为系统性能的瓶颈,所以在java1.4之后提供了NIO,它是一种全新的流:它具有下面特性: 1.为全部的原是类型提供Buffer缓存支持: 2.使用java.nio. ...

  10. w3wp占用CPU过高

    w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...