前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫

【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫

作者头像
20岁爱吃必胜客
发布2022-11-13 10:08:27
1.7K0
发布2022-11-13 10:08:27
举报
文章被收录于专栏:进步集

文章目录


🍃博主昵称:一拳必胜客 博主主页面链接:博主主页传送门 博主专栏页面连接:专栏传送门–计算机考研 🍑创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流,同时给同样感兴趣的朋友以参考; 博主研究方向:渗透测试、嵌入式、机器学习; 🌸博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ; ‘’

特别鸣谢:木芯工作室 、Ivan from Russia


为什么会写这样一篇“无效水文”,我想是由于我的这样一种强迫症,对于任何的学习,在不理解原理,无法把他与我的已知知识架构产生联系的时候,我会本能地拒绝这种知识,所以由于这种偏执,很多情况下拖慢了自己的进度,因为很多时候无法有效收集到有用的资料,软件实训的时候,老师只会丢给一个配置文件,然后在此基础上做一些修改开发,可以除了可以勉强做一个垃圾出来,没有任何意义。就连再去做一个垃圾的能力都没有。这种情况直到毕业我才感觉无法再继续这样的生活了,于是开始大量学习,阅读专业书籍。这次就想对这些原本困扰我的东西进行一次小的抛砖引玉式的总结,当然也是把别人已经写过的一些文章综合一下,让入门的人对此好奇的人产生初步印象。 总之,人生没有白走的路。五年之前你正在梦想你今天的生活。 还有,当我们在经历冬季的时候,新西兰正被春风吹拂。所以做自己认为对的事情吧。

1. Linux kernel

1. 源代码目录结构分析

1、Linux 内核源代码包括三个主要部分

1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理、linux初始化等。 2)非核心代码:例如库文件(因为 Linux 内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、 KVM(虚拟机技术)等。 3)编译脚本、配置文件、帮助文档、版权说明等辅助性文件

在这里插入图片描述
在这里插入图片描述

include/内核头文件,需要提供给外部模块(例如用户空间代码)使用kernel/ : Linux 内核的核心代码,包含了 进程调度子系统,以及和进程调度相关的模块。 mm/内存管理子系统 fs/ ---- VFS 子系统。虚拟文件系统(Virtual File System,简称 VFS)是 Linux 内核的子系统之一 net/ ---- 不包括网络设备驱动的网络子系统。 ipc/ ---- IPC(进程间通信)子系统。 arch// ---- 体系结构相关的代码,例如 arm, x86 等等。 arch//mach- ---- 具体的 machine/board 相关的代码。 arch//include/asm ---- 体系结构相关的头文件。 arch//boot/dts ---- 设备树( Device Tree)文件。 init/ ---- Linux 系统启动初始化相关的代码。 block/ ---- 提供块设备的层次。 sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 drivers/ ---- 设备驱动 lib/ ---- 实现需要在内核中使用库函数,例如 CRC、 FIFOlistMD5 等。 crypto/ ----- 加密、解密相关的库函数。 security/ ---- 提供安全特性( SELinux)。 virt/ ---- 提供虚拟机技术( KVM 等)的支持。 usr/ ---- 用于生成 initramfs 的代码。/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;所有系统默认的软件都会放置到/usr, 系统安装完时,这个目录会占用最多的硬盘容量 firmware/ ---- 保存用于驱动第三方设备的固件。 samples/ ---- 一些示例代码。 tools/ ---- 一些常用工具,如性能剖析、自测试等。 Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。 COPYING ---- 版权声明。 MAINTAINERS —-维护者名单。 CREDITS ---- Linux 主要的贡献者名单。 REPORTING-BUGS ---- Bug 上报的指南。 Documentation, README ---- 帮助、说明文档

2. linux内核模块编程入门

这里的printk就是print kernal,意思是输出到内核,输出到日志文件

模块插入执行初始化lkp__init()函

模块卸载执行退出函数lkp__exit() 代码示例:

代码语言:javascript
复制
//任何模块都要包含的三个头文件
#include <linux/module.h>    //(module<n>模块; 功能块)包含了对模块的版本控制
#include <linux/kernel.h>    //包含了常用的内核函数
#include <linux/init.h>    //包含了宏__init(告诉编译程序仅初始化的函数和变量)和__exit()
/*
    模块的初始化函数lkp_init()
    __init是用于初始化的修饰符
*/
static int __init lkp_init(void)    //加载函数的入口函数 相当于 main(void)
{
    printk("<1>Hello,world!from the kernel space...\n");//Linux内核下内核编程不能使用c的库
}
/*   
    模块的退出和清理函数lkp_exit()    //入口相对的出口
*/
static void __exit lkp(void)
{
    printk("<1>Goodbye,world!leaving kernel space...\n");
}
/*
    调用函数
*/
module_init(lkp_init);
module_exit(lkp_exit);
/*
    模块的许可证声明GPL
*/
MODULE_LICENSE("GPL");

3. 如何编译内核模块

内核模块的编译需要与常规用户空间应用程序略有不同。 以前的内核版本要求我们关注这些设置,这些设置通常存储在Makefile中。 虽然按层次结构组织,但许多冗余设置在次级Makefile中累积并使它们变大并且难以维护。 幸运的是,有一种新方法可以做这些事情,称为kbuild,外部可加载模块的构建过程现在完全集成到标准内核构建机制中。 要了解有关如何编译不属于官方内核的模块的更多信息(例如本指南中的所有示例),请参阅文件 linux / Documentation / kbuild / modules.txt 。

那么,让我们看一个简单的Makefile来编译一个名为hello-1.c的模块

代码语言:javascript
复制
obj-m += hello-1.o
 
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
 
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

核心思想:告诉哪个头文件放在哪些地方

在这个文件里定义了三个变量

  1. 路径的变量
  2. 内核版本号变量
  3. 内核源代码所在路径变量
在这里插入图片描述
在这里插入图片描述

内核模块插入到内核里 超级用户的权限插入

#insmod + 模块名.ko

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

———————————————— 版权声明:本文为CSDN博主「Decker丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_45479529/article/details/124429480

4. 源码在线阅读的网站

源码在线阅读 源码在线阅读2 linux内核编程入门

参考原文

linux内核源码分析笔记

2. 内核常用数据结构

Linux 内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树。 linux内核源码分析笔记

3. TTY

在 Linux 中,TTY也许是跟 终端 有关系的最为混乱的术语。. TTY是TeleTYpe的一个老缩写。. Teletypes,或者teletypewriters,原来指的是 电传打字机 ,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老的 电报机 区别并不是很大。. 之后,当计算机只能以 批处理 方式运行时(当时穿孔卡片 阅读器 是唯一一种使程序载入运行的方式),电传打字机成为唯一能够被使用的“实时”输入/ 输出设备 。. 最终,电传打字机被键盘和显示器终端所取代,但在终端或TTY接插的地方,操作系统仍然需要一个程序来监视 串行端口 。. 一个getty“Get TTY”的处理过程是:一个程序监视物理的TTY/终端接口。.

4. 晶振

晶振是一个被加了电压就会产生稳定节拍的东西,我们只需要找一个东西去记录节拍,便可以达到作为一个时钟信号的产生器。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. Linux kernel
    • 1. 源代码目录结构分析
      • 2. linux内核模块编程入门
        • 3. 如何编译内核模块
          • 4. 源码在线阅读的网站
          • 参考原文
          • 2. 内核常用数据结构
          • 3. TTY
          • 4. 晶振
          相关产品与服务
          网站渗透测试
          网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档