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

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

目录
相关文章
|
4月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制
本文深入探讨了Linux操作系统中用于管理多线程和进程的并发控制的关键技术,包括原子操作、锁机制、自旋锁、互斥量以及信号量。通过详细分析这些技术的原理和应用,旨在为读者提供一个关于如何有效利用Linux内核提供的并发控制工具以优化系统性能和稳定性的综合视角。
|
7天前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
42 16
|
4月前
|
缓存 负载均衡 算法
深入探索Linux内核的调度机制
本文旨在揭示Linux操作系统核心的心脏——进程调度机制。我们将从Linux内核的架构出发,深入剖析其调度策略、算法以及它们如何共同作用于系统性能优化和资源管理。不同于常规摘要提供文章概览的方式,本摘要将直接带领读者进入Linux调度机制的世界,通过对其工作原理的解析,展现这一复杂系统的精妙设计与实现。
204 8
|
4月前
|
算法 Linux 调度
深入理解Linux内核调度器:从基础到优化####
本文旨在通过剖析Linux操作系统的心脏——内核调度器,为读者揭开其高效管理CPU资源的神秘面纱。不同于传统的摘要概述,本文将直接以一段精简代码片段作为引子,展示一个简化版的任务调度逻辑,随后逐步深入,详细探讨Linux内核调度器的工作原理、关键数据结构、调度算法演变以及性能调优策略,旨在为开发者与系统管理员提供一份实用的技术指南。 ####
144 4
|
2月前
|
安全 Linux 测试技术
Intel Linux 内核测试套件-LKVS介绍 | 龙蜥大讲堂104期
《Intel Linux内核测试套件-LKVS介绍》(龙蜥大讲堂104期)主要介绍了LKVS的定义、使用方法、测试范围、典型案例及其优势。LKVS是轻量级、低耦合且高代码覆盖率的测试工具,涵盖20多个硬件和内核属性,已开源并集成到多个社区CICD系统中。课程详细讲解了如何使用LKVS进行CPU、电源管理和安全特性(如TDX、CET)的测试,并展示了其在实际应用中的价值。
|
2月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
152 15
|
4月前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
95 26
|
4月前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
134 17
|
3月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
3月前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####