linux内核组成分析_linux内核的组成部分及作用
linux系统内核数据?
正如图中看到的一样,存在着两种WiFi设备,具体是哪一类要看IEEE802.11标准的MLME如何实现。 如果直接通过硬件实现,那么设备就是硬MAC(fullMAC)设备;如果通过软件的方式实现,那么设备就是软MAC(softMAC)设备。现阶段大部分设备都是软件实现的软MAC设备。
linux内核组成分析_linux内核的组成部分及作用
linux内核组成分析_linux内核的组成部分及作用
通常我们把Linux内核子系统看成两大块:cfg80211和mac80211,它们连通内核其他模块和用户空间的应用程序。 特别指出,cfg80211在内核空间提供配置管理服务,内核与应用层通过nl80211实现配置管理接口。需要记住的是,
硬MAC设备和软MAC设备都需要cfg80211才能工作。而mac80211只是一个驱动API,它只支持软件实现的软MAC设备。 接下来,我们主要关注软MAC设备。
Linux内核子系统统一各种WiFi设备,并处理OSI模型中层的MAC、PHY两层。 若进一步划分,MAC层可以分为MAC高层和MAC底层。前者负责管理MAC层网络的探测发现、身份认证、关联等;
后者实现MAC层如ACK等紧急作。大部分情况下,硬件(如适配器)处理大部分的PHY层以及MAC底层作。Linux子系统实现大部分的MAC高层回调函数。 2模块间接口
从图一中我们可以看出,各个模块之间分界线很清晰,并且模块间相互透明不可见。模块之间一般不会相互影响。 举个例子,我们在WiFi设备驱动做修改(如,打补丁、添加新的WiFi驱动等),这些变更并不会影响到mac80211模块,
所以我们根本不用改动mac80211的代码。再如,天通苑北大青鸟建议添加一个新的网络协议理论上是不用修改套接字层以及设备无关层代码。一般情况下,内核通过一系列的函数指针实现各层之间相互透明。
内存管理:一文读懂Linux内存组织结构及页面布局
1、内存是什么?
1) 内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成;
2) 内存的特点是存取速率快,断电一般不保存数据,非持久化设备;
2、内存的作用
1) 暂时存放 cpu 的运算数据
2) 硬盘等外部存储器交换的数据
3) 保障 cpu 计算机的稳定性和高性能
1、linux 内存地址空间 Linux 内存管理全貌
2、内存地址——用户态&内核态
3、内存地址——MMU 地址转换
4、内存地址——分段机制
1) 段选择符
更多Linux内核视频教程文档资料免费领取后台私信【 内核 】自行获取。
内核学习网站:
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
2) 分段实现
5、内存地址——分页机制(32 位)
6、用户态地址空间
7、内核态地址空间
8、进程内存空间
内存管理算法 ——对讨厌自己管理内存的人来说是天赐的礼物
1、内存碎片
1) 基本原理
2) 如何避免内存碎片
2、伙伴系统算法——组织结构
1) 概念
2) 外部碎片
3、伙伴系统算法——申请和回收
1) 申请算法
2) 回收算法
3) 条件
4、如何分配 4M 以上内存?
1) 为何限制大块内存分配
2) 内核中获取 4M 以上大内存的方法
5、伙伴系统——反碎片机制
1) 不可移动页
2) 可回收页
6、slab 算法——基本原理
1) 基本概念
2) 内部碎片
7、slab 分配器的结构
详细参考:
经典|图解Linux内存性能优化核心思想
8、slab 高速缓存
1) 普通高速缓存
2) 专用高速缓存
9、内核态内存池
1) 基本原理
2) 内核 API
10、用户态内存池
1) C++ 实例
11、DMA 内存
1) 什么是 DMA
2) DMA 信号
out of memory 的时代过去了吗?no,内存再充足也不可任性使用。
1、内存的使用场景
2、用户态内存分配函数
a) 如果当前连续内存块足够 realloc 的话,只是将 p 所指向的空间扩大,并返回 p 的指针地址。这个时候 q 和 p 指向的地址是一样的
b) 如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p 指向的内容 copy 到 q,返回 q。并将 p 所指向的内存空间删除
3、内核态内存分配函数
4、malloc 申请内存
5、缺页异常
6、用户进程访问内存分析
7、共享内存
1) 原理
2) shm 接口
1、C 内存泄露
2、C 野指针
3、C 资源访问冲突
4、STL 迭代器失效
错误示例:删除当前迭代器,迭代器会失效
正确示例:迭代器 erase 时,需保存下一个迭代器
5、C++ 11 智能指针
(1)原理分析:
(2)数据结构:
(3)使用方法:
6、C++ 11 更小更快更安全
六、 如何查看内存
可以通过 cat /proc/slab 命令查看
可以通过 /proc/sys/vm/drop_caches来释放
Linux内核由若干个子系统组成,一般来说下面哪一个不是Linux内核的子系统( )。
【】:D
Linux内核主要由5个子系统组成:进程调度(SCHED),内存管理(MM),虚拟文件系统(VFS),网络接口(NET),进程间通信(IPC)。故本题选择D。
Linux内核源码解析-list.h
开头就说明了这里的 list.h 文件来自 Linux Kernel ( /include/linux/list.h ),只是去除了列表项的硬件预加载部分。
进行宏替换后就是
Note: 没搞懂这里为什么加个 osn 前缀,原本是 list_add ,现在是 osn_list_add 。
可以看到就是个简单的链表删除过程,同时把删除的前后指针设为无法访问。
删除后初始化,前后指针都指向自己
从A链表删除后头插法插入B链表
从A链表删除后尾插法插入B链表
先对 list 判空,非空就把 list 链表除头外裁剪到 head 头在的链表中。函数不安全, list 可以继续访问其他。
多了一步 list 重新初始化的过程。
(unsigned long)(&((type )0)->member))) 将0x0地址强制转换为 type 类型,然后取 type 中的成员 member 地址,因为起始地址为0,得到的 member 的地址就直接是该成员相对于 type 对象的偏移地址了。
所以该语句的功能是:得到 type 类型对象中 member 成员的地址偏移量。
先将 ptr 强制转换为 char 类型(因为 char 类型进行加减的话,加减量为 sizeof(char)offset , char 占一个字节空间,这样指针加减的步长就是1个字节,实现加一减一。)
整句话的意思就是:得到指向 type 的指针,已知成员的地址,然后减去这个成员相对于整个结构对象的地址偏移量,得到这个数据对象的地址。
就是从前往后,从后往前的区别
Note: 从head开始(不包括head!)遍历它的每一个!它用n先将下一个要遍历的保存起来,防止删除本后,无法找到下一个,而出现错误!
已知指向某个结构体的指针,以及指向它中member成员的指针head,从下一个结构体开始向后遍历这个结构体链
Note: 同理,先保存下一个要遍历的!从head下一个向后遍历链表。
list.h使用说明
linux内核list.h分析(一)
linux内核list.h分析(二)
【Linux内核数据结构】为经典的链表list
linux内核源码详解
Linux的内核源代码可以从很多途径得到。一般来讲,在安装的linux系统下,/usr/src/linux目录下的东西就是内核源代码。
对于源代码的阅读,要想比较顺利,事先对源代码的知识背景有一定的了解。对于linux内核源代码来讲,我认为,基本要求是:1、作系统的基本知识; 2、对C语言比较熟悉,要有汇编语言的知识和GNU C对标准C的扩展的知识的了解。
另外在阅读之前,还应该知道Linux内核源代码的整体分布情况。我们知道现代的作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。看一下Linux内核源代码就可看出,各个目录大致对应了这些方面。Linux内核源代码的组成如下(设相对于linux目录):
arch 这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于X86平台就是i386。
include 这个目录包括了核心的大多数include文件。另外对于每种支持的体系结构分别有一个子目录。
init 此目录包含核心启动代码。
mm 此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/-/mm目录下,如对应于X86的就是arch/i386/mm/fault.c 。
drivers 系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound。
ipc 此目录包含了核心的进程间通讯代码。
modules 此目录包含已建好可动态加载的模块。
fs Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext2文件系统对应的就是ext2子目录。
kernel 主要核心代码。同时与处理器结构相关代码都放在arch/-/kernel目录下。
net 核心的网络部分代码。里面的每个子目录对应于网络的一个方面。
lib 此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/-/lib/目录下。
scripts 此目录包含用于配置核心的脚本文件。
Documentation 此目录是一些文档,起参考作用。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。