(5)网络协议栈专题【视频讲解】】
协议栈(英语:Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。协议套件中的一个协议通常是只为一个目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和其他两个通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互。每个高级的层次增加更多的特性。用户应用程序只是处理最上层的协议。使用最广泛的是英特网协议栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL等),运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI等),物理层。
在实际中,协议栈通常分为三个主要部分:媒体,传输和应用。一个特定的操作系统或平台往往有两个定义良好的软件接口:一个在媒体层与传输层之间,另一个在传输层和应用程序之间。
媒体到传输接口定义了传输协议的软件怎样使用特定的媒体和硬件(“驱动程序”)。例如,此接口定义的TCP/IP传输软件怎么与以太网硬件对话。这些接口的例子包括Windows和DOS环境下的ODI和NDIS。
应用到传输接口定义了应用程序如何利用传输层。例如,此接口定义一个网页浏览器程序怎样和TCP/IP传输软件对话。这些接口的例子包括Unix世界中的伯克利套接字和微软的Winsock。
【 强烈推荐阅读】嵌入式必备:如何学习Linux内核网络协议栈
趣谈网络协议栈(一):套接字缓冲区原理
趣谈网络协议栈(二):数据包是如何处理的过程
趣谈网络协议栈(三):七层模型下三层数据通信
趣谈网络协议栈(四):传输的Arp报文结构
趣谈网络协议栈(五):Socket编程常用函数的原理及代码实现
趣谈网络协议栈(六):学习select和poll函数的内核实现
趣谈网络协议栈(七):Epoll从用户态到内核态过程分析
趣谈网络协议栈(八):套接字发送网络数据的过程
(6)设备驱动专题【视频讲解】
设备驱动程序是一种计算机程序,用于操作或控制连接到计算机的特定类型的设备。驱动程序提供了通往硬件设备的软件接口,从而使操作系统和其他计算机程序可以访问硬件功能,而无需知道有关所使用硬件的确切细节。
驱动程序通过硬件连接到的计算机总线或通信子系统与设备进行通信。当调用程序调用驱动程序中的例程时,驱动程序向设备发出命令。设备将数据发送回驱动程序后,驱动程序可以调用原始调用程序中的例程。驱动程序依赖于硬件且特定于操作系统。它们通常提供任何必要的异步时间相关的硬件接口所需的中断处理。
设备驱动基础架构(一):I/0体系结构
设备驱动基础架构(二):系统总线(PC1、ISA、SCSI、 USB等)
设备驱动基础架构(三):与外设交互及控制设备
设备驱动基础架构(四):访问设备详解
设备驱动基础架构(五):内核块设备详解
设备驱动基础架构(六):块设备1/0操作集合及 源码分析
设备驱动基础架构(七):通用磁盘及分区源码分析
Linux设备模型(一):深度剖析LDM
Linux设备模型(二):LDM数据结构分析
Linux设备模型(三):设备驱动程序原理与实现
Linux设备模型(四):kobject结构分析
Linux设备模型(五):kobj_ _type/内核对象集合
Linux设备模型(六):sysfs文件及属性
Linux设备模型(七):轮询sysfs属性文件
字符设备操作(一):主设备与次设备
字符设备操作(二):打开设备文件
字符设备操作(三):分配与注册字符设备
字符设备操作(四):写文件操作实现
字符设备操作(五):open/release方法
字符设备操作(六):read/wr ite方法
字符设备操作(七):Iseek/po11方法
字符设备操作(八):填充file_ operations结构体
块设备操作(一):块设备表示与数据结构
块设备操作(二):向系统添加磁盘及分区
块设备操作(三):打开块设备文件
块设备操作(四):B10数据结构
块设备操作(五):1/0调度
块设备操作(六):ioctl 系统调用
块设备操作(七):总线系统模块
块设备操作(八):ISA总线
块设备操作(九):PCI/PCI-E总线
块设备操作(十):USB总线
块设备操作(十一):通用驱动程序模型
浅谈设备驱动(一):操作系统 I/O 流程详解
浅谈设备驱动(二):Linux操作系统学习之字符设备
浅谈设备驱动(三):结合设备信息集合,探究设备和驱动是如何绑定的
(7)文件系统【视频讲解】
虚拟文件系统(VFS)是Linux内核的一个非常有用的方面,因为它为文件系统提供了一个通用的接口抽象。VFS在SCI和内核支持的文件系统之间提供了一个交换层(参见图4)。
文件系统类型与文件模型研究(零):一文让你彻底了解Linux内核文件系统(大总结)
文件系统类型与文件模型研究(一):磁盘文件系统(DF)
文件系统类型与文件模型研究(二):网络文件系统(NF)
文件系统类型与文件模型研究(三):i node
文件系统类型与文件模型研究(四):链接
文件系统类型与文件模型研究(五):AP|编程接口
文件系统类型与文件模型研究(六):VFS数据结构
文件系统类型与文件模型研究(七):超级块(super_ block)
文件系统类型与文件模型研究(八):挂载描述符 (mount结构体)
文件系统类型与文件模型研究(九):索引结点(inode结构体)
文件系统类型与文件模型研究(十):目录项缓存(dentry结构体)
文件系统类型与文件模型研究(十一):文件系统调用打开/关闭文件
文件系统类型与文件模型研究(十二):文件系统调用创建/删除文件
文件系统类型与文件模型研究(十三):文件系统调用读/写文件实现
文件系统类型与文件模型研究(十四):文件回写技术原理/接口实现
文件系统类型与文件模型研究(十五):挂载文件系统系统调用mount处理流程
文件系统类型与文件模型研究(十六):挂载文件系统绑定挂载/挂载命名空间
文件系统类型与文件模型研究(十七):挂载文件系统挂载/注册rootfs文件系统
磁盘文件系统(一):Ext2文件系统
磁盘文件系统(二):Ext2物理结构
磁盘文件系统(三):Ext2数据结构分析
磁盘文件系统(四):Ext2文件系统操作
磁盘文件系统(五):Ext4_ 日志JBD2
磁盘文件系统(六):Ext4文件系统特性
磁盘文件系统(七):Ext4文件系统数据结构
磁盘文件系统(八):Ext4_日志JBD2
数据同步(一):内核定时器
数据同步(二):原子操作与屏障
数据同步(三):自旋锁机制
数据同步(四):自旋锁的实现与变体
数据同步(五):spin_ lock()/raw_ spin_ lock() 函数分析
数据同步(六):互斥锁
数据同步(一):mutex数据结构分析
数据同步(一):互斥锁的快速与慢速通道
数据同步(一):乐观自旋锁等待机制
数据同步(一):mutex_ un lock()函数分析
数据同步(一):读写锁与RCU
(8)网络堆栈
网络堆栈的设计遵循模拟协议本身的分层架构。回想一下,互联网协议(IP)是传输协议(通常称为传输控制协议或TCP)下的核心网络层协议。TCP是上面的套接字层,通过SCI调用。套接字层是网络子系统的标准API,它为各种网络协议提供了一个用户接口。从原始帧访问到IP协议数据单元(PDU),再到TCP和用户数据报协议(UDP),套接字层提供了一种标准化的方式来管理连接并在各种端点之间移动数据。内核网络源代码可以在。/linux/net。
(9)设备驱动程序
Linux内核很多代码都在设备驱动里,可以运行特定的硬件设备。Linux源码树提供了一个驱动子目录,该子目录又进一步划分为各种支持设备,如蓝牙、I2C、串口等。设备驱动程序的代码可以在。/Linux/驱动程序。
(10)依赖体系结构的代码
虽然Linux很大程度上独立于运行的架构,但为了正常运行和实现更高的效率,一些元素必须考虑架构。的。/linux/arch子目录定义了内核源代码中依赖于架构的部分,其中包含了各种特定于架构的子目录(它们共同构成了BSP)。对于典型的桌面系统,使用x86目录。每个架构子目录包含许多其他子目录,每个子目录专注于内核的特定方面,如引导、内核、内存管理等。这些依赖于架构的代码可以在。/linux/arch。
如果Linux内核的可移植性和效率不够好的话,Linux还提供了一些其他的特性,不能归入以上几类。作为生产操作系统和开源软件,Linux是测试新协议及其增强的良好平台。Linux支持大量的网络协议,包括典型的TCP/IP,以及高速网络的扩展(大于1千兆以太网[GbE]和10 GbE)。Linux还可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了比TCP更高级的特性(它是传输层协议的继承者)。Linux也是一个动态内核,支持动态添加或删除软件组件。它们被称为可动态加载的内核模块,可以由用户根据需要在引导时插入(目前,一个特定的设备需要这个模块),也可以在任何时候插入。Linux的最新增强是可以作为其他操作系统使用的操作系统(称为hypervisor)。最近,内核被修改并被称为基于内核的虚拟机(KVM)。这一修改为用户空间启用了一个新的接口,允许其他操作系统在启用KVM的内核上运行。除了运行Linux的其他实例,Microsoft Windows也可以虚拟化。唯一的限制是底层处理器必须支持新的虚拟化指令。
(11)依赖体系结构的代码
虽然Linux很大程度上独立于运行的架构,但为了正常运行和实现更高的效率,一些元素必须考虑架构。的。/linux/arch子目录定义了内核源代码中依赖于架构的部分,其中包含了各种特定于架构的子目录(它们共同构成了BSP)。对于典型的桌面系统,使用x86目录。每个架构子目录包含许多其他子目录,每个子目录专注于内核的特定方面,如引导、内核、内存管理等。这些依赖于架构的代码可以在。/linux/arch。
如果Linux内核的可移植性和效率不够好的话,Linux还提供了一些其他的特性,不能归入以上几类。作为生产操作系统和开源软件,Linux是测试新协议及其增强的良好平台。Linux支持大量的网络协议,包括典型的TCP/IP,以及高速网络的扩展(大于1千兆以太网[GbE]和10 GbE)。Linux还可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了比TCP更高级的特性(它是传输层协议的继承者)。Linux也是一个动态内核,支持动态添加或删除软件组件。它们被称为可动态加载的内核模块,可以由用户根据需要在引导时插入(目前,一个特定的设备需要这个模块),也可以在任何时候插入。Linux的最新增强是可以作为其他操作系统使用的操作系统(称为hypervisor)。最近,内核被修改并被称为基于内核的虚拟机(KVM)。这一修改为用户空间启用了一个新的接口,允许其他操作系统在启用KVM的内核上运行。除了运行Linux的其他实例,Microsoft Windows也可以虚拟化。唯一的限制是底层处理器必须支持新的虚拟化指令。
(12)面试题/经验
【 强烈推荐阅读】从事十年嵌入式转内核开发(23K到45K),给兄弟们的一些建议
谈谈Linux内核的学习路线,具体要怎么学?
2022年嵌入式开发想进互联网大厂,你技术过硬吗?
嵌入式Linux内核学习经验总结,一篇让你掌握方法
盘点Linux内核(驱动开发,嵌入式,内核人群)必问的面试题
2022春招大厂-嵌入式开发经典笔试面试题目大整理
面试题一
1、什么是Linux?
2、Unix和Linux有什么区别?
3、什么是 Linux 内核?
4、Linux的基本组件是什么?
5、Linux 的体系结构
6、BASH和DOS之间的基本区别是什么?
7、Linux 开机启动过程?
8、Linux系统缺省的运行级别?
9、Linux 使用的进程间通信方式?
10、Linux 有哪些系统日志文件?
11、Linux系统安装多个桌面环境有帮助吗?
12、什么是交换空间?
13、什么是root帐户?
14、什么是LILO?
15、什么是BASH?
16、什么是CLI?
17、什么是GUI?
18、开源的优势是什么?
19、简单 Linux 文件系统?
20、Linux 的目录结构是怎样的?
21、什么是 inode ?
22、什么是硬链接和软链接?
23、RAID 是什么?
24、一台 Linux 系统初始化环境后需要做一些什么安全工作?
25、什么叫 CC 攻击?什么叫 DDOS 攻击?
26、什么是网站数据库注入?
27、Shell 脚本是什么?
28、可以在 Shell 脚本中使用哪些类型的变量?
29、Shell 脚本中 if 语法如何嵌套?
30、Shell 脚本中 case 语句的语法?
31、Shell 脚本中 for 循环语法?
32、Shell 脚本中 while 循环语法?
33、如何使脚本可执行?
34、在 Shell 脚本如何定义函数呢?
35、判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下?
36、添加一个新组为 class1 ,然后添加属于这个组的 30 个用户,用户名的形式为 stdxx ,其中 xx 从 01 到 30 ?
37、写一个 sed 命令,修改 /tmp/input.txt 文件的内容?
38、用户进程间通信主要哪几种方式?
39、通过伙伴系统申请内核内存的函数有哪些?
40、Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)
41、对文件或设备的操作函数保存在那个数据结构中?
42、Linux 中的文件包括哪些?
43、创建进程的系统调用有那些?
44、调用 schedule()进行进程切换的方式有几种?
45、Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的?
46、进程调度的核心数据结构是哪个?
47、如何加载、卸载一个模块?
48、模块和应用程序分别运行在什么空间?
49、Linux 中的浮点运算由应用程序实现还是内核实现?
50、模块程序能否使用可链接的库函数?
51、TLB 中缓存的是什么内容?
52、Linux 中有哪几种设备?
53、字符设备驱动程序的关键数据结构是哪个?
54、设备驱动程序包括哪些功能函数?
55、如何唯一标识一个设备?
56、Linux 通过什么方式实现系统调用?
57、Linux 软中断和工作队列的作用是什么?
58、Linux开机启动过程?
59、Linux系统缺省的运行级别
60、Linux系统是由那些部分组成?
61、硬链接和软链接有什么区别?
62、如何规划一台Linux主机,步骤是怎样?
63、查看系统当前进程连接数?
64、如何在/usr目录下找出大小超过10MB的文件?
65、添加一条到192.168.3.0/24的路由,网关为192.168.1.254?
66、如何在/var目录下找出90天之内未被访问过的文件?
67、如何在/home目录下找出120天之前被修改过的文件?
68、在整个目录树下查找文件“core”,如发现则无需提示直接删除它们。
69、有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?
70、每周一下午三点将/tmp/logs目录下面的后缀为*.log的所有文件rsync同步到备份服务器192.168.1.100中同样的目录下面,crontab配置项该如何写?
71、找到/tmp/目录下面的所有名称以"s1.jpg"结尾的普通文件,如果其修改日期在一天内,则将其打包到/tmp/back.tar.gz文件中
72、配置mysql服务器的时候,配置了auto_increment_increment=3,请问这里的3意味着什么?
73、详细说明keepalived的故障切换工作原理
74、什么是系统调用?
75、进程和线程的区别?
76、进程有哪几种状态?
77、进程间的通信方式
78、线程间的同步的方式
79、进程的调度算法
80、操作系统的内存管理主要是做什么?
81、常见的几种内存管理机制
82、快表和多级页表
83、分页机制和分段机制的共同点和区别
84、逻辑(虚拟)地址和物理地址
85、CPU 寻址了解吗?为什么需要虚拟地址空间?
86、什么是虚拟内存(Virtual Memory)?
87、局部性原理
88、虚拟存储器
89、虚拟内存的技术实现
90、页面置换算法
面试题二
1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?
3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户 id?查看指定帮助用什么命令?
4、Ls 命令执行什么功能?可以带哪些参数,有什么区别?
5、建立软链接(快捷方式),以及硬链接的命令。
6、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
7、使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?
8、查看文件内容有哪些命令可以使用?
9、随意写文件命令?怎么向屏幕输出带空格的字符串,比如”hello world”?
10、终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
11、移动文件用哪个命令?改名用哪个命令?
12、复制文件用哪个命令?如果需要连同文件夹一块复制呢?如果需要有提示功能呢?
13、删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?
14、Linux 下命令有哪几种可使用的通配符?分别代表什么含义?
15、用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)
16、Grep 命令有什么用?如何忽略大小写?如何查找不含该串的行?
17、Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?
18、怎么使一个命令在后台运行?
19、利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?
20、哪个命令专门用来查看后台任务?
21、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?
22、终止进程用什么命令? 带什么参数?
23、怎么查看系统支持的所有信号?
24、搜索文件用什么命令? 格式是怎么样的?
25、查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?
26、使用什么命令查看用过的命令列表?
27、使用什么命令查看磁盘使用空间?空闲空间呢?
28、使用什么命令查看网络是否连通?
29、使用什么命令查看 ip 地址及接口信息?
30、查看各类环境变量用什么命令?
31、通过什么命令指定命令提示符?
32、查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?
33、通过什么命令查找执行命令?
34、怎么对命令进行取别名?
35、du 和 df 的定义,以及区别?
36、awk 详解?
37、当你需要给命令绑定一个宏或者按键的时候,应该怎么做呢?
38、如果一个linux新手想要知道当前系统支持的所有命令的列表,他需要怎么做?
39、如果你的助手想要打印出当前的目录栈,你会建议他怎么做?
40、你的系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?
41、bash shell 中的hash 命令有什么作用?
42、哪一个bash内置命令能够进行数学运算?
43、怎样一页一页地查看一个大文件的内容呢?
44、数据字典属于哪一个用户的?
45、怎样查看一个linux命令的概要与用法?假设你在/bin目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?
(13)内核书籍
- 《深入了解Linux内核》
- 《Linux就该这么学》
- 《Linux内核完全注释V3.0书签版》
- 《Linux命令行大全 - 绍茨 (william E.shotts)》
- 《Linux命令速查手册》
- 《Linux性能优化大师》
- 《Linux环境编程:从应用到内核》
- 《Linux集群和自动化运维 余洪春》
- 《Linux驱动程序开发实例(第2版)》
- 《Linux高级程序设计(第3版)》
- 《构建高可用Linux服务器(第4版)》
书籍免费领取地址:
://docs.qq.com/doc/DTkZRWXRFcWx1b
WVx
三、怎么阅读源码
Linux庞大而复杂,其核心包括进程管理、内存管理、网络、文件系统和arch-entity="2 " >驱动,这些都依赖于内核提供的各种库和接口、各种内核机制以及arch下可能对应的汇编。没有这些基础,要流畅的阅读代码就有点困难了。
Linux的代码量很大,而且是在gcc的基础上开发的,针对各种场景做了大量的优化。所以第二件事就是要熟悉gcc下C的扩展用法,要有一个好的代码查看工具。推荐源洞察。
内核运行在特定的硬件平台上,所以对于底层涉及的部分有不同的arch实现,包括大量的汇编操作,所以以arm为例。如果想研究内核相应部分的代码,就必须多读,熟悉arm的官方文档。
而且代码和资料基本都是英文的,一般词汇和专业词汇都有,所以英语基础好很重要。这个没有捷径,就是多读书,当然也有积累的方法,后面会讲到。
每个模块都有很多细节。可能你年轻的时候记性好吧。你开发一个模块的时候,都读了好几遍了,所有的细节都不是很清楚。可能3、5年后再看就很难记住了,所以需要想办法形成积累。否则可能会忘记看,辛苦又低效。
内核编程有自己的风格和一些公认的规则,尤其是命名、排版、代码文件分类等。有些可能不符合规则,也可能很好,但如果大家都这样用,那自然就是所谓的艺术了,熟悉这些艺术有助于举一反三的学习其他模块的代码。
内核的代码量与日俱增,模块也越来越复杂,所以可维护性对于内核来说也是非常重要的。所以在如何更有利于以后的维护上做了很多努力。内核是操作系统的核心部分,其稳定性和性能自然非常重要。它用了很多技巧来应对。研究这些,积累起来,有利于进一步理解其原理。
边看代码边写注释和笔记。看了多少模块就注释多少模块,慢慢形成一个积累。这样的方式有什么好处呢?
- 记录你看代码过程中不熟悉或者不清晰的地方,或者你看明白了但是怕忘记的地方,这样等你下次再来看你能很快回忆起来,且不断刺激你的记忆神经能让你记忆的更牢固。
- 记录内核中用法的好处或者有疑问的地方,这样你再次来看的话可能会有新的体会,能在之前看代码的基础上形成一个不断积累的过程,理解会更加深刻。
- 当你将内核代码模块看的越来越多时,你会越看越轻松,当然是不是也会惊讶一下。轻松的是这个模块我看过,用法我熟悉,惊讶的是这个我虽然看过好多次,理解竟然有点不对。反反复复不断进行下去。
查看代码的工具
我这里推荐是source insight, 我一直用的3.5版本的。这里主要提几点技巧。
3.5里面默认只支持一部分文件格式,那么比如makefile是不支持的,arm汇编是不支持的,shell好像也是不支持的,所以这一部分的支持要自己添加。
内核里面用了大量的宏以及一些gnu c的扩展关键字,这些需要在source insight里面添加 上,这样你同步代码就不会有一些不认识的情况,当然除了source insight本身的一些bug外。
source insight自建快捷键以及扩展功能,这些网上也有很多好的,可以参考,能提高效率。
四、Linux内核体系
4.1Linux内核体系结构简析
顶部是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间下面是内核空间,Linux内核就位于这里。GNU C库(glibc)也在这里。它为内核提供了一个系统调用接口,也为用户空间应用程序和内核之间的转换提供了一个机制。这非常重要,因为内核和用户空间应用程序使用不同的受保护地址空间。每个用户空间进程使用自己的虚拟地址空间,而内核占用一个单独的地址空间。
Linux内核可以进一步分为3层。最上面是系统调用接口,实现一些基本功能,比如读写。系统调用接口下面是内核代码,可以更准确的定义为独立于架构的内核代码。这些代码对于Linux支持的所有处理器架构都是通用的。在这些代码下面是依赖于架构的代码,它构成了通常称为BSP(板支持包)的部分。这些代码用作给定架构的处理器和平台特定代码。
Linux内核实现了许多重要的架构属性。在更高或更低的层次上,内核被分成几个子系统。Linux也可以看做一个整体,因为它会把这些基础服务都集成到内核中。这与微内核的架构不同,微内核提供一些基本的服务,比如通信、I/O、内存、进程管理等。更具体的服务被插入到微内核层中。每个内核都有自己的优点,但这里不讨论这个。
随着时间的推移,Linux内核在内存和CPU使用上的效率很高,非常稳定。但对于Linux来说,最有意思的是,在这个规模和复杂度的前提下,它仍然具有良好的可移植性。经过编译后,Linux可以在大量具有不同架构约束和要求的处理器和平台上运行。例如,Linux可以运行在带有内存管理单元(MMU)的处理器上,也可以运行在不提供MMU的处理器上。linux内核的UClinux移植提供了对非MMU的支持。
Linux内核的主要组件有:系统调用接口、进程管理、内存管理、虚拟文件系统、网络堆栈、设备驱动程序、硬件架构的相关代码。
4.2内核模块
如果Windows已经安装了所有可用的驱动程序,而您只需要打开所需的驱动程序怎么办?这本质上就是内核模块为Linux所做的。内核模块,也称为可加载内核模块(LKM),对于保持内核在不消耗所有可用内存的情况下与所有硬件一起工作是必不可少的。
模块通常向基本内核添加诸如设备、文件系统和系统调用等功能。lkm的文件扩展名是。ko,它通常存储在/lib/modules目录中。由于模块的特性,您可以通过在启动时使用menuconfig命令将模块设置为加载或不加载,或者通过编辑/boot/config文件,或者使用modprobe命令动态加载和卸载模块,来轻松定制内核。第三方和封闭源代码模块在某些发行版中可用,如Ubuntu,默认情况下可能不会安装,因为这些模块的源代码不可用。该软件的开发商(即nVidia、ATI等。)不提供源代码,而是自己搭建模块,编译所需。用于分发的ko文件。虽然这些模块像啤酒一样是免费的,但它们不像语音一样是免费的,所以它们没有包含在一些发行版中,因为维护者认为它通过提供非自由软件来“污染”内核。内核并不神奇,但对于任何一台正常的电脑都是必不可少的。Linux内核不同于OS X和Windows,因为它包含内核级驱动程序,并使许多东西“开箱即用”。我希望你能更多地了解软件和硬件是如何配合工作的,以及启动电脑所需的文件。
五,学习Linux内核
学习linux内核不像学习语言。一个月或者三月就能掌握C或者java。学习linux内核需要循序渐进,掌握正确的linux内核学习路线非常重要。本文将分享一些学习linux内核的建议。
很多同学接触Linux不多,对Linux平台的开发更是一无所知。而现在的趋势越来越表明,作为一 个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段。下来我将会结合自己的几年的个人开发经验,及对 Linux,更是类UNIX系统,及开源软件文化,谈谈Linux的学习方法与学习中应该注意的一些事。
就如同刚才说的,很多同学以前可能连Linux是什么都不知道,对UNIX更是一无所知。所以我们从最基础的讲起,对于Linux及UNIX的历史我们不做多谈,直接进入入门的学习。
Linux入门是很简单的,问题是你是否有耐心,是否爱折腾,是否不排斥重装一类的大修。没折腾可以说是学不好Linux的,鸟哥说过,要真正了解Linux的分区机制,对LVM使用相当熟练,没有20次以上的Linux装机经验是积累不起来的,所以一定不要怕折腾。
由于大家之前都使用Windows,所以我也尽可能照顾这些“菜鸟”。我的推荐,如果你第一次接触Linux,那么首先在虚拟机中尝试它。虚拟机我推荐Virtual Box,我并不主张使用VM,原因是VM是闭源的,并且是收费的,我不希望推动盗版。当然如果你的Money足够多,可以尝试VM,但我要说的是即使是VM,不一定就一定好。付费的软件不一定好。首先,Virtual Box很小巧,Windows平台下安装包在80MB左右,而VM动辄600MB,虽然功能强大,但资源消耗也多,何况你的需求Virtual Box完全能够满足。所以,还是自己选。如何使用虚拟机,是你的事,这个我不教你,因为很简单,不会的话Google或Baidu都可以,英文好的可以直接看官方文档。
现在介绍Linux发行版的知识。正如你所见,Linux发行版并非Linux,Linux仅是指操作系统的内核,作为科班出生的你不要让我解释,我也没时间。
我推荐的发行版如下:
- UBUNTU适合纯菜鸟,追求稳定的官方支持,对系统稳定性要求较弱,喜欢最新应用,相对来说不太喜欢折腾的开发者。
- Debian,相对UBUNTU难很多的发行版,突出特点是稳定与容易使用的包管理系统,缺点是企业支持不足,为社区开发驱动。
- Arch,追逐时尚的开发者的首选,优点是包更新相当快,无缝升级,一次安装基本可以一直运作下去,没有如UBUNTU那样的版本概念,说的专业点叫滚动升级,保持你的系统一定是最新的。缺点显然易见,不稳定。同时安装配置相对Debian再麻烦点。
- Gentoo,相对Arch再难点,考验使用者的综合水平,从系统安装到微调,内核编译都亲历亲为,是高手及黑客显示自己技术手段,按需配置符合自己要求的系统的首选。
Slackware与Gentoo类似:
CentOS,社区维护的RedHat的复刻版本,完全使用RedHat的源码重新编译生成,与RedHat的兼容性在理论上来说是最好的。如果你专注于Linux服务器,如网络管理,架站,那么CentOS是你的选择。
LFS,终极黑客显摆工具,完全从源代码安装,编译系统。安装前你得到的只有一份文档,你要做的就是照文档你的说明,一步步,一条条命令,一个个软件包的去构建你的Linux,完全由你自己控制,想要什么就是什么。如果你做出了LFS,证明你的Linux功底已经相当不错,如果你能拿LFS文档活学活用,再将Linux从源代码开始移植到嵌入式系统,我敢说中国的企业你可以混的很好。
你得挑一个适合你的系统,然后在虚拟机安装它,开始使用它。如果你想快速学会Linux,我有一个建议就是忘记图形界面,不要想图形界面能不能提供你问题的答案,而是满世界的去找,去问,如何用命令行解决你的问题。在这个过程中,你最好能将Linux的命令掌握的不错,起码常用的命令得知道,同时建立了自己的知识库,里面是你积累的各项知识。
再下个阶段,你需要学习的是Linux平台的C++/C++开发,同时还有Bash脚本编程,如果你对Java兴趣很深还有Java。同样,建议你抛弃掉图形界面的IDE,从VIM开始,为什么是VIM,而不是Emacs,我无意挑起编辑器大战,但我觉得VIM适合初学者,适合手比较笨,脑袋比较慢的开发者。Emacs的键位太多,太复杂,我很畏惧。然后是GCC,Make,Eclipse(Java,C++或者)。虽然将C++列在了Eclipse中,但我并不推荐用IDE开发C++,因为这不是Linux的文化,容易让你忽略一些你应该注意的问题。IDE让你变懒,懒得跟猪一样。如果你对程序调试,测试工作很感兴趣,GDB也得学的很好,如果不是GDB也是必修课。这是开发的第一步,注意我并没有提过一句Linux系统API的内容,这个阶段也不要关心这个。你要做的就是积累经验,在Linux平台的开发经验。我推荐的书如下:C语言程序设计,谭浩强的也可以。C语言,白皮书当然更好。C++推荐C++ Primer Plus,Java我不喜欢,就不推荐了。工具方面推荐VIM的官方手册,GCC中文文档,GDB中文文档,GNU开源软件开发指导(电子书),汇编语言程序设计(让你对库,链接,内嵌汇编,编译器优化选项有初步了解,不必深度)。
如果你这个阶段过不了就不必往下做了,这是底线,最基础的基础,否则离开,不要霍霍Linux开发。不专业的Linux开发者作出的程序是与Linux文化或UNIX文化相背的,程序是走不远的,不可能像Bash,VIM这些神品一样。所以做不好干脆离开。
接下来进入Linux系统编程,不二选择,APUE,UNIX环境高级编程,一遍一遍的看,看10遍都嫌少,如果你可以在大学将这本书翻烂,里面的内容都实践过,有作品,你口头表达能力够强,你可以在面试时说服所有的考官。(可能有点夸张,但APUE绝对是圣经一般的读物,即使是Windows程序员也从其中汲取养分,Google创始人的案头书籍,扎尔伯克的床头读物。)
这本书看完后你会对Linux系统编程有相当的了解,知道Linux与Windows平台间开发的差异在哪?它们的优缺点在哪?我的总结如下:做Windows平台开发,很苦,微软的系统API总在扩容,想使用最新潮,最高效的功能,最适合当前流行系统的功能你必须时刻学习。Linux不是,Linux系统的核心API就100来个,记忆力好完全可以背下来。而且经久不变,为什么不变,因为要同UNIX兼容,符合POSIX标准。所以Linux平台的开发大多是专注于底层的或服务器编程。这是其优点,当然图形是Linux的软肋,但我站在一个开发者的角度,我无所谓,因为命令行我也可以适应,如果有更好的图形界面我就当作恩赐吧。另外,Windows闭源,系统做了什么你更本不知道,永远被微软牵着鼻子跑,想想如果微软说Win8不支持QQ,那腾讯不得哭死。而Linux完全开源,你不喜欢,可以自己改,只要你技术够。另外,Windows虽然使用的人多,但使用场合单一,专注与桌面。而Linux在各个方面都有发展,尤其在云计算,服务器软件,嵌入式领域,企业级应用上有广大前景,而且兼容性一流,由于支持POSIX可以无缝的运行在UNIX系统之上,不管是苹果的Mac还是IBM的AS400系列,都是完全支持的。另外,Linux的开发环境支持也绝对是一流的,不管是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就连C#也支持。而微软除Visual Stdio套件以外,都不怎么友好,不是吗?
如果你看完APUE的感触有很多,希望验证你的某些想法或经验,推荐UNIX程序设计艺术,世界顶级黑客将同你分享他的看法。现在是时候做分流了。大体上我分为四个方向:网络,图形,嵌入式,设备驱动。
如果选择网络,再细分,我对其他的不是他熟悉,只说服务器软件编写及高性能的并发程序编写吧。相对来说这是网络编程中技术含量最高的,也是底层的。需要很多的经验,看很多的书,做很多的项目。
我的看法是以下面的顺序来看书:
- APUE再深读 – 尤其是进程,线程,IPC,套接字
- 多核程序设计 - Pthread一定得吃透了,你很NB
- UNIX网络编程 – 卷一,卷二
- TCP/IP网络详解 – 卷一 再看上面两本书时就该看了
- TCP/IP 网络详解 – 卷二 我觉得看到卷二就差不多了,当然卷三看了更好,努力,争取看了
- Lighttpd源代码 - 这个服务器也很有名了
- Nginx源代码 – 相较于Apache,Nginx的源码较少,如果能看个大致,很NB。看源代码主要是要学习里面的套接字编程及并发控制,想想都激动。如果你有这些本事,可以试着往暴雪投简历,为他们写服务器后台,想一想全球的魔兽都运行在你的服务器软件上。
- Linux内核TCP/IP协议栈 – 深入了解TCP/IP的实现
如果你还喜欢驱动程序设计,可以看看更底层的协议,如链路层的,写什么路由器,网卡,网络设备的驱动及嵌入式系统软件应该也不成问题了。当然一般的网络公司,就算百度级别的也该毫不犹豫的雇用你。只是看后面这些书需要时间与经验,所以35岁以前办到吧!跳槽到给你未来的地方!
图形方向,我觉得图形方向也是很有前途的,以下几个方面:
Opengl的工业及游戏开发,国外较成熟。
影视动画特效,如皮克斯,也是国外较成熟。
GPU计算技术,可以应用在浏览器网页渲染上,GPU计算资源利用上,由于开源的原因,有很多的文档程序可以参考。如果能进火狐开发,或google做浏览器开发,应该会很好 。
嵌入式方向:嵌入式方向没说的,Linux很重要
掌握多个架构,不仅X86的,ARM的,单片机什么的也必须得懂。硬件不懂我预见你会死在半路上,我也想走嵌入式方向,但我觉得就学校教授嵌入式的方法,我连学电子的那帮学生都竞争不过。奉劝大家,一定得懂硬件再去做,如果走到嵌入式应用开发,只能祝你好运,不要碰上像Nokia,Hp这样的公司,否则你会很惨的。
驱动程序设计:软件开发周期是很长的,硬件不同,很快。每个月诞生那么多的新硬件,如何让他们在Linux上工作起来,这是你的工作。由于Linux的兼容性很好,如果不是太低层的驱动,基本C语言就可以搞定,系统架构的影响不大,因为有系统支持,你可能做些许更改就可以在ARM上使用PC的硬件了,所以做硬件驱动开发不像嵌入式,对硬件知识的要求很高。可以从事的方向也很多,如家电啊,特别是如索尼,日立,希捷,富士康这样的厂子,很稀缺的。
内核是IT开发人员的加分项,一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。
随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。Linux 内核的uClinux移植提供了对非 MMU 的支持。
在IT行业 如:嵌入式开发,驱动开发,Android开发,c++开发,Java开发如果接触到底层方面 那么 懂得内核:会使自己的开发工作产生对应的效益。懂得内核:会让自己更加了解底层的原理与开发源码。内核是面试的加分项 内核是走向专家的必经之路 不管你是不是做内核开发,内核技术是储备技能,开阔视野,扩展技术面的不二选择。
要转向内核开发,嵌入式开发人员需要掌握以下知识:
- 1. C语言编程:C语言是内核开发的主要编程语言,需要熟练掌握其语法和编程技巧。
- 2. 操作系统原理:需要了解操作系统的基本原理,包括进程管理、内存管理、文件系统等。
- 3. Linux内核:需要深入了解Linux内核的架构、模块、驱动程序等。
- 4. 设备驱动开发:需要掌握设备驱动的开发流程和技术,包括字符设备、块设备、网络设备等。
- 5. 调试技能:需要掌握调试技能,包括使用调试工具、分析内核崩溃等。
- 6. 硬件知识:需要了解硬件的基本原理和操作,包括处理器、内存、外设等。
- 7. 开源社区:需要了解开源社区的文化和开发流程,以便更好地参与内核开发。
- 总之,转向内核开发需要广泛的知识储备和实践经验,需要不断学习和探索。
内核学习路线推荐,喜欢研究内核,想在内核这块深入学习的,可以参考。
操作系统原理/汇编专题
1:操作系统原理 进程管理:进程状态与切换、进程互斥与同步、处理器调度、进程死锁 内存管理 :存储结构、分区存储管理、段式管理、页式管理、虚拟存储 设备管理:磁盘高速缓存、RAID(磁盘阵列)、I/O缓冲 文件管理:文件组织结构、堆文件原理、存储空间管理、文件目录管理 2:汇编语言精讲 x86/x86_64体系结构:x86/x86_64体系结构、汇编语言基础、数据传送、算法运算、寻址、过程与条件处理、浮点处理与指令编码 ARM体系结构:ARM核微处理器、ARM常用指令系统、ARM汇编程序及调试、异常中断/复位处理程序/SWI异常中断、RealView MDK安装与配置、ARM汇编与C混合实现、数据加载与存储指令实现
进程管理专题
1:进程基础 Linux内核源码组织结构 进程原理及进程状态 生命周期及系统调用:写时复制原理、进程内存布局、进程堆栈管理、系统调用实现 task_struct数据结构分析 2 :进程调度 调度策略:SCHED_DEADLINE、SCHED_FIFO、SCHED_RR、SCHED_NORMAL 进程优先级:调度优先级、静态优先级、正常优先级、实时优先级 调度类分析:stop_sched_class、dl_sched_class、rt_sched_class、cfs_sched_class、idle_shced_class SMP调度:迁移线程/隔离处理器、限期调度类的处理器负载均衡、实时调度类的处理器负载均衡、公平调度类的处理器负载均衡
内存管理专题
1:内存原理 SMP/NUMA模型组织 物理内存组织结构与模型 页表/页表缓存:页表框架目录结构、TLB表项格式与管理、地址空间标识符(ASID)、虚拟机标识符(VMID) 处理器缓存:缓存结构与策略、SMP缓存一致性、高速缓存与TLB控制 内存映射:数据结构分析、创建内存映射、删除内存映射、系统调用实现 2:虚拟内存 块分配器:内存分配器原理、页分配与页释放、SLAB块分配器、SLOB块分配器、SLUB块分配器、系统调度接口 页模块大全:标准巨型页、透明巨型页、LRU算法与反向映射、页直接与异步回收原理、回收不活动页执行方案、页交换原理、回收slab缓存原理、页错误异常处理、内存碎片整理、发起内存回收、交换区数据结构/创建/激活、内存耗尽技术原理、缺页异常校正方法、KASAN检测工具、处理交换缺页异常、内存屏障与内核互斥技术。3:内存系统调用 kmalloc/vmalloc 内存池原理与实现操作 内存优化参数与实现 页缓存的实现 块缓存的实现 4:perf性能分析工具 perf原理机制与安装配置 perf采集数据命令29种工具应用 perf采集数据至火焰图分析
网络协议栈专题
1:网络基础架构 ICMP协议 用户数据报协议(UDP) 传输控制协议(TCP) 流控制传输协议(SCTP) 数据报拥塞控制协议(DCCP) IPv4策略路由选择 无线子系统模块:802.11 MAC帧结构分析、扫描/身份验证/关联、mac80211接收与传输实现、高吞吐量(802.11n)、网状网络(802.11s) IPv4重定向消息/FIB表 2:网络协议栈 ARP(地址解析协议) 用户数据报协议(UDP) 传输控制协议(TCP) 高级路由选择:组播路由选择、策略路由选择、多路径路由选择 接收/发送IPv4数据包 接收/发送IPv6数据包 InfiniBand栈的架构:RDMA(远程直接内存访问 )结构、InfiniBand组件与编址、InfiniBand功能与数据包 协议栈注册/接收包/发送包流程方案 3:系统API调用 POSIX网络API调用 epoll内核原理与实现 网络系统参数配置
设备驱动专题
1:设备驱动子系统 I/O机制原理 资源分配与管理 字符设备子系统 块设备子系统 网络接口卡驱动 2:Linux设备模型 深度剖析LDM:LDM数据结构、设备驱动程、kobject结构、kobj_type、内核对象集合 设备模型和sysfs:sysfs文件及属性、允许轮询sysfs属性文件、 3:字符设备操作 主设备与次设备 打开设备文件 分配与注册字符设备 写文件操作实现:open/release方法、read/write方法、llseek/poll方、填充file_operations结构 插入和删除模块 4:块设备操作 块设备表示与数据结构 BIO数据结构 ioctl系统调用 总线模块:ISA总线、PCI/PCI-E总线、USB总线、VESA总线、I2C总线 5:网卡设备驱动 数据结构:套接字缓冲区结构、网络接口结构 缓冲区管理与并发控制 ISA网络驱动程序 ATM异步传输模式 网络吞吐量
内核组件专题
1:时间管理 通用时间子系统 高分辨率定时器 动态时钟数据结构 定时器系统调用 2:页与块缓存 页缓存结构操作与实现 块缓存结构与实现 地址空间数据结构与页树 3:数据同步 数制同步机制 inode同步与拥塞 强制回写与完全同步 4:内核活动 中断类型/硬件IRQ irq_desc数据结构 处理IRQ与软中断 创建/注册/执行tasklet 等待队列与完成量
文件系统专题
1:虚拟文件系统VFS 文件系统类型与文件模型研究 数据结构:超级块(super_block)、挂载描述符(mount结构体)、索引结点(inode结构体)、目录项(dentry结构体) 文件系统调用:打开/关闭文件、 创建/删除文件、 读/写文件、 文件回写技术原理/接口实现 挂载文件系统:系统调用mount处理流程、绑定挂载/挂载命名空间、挂载/注册rootfs文件系统无 持久文件系统:proc文件系统(proc数据结构、装载proc/管理proc数据项、数据读取与写入实现)、 简单文件系统(顺序文件、调度文件系统、伪文件系统) 2:磁盘文件系统 Ext2文件系统:物理结构与数据结构、创建文件系统、操作文件系统 Ext3文件系统 Ext4文件系统 日志JBD2 3:用户空间文件系统 Fuse架构设计与原理 Fuse内核五大队列 Fuse用户空间流程与实现方案
内核项目实战专题
1-Linux内核编译与系统更换实现方法 2-进程间通信/管理(权限/优先级)实现方案 3-NIC网卡驱动实现 4-mmap系统调用/映射用户内存实现 5-Linux内存参数系统实现 6-调试与性能优化(debugfs/printk/ftrace) 7-Slab块分配器内存分配实现机制 8-tasklet/内线线程与定时器实现 9-Linux内核proc文件系统实现 10-Linux内核防火墙iptables实现
六、Linux内核视频讲解
- 1、深度剖析Linux内核SMP负载均衡-----视频讲解地址
- 2、深度剖析Linux内核ARM64处理器架构-----视频讲解地址
- 3、深度剖析Linux内核ARM异常处理-----视频讲解地址
- 4、深度剖析Linux内核CFS调度器-----视频讲解地址
- 5、深度剖析Linux内核量化负载计算能力-----视频讲解地址
- 6、深度剖析Linux内核进程及生命周期-----视频讲解地址
- 7、深度剖析Linux内核CPU域初始化实现-----视频讲解地址
- 8、深度剖析Linux内核蓝牙子系统架构-----视频讲解地址
- 9、深度剖析Linux内核USB系统架构-----视频讲解地址
- 10、深度剖析Linux内核IO体系结构与访问设备-----视频讲解地址
- 11、深度剖析Linux内核进程管理机制-----视频讲解地址
- 12、深度剖析Linux内核MLFQ经典调度算法-----视频讲解地址
- 13、深入剖析Linux内核伙伴系统实现及API调度实战-----视频讲解地址
- 14、深入剖析Linux内核哈希表与运行队列-----视频讲解地址
- 15、深入剖析Linux内核NUMA调度器-----视频讲解地址
- 16、深度剖析Linux内核perf性能优化分析-----视频讲解地址
七、内核项目实战