大佬博客是JeanCheng,https://blog.csdn.net/gatieme,有情趣的自己去看
1.服务器体系(SMP,NUMA,MPP)与共享存储器架构(UMA和NUMA)
UMA和NUMA两种模型是共享存储型多处理机,均匀存储器存取模型可以将内存以连续方式组织起来
,传统的多核运算使用SMP模式:将多个处理器与一个集中的存储器和io总线相连,所有处理器只能访问同一个物理存储器,SMP被称为一致存储访问UMA结构体系,一致性意味着无论什么时候,处理器只能为内存中的每一个数据保存或共享唯一一个数值。SMP可伸缩性有限,在存储器或IO饱和时,增加处理器不能增加性能,AMP不同核之间有主从关系,一个核控制另外一个核的业务,控制平面或数据平面。
2.NUMA模型是一种分布纯存储器访问方式,处理器可以同时访问不同的存储器地址,大幅度提高并行性。NUMA模式下,处理器被划分为多个节点node,每个节点被分配有的本地存储器空间,所有节点中的处理器都可以访问全部的系统物理纯存储器。
区别
SMP体系结构:所有的内存访问都传递到相同的共享内存总线,CPU会相互竞争对内存总线的访问
NUMA通过限制任何一条内存总线上的CPU数量
LINUX内核需要用一种体系结构无关的方式来表示内存,内存对一致和非一致内存访问使用相同的数据结构
NUMA模型中linux内存即构
处理器被划分为node
内存被分割为多个区域BANK,簇,两个区域一个专门给CPU访问,一块给外围设备板卡的DMA去访问
Linux把物理内存分为
存储节点Node CPU被划分为多个节点node,内存则被分簇,每个CPU对应一个本地物理内存,即每个CPU-node对应一个内存簇bank
管理区Zone 每个物理内存节点node被划分为多个内存管理区域,用于表示不同范围的内存,内核可以使用不同的映射方式映射物理内存
页面(page)内存被细分为多个页面帧,页面是最基本的页面分配单位
实现1。内存分配结点关联到一个处理器,内核表示为pg_daya_t实例
系统中每一个节点被连接到一个以NULL结尾的pgdat_list链表中,其中每一个节点利用pg_data_tnode_next字段连接到下一节
实现2.接着各个节点又被划分为内存管理区域,一个内存管理区域通过struct zone_struct描述,其被定义为zone_t,用于表示内存某个范围,低端16MB被描述为ZONE_DMA,其中工业体系结构中的ISA设备需要用到它,可以直接映射到普通内存阈ZONE_NORMAL,最后超出内核段的物理地址域ZONE_HIGHMEM,被称为高端内存,是系统中的可用内存
实现3.最后页帧(page frame)代表了系统内存的最小单位,堆内存中的每个页都会创建一个struct page的一个实例。传统上把内存视为连续的字节,即字节数组,内存单元的编 (地址)可作为字节数组的索引。分页管理时,将若干字节视为一页,比如4k byte。此时内存变为连续的页,即内存为页组数,每一页物理内存叫页帧。
在一个单独的节点内,任一给定CPU访问页面所需的时间都是相同的,然而,对于不同CPU这个时间可能不同,对于每个CPU而言,内核都试图把耗时节点的访问次数减少到最小这样选择CPU最常引用的内核数据结构的存放位置。
代码:
1)在LINUX中引入一个数据结构struct pglist_data,来描述一个node,定义在include/linux/mmzone.h文件中(这个结构被typedef pg_data_t)
*d对于NUMA系统来讲,整个系统的内存由一个node_data的pg_data_t指针数组来管理
*杜宇PC这样的UMA系统,使用struct pglist_data contig_page_data,作为系统唯一的node管理所有的内存区域(UMA
系统中只有一个node)
2)物理内存区域zone
硬件结构限制1.ISA总线DMA处理器只对RAM的前16MB进行寻址
2.32位计算机CPU不能直接访问所有物理内存因为线性地址空间太小,内核不可能直接映射所有的物理内存到线性地址空间
1.ZONE_DMA:这个区包含的页用来执行DMA操作
2.ZONE_NOMAL;这个区包含的所有能正常映射的页
3.ZONE_HIGHEM:这个区包含高端内存,页永久银蛇到内核地址空间
https://blog.csdn/net/gatieme/article/fetails/52384058
linux内核绪论—linux内核剖析
内核是操作系统最基本的部分,是为众多应用程序提供对计算机硬件的安全访问的部分软件。提供操作系统最基本的功能,负责管理系统的进程,内存,设备驱动程序,文件和 络系统,决定系统的性能和稳定性。。现代操作系统中,为减少系统本身的开销,往往将一些与硬件紧密关联的(如中断处理程序,设备驱动程序),基本的,公用的,运行频率较高的模块(如时钟管理,进程调度等)以及关键数据结构独立开来,使之常驻内存,并对他们进行保护。
构建源码树
arch 目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种linux支持的体系结构。
block 块设备IO层
crypto 加密API
drivers 目录中是系统中所有的设备驱动程序
firmware 使用某些驱动程序所需要的设备固件
fs VFS和各种文件系统,存放Linux支持的文件系统代码。如ext3文件系统
include 编译核心所需要的大部分头文件
init 核心的初始化代码,不是系统的引导代码,是研究核心如何工作的好起点
kernel 内核管理的核心代码
lib 通用的核心库代码
mm 内存管理子系统
net 络部分
为什么要获取源码呢:
如果你只是想为内核编译第三方模块,那么不需要下载源码包,安装内核头文件或许更适合你。做嵌入式开发或者驱动开发,一个基本的linux设备驱动开发环境由宿主机和目标机组成,宿主机就是用来做驱动开发工作的主机,目标机就是用来测试和运行设备驱动的主机,在宿主机需要开发更具gcc,gdb,make等和linux源码版本要对应目标机上的lniux内核,目标及只要运行linux内核就行。
普通linux设备驱动开发
可以在本机上开发编译然后本机上加载运行,动态加载的方式
两台主机的话:
1.在宿主机上安装开发工具和下载linux源码
2.修改linux驱动程序,修改内核源代码,在本地主机上安装一份源码,在编译成库后,进行驱动开发
3.编写makefile文件
4.编译出驱动文件
5.加载测试以及卸载
linux内核设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库调用非常近似,只是系统调用由操作系统核心提供,运行于内核态。那个运行于用户态。
进程不能访问内核,不能访问内核所占空间也不能调用内核函数。CPU硬件决定因为叫保护模式。https://blog.csdn.net/gatieme/article/details/50646461
==
**深入理解计算机系统-内存管理(存储管理机制(虚拟地址,线性地址,物理地址)
为了对存储器中的程序以及数据实现保护和共享硬件的支持,为了对实现虚拟存储器提供硬件支持,现代cpu不仅采用了扩充的存储器段式管理机制,而且还提供了可选的存储器分页管理机制。
物理地址:
用于内存芯片级的单元寻址,与处理器和cpu连接的地址总线相对应。
分段机制与逻辑地址===
逻辑地址是机器语言指令中,用来指定一个操作数或者一条指令的地址。
inter中段式管理,对逻辑地址的要求,一个逻辑地址,是一个由段标识符加上一个指定段内相对地址的偏移量。单片机实模式,申请的地址是实际物理地址,寻址空间有限。而保护模式扩展到4G。
在x86架构下的系统,必须先将段管理的逻辑地址转换为虚拟地址,再将虚拟地址转换为物理地址,如果打开分页管理的话,而arm架构是没有分段管理的,所以直接将虚拟地址转换为物理地址。
分页机制与线性地址
线性地址也叫虚拟地址,根逻辑地址类似,逻辑地址对应硬件平台段式转换前地址的话,那么线性地址则对应了硬件页式内存转换前的地址。这样分配内存时,操作系统以块为单位将进程中的若干页分别装入到多个可以不相邻的物理块中。
”页“固定长度的管理单位,
1.页目录是唯一的,地址放在CPU的cr3寄存器
2.每一个进程,因为都有其独一无二的虚拟内存(页目录也是唯一的额),它页对应一个独立的页目录地址,运行一个进程,需要将它的页目录地址放到cr3寄存器中,将个别的保存下来。
3.每一个32位的线性地址被分为3部分:面目录索引10位,页表索引10位,偏移12位
–通过描述符表和描述符,分段管理机制实现了逻辑地址到线性地址的映射,完成了二维到一维。
接下来分页管理机制把线性地址和物理地址分别划分为大小相同的块,页。实现之间的映射。
(8080寻址空间应该是2的16次幂64KB但是设计值指1M,也就是20位。增加了4个寄存器,分别为代码段CS,数据段DS,堆栈段SS和其他ES。这样一来一个物理地址就是段地址:偏移地址。
这样方式最高地址为0xFFFF:0xFFFF,其地址空间为0x000000x10FFEF.因为地址总线为20位,最大只能访问到1MB的物理地址空间,物理地址为0x000000xFFFFF.系统对超出的部分按1M求模方式运算。
(每个段基址有个特征,其低4位全为0,每个段起始地址一定是16的整数倍,分段的一个基本原则,这样每个段最小字节是16字节,最大长度只能64kb。。如果每个段的长度为64KB,那么1MB的物理地址空间最多能划分为16个段。
因此实地址模式就是通过段基址和偏移算出来的地址,经过模1MB之后的出来的地址都是实际内存的物理地址。(同一地址多种表示,缺乏保护)
好吧太多了,明天继续,想看的可以参考连接—-https://blog.csdn.net/gatieme/article/details/50646461
https://blog.csdn.net/gatieme/article/details/50779184
=明天安排,拳四郎的linux内核编译,虚拟机安装,OpenGL进阶入门,3D游戏大师==
https://blog.csdn.net/silangquan/article/details/8991905
Linux操作系统分析—慢慢来比较快–https://blog.csdn.net/m6830098/article/details/9056457
==linux添加系统调用总结(内核版本4.4.4)—-低水平计算机学狗—–https://blog.csdn.net/sinat_28750977/article/details/50837996
==vs2017配置opemcv教程—-https://blog.csdn.net/qq_41175905/article/details/80560429
操作系统作业—https://blog.csdn.net/qq_41175905
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!