自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

转载 uops 我来自哪里

经过上面的梳理介绍,现在已经有足够的信息来回答“我来自哪里?”这个问题。我们可以整理出uops可能会来自于MITE, DSB, MS和LSD这四个地方,然后这四个地方uops具体的诞生方式也各有不同。作为最复杂的MITE,先要IFU的协助获得相应的数据,才能进行相关译码操作,自然是最费时间和能源的。所以架构师引入了DSB和LSD来避免频繁地利用MITE获取uops,在DSB和LSD在工作的时候,就可以完全关断MITE和IFU相关模块的电源,以到达省电的目的。

2023-05-25 13:26:49 231

原创 【Linux 内核】整理内核特殊宏、原语等

对于 volatile 修饰的变量,编译器不能对该变量进行缓存,当每次使用该变量的值时,编译器必须从内存重新读取该变量的值。假设程序中有两个线程,一个线程执行 foo()函数,另一个线程执行 bar() 函数,两个线程会并行访问全局变量 a在默认不开启任何优化选项时,编译器输出的 foo() 函数为。可以看到在未开启优化的时候,编译器的输出是符合程序的设计意图的再来看看开启编译优化 (gcc -O2) 时,编译器输出的 foo() 函数。可以看到加上 barrier() 之后,恢复为从内存读取变量的值。

2022-11-30 10:48:26 597

转载 [转载]内存屏障

在上图所示的 store buffer 中,CPU 在执行 store 操作后同样将修改的值保存到 store buffer 中,之后便继续执行之后的指令,当 CPU 执行 store 之后的 load 操作时,在访问对应的 cache line 之前需要访问 store buffer,若 store buffer 缓存有当前执行 load 操作的数据,load 操作会使用 store buffer 中缓存的数据,而非 cache line 中的数据。

2022-11-13 19:03:34 429 1

转载 网络命令空间inet_net

在__register_pernet_operations中把注册的ops挂载到全局链表,并遍历系统中现有的网络命名空间进行子系统初始化操作,之所有要遍历所有的子系统,是因为操作系统中很多都是模块化的,在系统运行一段时候后才加载,这样有些命名空间在子系统加载前就创建好了,因此要对现存的所有网络命名空间进行初始化操作(init_net的子系统的初始化也在这进行)。1)创建网络命名空间的内存池(以后创建新的网络命名空间时,申请新的structnet结构的内存就是用这个内存池中的内存)...

2022-07-17 16:14:09 684

原创 【Linux 协议栈】(一)socket函数

socket

2022-06-02 21:04:53 257

原创 【Linux 内核】CPU高速缓存行及MESI 协议

基于https://www.cnblogs.com/jokerjason/p/9584402.html单核CPU:多核CPU:大致关系:CPU Cache --> 前端总线 FSB (下图中的Bus) --> Memory内存CPU 为了更快的执行代码。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的 CPU ,高速缓存行大小不同。如 X86 是 32BYTES ,而 ALPHA 是 64BYTES 。并且始终...

2021-07-13 15:26:02 855

原创 【Linux 内核】原子变量、每CPU变量、RCU

原文一、linux中的每cpu变量  看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句。从语句的意思可以看出是要使用与当前cpu相关的一个变量,不过查看这个变量的定义,总是有这样一个宏:DEFINE_PER_CPU(type, name),将这个宏展开成下面的语句:  __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__#

2021-04-18 16:04:02 1015

转载 【Linux内核】从preempt_disable看看barrier()

#define preempt_disable() \do{ \ inc_preempt_count(); \ barrier(); \}while(0)一、这个barrier 在干什么... 内存屏障出现因为编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据缓存,读写指令乱序执行等等。如果优化对象是普通内存,那么一般会提升性能而且不会产生逻辑错误。但如果对I/O操作进行类似优化很可能造成致命错误。所以要使用内存屏障,以强制该语句前...

2020-10-22 13:33:40 504

原创 【Linux 网络】IP校验和计算相关

校验和只是为防止报文在信道传输出现误码导致报文错误,并不保证报文被他人恶意篡改。一、IP校验和unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl);iph:ip头指针ihl:ip头长度,4字节长度的数目。利用这个函数在发送报文时计算校验和时需要将iph->check清0然后计算,因此在接收报文检验校验和需要将此字段清0计算然后再校验,如果接收报文时没有清零直接计算会发现计算出的结果是0。其他...

2020-07-25 09:56:40 1659

原创 【Linux 进程管理】(2)进程相关的系统调用

创建进程的系统调用共有三个:fork、vfork、clone。fork是重量级调用,因为它建立了父进程的一个完整副本,然后作为子进程执行。为减少与该调用相关的工作量, Linux使用了写时复制( copy-on-write)技术,下文中会讨论。 vfork类似于fork,但并不创建父进程数据的副本。相反,父子进程之间共享数据。这节省了大量CPU时间(如果一个进程操纵共享数据,则另一个会自动注意到)。vfork设计用于子进程形成后立即执行execve系统调用加载新程序的情形。在子进程退出或开始...

2020-06-27 11:18:00 409

原创 【Linux 进程管理】(1)进程基础

所有的现代操作系统都能够同时运行若干进程,至少用户错觉上是这样。如果系统只有一个 处理器,那么在给定时刻只有一个程序可以运行。在多处理器系统中,可以真正并行运行 的进程数目,取决于物理CPU的数目。 内核和处理器建立了多任务的错觉,即可以并行做几种操作,这是通过以很短的间隔在系统运行 的应用程序之间不停切换而做到的。由于切换间隔如此之短,使得用户无法注意到短时间内的停滞, 从而在感观上觉得计算机能够同时做几件事情。一、进程优先级 进程的运行按时间片调度,分配给进程的时间片份额与 ...

2020-06-26 23:31:47 170

原创 【Linux 内核】 中断上半部

中断分为上半部和下半部,先介绍上半部。 每个中断都有一个编号,CPU支持多个中断编号,但这是 远远不够的,那么就会有许多中断共享编号称为中断共享。一、硬件中断中断不能由处理器外部的外设直接产生,而必须借助于一个称为中断控制器(interrupt controller)的标准组件来请求,该组件存在于每个系统中。外部设备会向中断控制器发送中断请求,控制器在执行了各种电工任务之后,将中断请求转发到CPU的中断输入。因为外部设备不能直接发出中断,而必须通过上述组件请求中断,所以这种请求更正...

2020-06-18 11:41:29 638

原创 【linux 内存管理】内核态内存相关流程、函数整理

一、start_kernel启动调用start_kernel->setup_arch() build_all_zonelists() mm_init() setup_per_cpu_pageset()以下各函数简介。二、setup_arch()e820处理相关函数,如e820_add_kernel_range()。主要是e820探测物理内存,添加到内核。 max_pfn\max_low_pfn。根据e820探测的物理内存,确定这两个全局变量,用来确定各个zone范围。 me

2020-06-15 09:01:12 217

原创 链接、装载与库(3):动态链接

Linux系统中,ELF动态链接文件被称为动态共享对象(DSO,Dynamic Shared Objects),一般以so为扩展名。关于模块:在静态链接时,整个程序最终只有一个可执行文件,它是一个不可分割的整体;但是在动态链接下,一个程序被分成了若干个文件,有程序的主要部分,即可执行文件和程序所依赖的共享对象,很多时候我们也把这些部分称为模块,即动态链接下的可执行文件和共享对象都可以...

2020-06-06 23:23:20 184

原创 链接、装载与库(2):静态链接

一、程序a.cextern int shared;int main() { int a = 100; swap(&a, &shared);}b.cint shared = 1;void swap(int* a, int* b) { *a ^= *b ^= *a ^= *b;}这里将两个文件编译成a.o和b.o,并最终链...

2020-06-06 23:22:12 97

原创 链接、装载与库(1):目标文件ELF

原文:http://chuquan.me/2018/05/21/elf-introduce/一、目标文件的格式目前,PC平台流行的 可执行文件格式(Executable) 主要包含如下两种,它们都是 COFF(Common File Format) 格式的变种。Windows下的 PE(Portable Executable) Linux下的...

2020-06-06 23:21:54 426

原创 【linux 内核】 系统调用具体流程

最近看了下系统调用,理清了下用户态是怎么陷到内核的,先记录下理论基础,再一份select函数做为例子记录。一、理论在linux中,系统调用时用户空间访问内核的唯一手段;出异常和陷入外,他们是内核唯一的合法入口。系统调用的流程: printf()->c库中的printf()->c库中的write()->write()的系统调用。1、系统调用 通常需要定义零个、一个或...

2020-05-28 10:04:22 152

原创 【linux 内核】 内核启动流程

linux内核启动流程https://www.cnblogs.com/chenshikun/p/9389578.htmlLinux内核的引导https://www.cnblogs.com/wanghuaijun/p/7189769.htmlLinux内核引导过程https://blog.csdn.net/qingdaohaishanhu/article/details/8808...

2020-05-28 10:02:40 322

原创 【linux 内存管理】内存寻址

一、内存地址对于80x86微处理器,我们需要区分以下地址:逻辑地址:这种寻址方式是x86才有的著名的分段结构,每一个逻辑地址都是由一个段和偏移量组成,偏移量指明了从段开始的地方实际地址之间的距离。线性地址(也称虚拟地址):是一个32位无符号数,0x00000000~0xffffffff物理地址:用于内存芯片级别内存寻址。他们从微处理器的地址引脚发送到内存总线上的电信号相对对应。...

2020-05-28 09:59:57 229

原创 【linux 内存管理】杂七杂八

CPU硬件高速缓存:根据https://blog.csdn.net/gatieme/article/details/52384075和https://www.cnblogs.com/tolimit/p/4551428.html,物理内存初始化的层次结构,物理内存分配为多个node节点,每个node节点管理多个zone区(zone包含NORMAL、DMA、HIGHMEM等),每个zone又通过伙...

2020-05-28 09:59:05 102

原创 【linux 内核】 锁机制的实现 spin_lock()函数

这篇记录下内存锁是如何实现的。以下是spin_lock()函数的代码调用流程片段: 注意__raw_spin_lock这里调用了preept_disable()函数关闭了cpu抢占。这个函数不用关心LOCK_CONTENDED宏的作用,知道这里调用do_raw_spin_lock()函数就可以,参数是lock。锁的结构介绍:从__spin_lock_debug开始初见端倪,先尝试for循环4096×HZ次加锁,这里并没有挂死,400多万次的尝试加锁...

2020-05-28 09:58:27 2511

原创 【linux 协议栈】linux 网络技术内幕(4) 通知链

通知链就是内核子系统A发生某一时间通知内核子系统B,B执行相应操作。比如物理口UP或DOWN,接口系统提供一个注册通知链函数,其他子系统可以利用这个注册函数将各自的执行函数注册到接口系统的通知链上,那么接口发生变化会将这个通知链上的多有函数执行一次。通知链是由接口系统维护,其他系统只需要注册即可。如:Qos模块注册了接口系统的通知链qos_netdev_notifier是Qos对应的通...

2020-05-28 09:58:16 150

原创 【linux 内存管理】 一些/proc/信息

1、/proc/meminfomemtotal:这个对应全局变量totalram_pages,系统出了内核代码段、数据段、memblock.reserved等的内存外一共系统可管理的内存。memfree:表示系统尚未使用的内存。[MemTotal-MemFree]就是已被用掉的内存.memavailable:有些应用程序会根据系统的可用内存大小自动调整内存申请的多少,所以需要...

2020-05-28 09:58:03 259

原创 【linux 内存管理】深入linux内核架构 内存管理(4)slab原理

伙伴系统支持按页分配内存,但这个单位太大了。如果需要为一个10个字符的字符串分配空间,分配一个4 KiB或更多空间的完整页面,不仅浪费而且完全不可接受。显然的解决方案是将页拆分为更小的单位,可以容纳大量的小对象。 提供小内存块不是slab分配器的唯一任务。由于结构上的特点,它也用作一个缓存,主要针对经常分配并释放的对象。通过建立slab缓存,内核能够储备一些对象,供...

2020-05-28 09:57:27 776

原创 【linux 内存管理】memblock算法简单梳理

最近看了一份博客介绍memblock的算法实现,整理下温故而知新。引:http://blog.chinaunix.net/uid-26859697-id-4498257.htmlmemblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单。负责page allocator初始化之前的内存管理和分配请求。 分析memblock算法...

2020-05-28 09:57:17 1199 1

原创 【linux 内存管理】 关键的全局变量

1、max_pfn:调用栈:setup_arch(): max_pfn = e820__end_of_ram_pfn();e820__end_of_ram_pfn()函数时找到e820探测的最大的物理地址区间(RAM的即usable)的物理地址所在的页帧号与该架构支持的最大帧号的最大值。如:2、max_low_pfnsetup_arch(): ma...

2020-05-28 09:57:06 724

原创 【linux 内存管理】预留内存、大块内存申请cblock

内核对于有申请100M、200M大内存的连续地址时,如果基于伙伴系统分配是不太可行的,首先伙伴系统最大支持11阶即即8M的内存,即使调整最大阶数,内核在初始化伙伴系统是也不能有存在多个大阶内存,如果被分配或者裂变后再申请就有可能申请不到。所以有个方案就是将内存预留出来,比如8g预留出4g,专门用于大块内存申请,cblock就是实现的这个方案。...

2020-05-28 09:56:47 1663 3

原创 【linux 内存管理】深入理解linux内核架构 内存管理(5)vmalloc

一、内核中不连续页的分配 我们知道物理上连续的映射对内核是最好的,但并不总能成功地使用。在分配一大块内存时,可能竭尽全力也无法找到连续的内存块。在用户空间中这不是问题,因为普通进程设计为使用处理器的分页机制,当然这会降低速度并占用TLB。在内核中也可以使用同样的技术。内核分配了其虚拟地址空间的一部分,用于建立连续映射。 每个vmalloc分配的子区域都是自包含的,与其...

2020-05-28 09:56:37 414

原创 【linux 内存管理】深入理解linux内核架构 内存管理(3)伙伴系统

在内核初始化完成后,内存管理的责任由伙伴系统承担。伙伴系统基于一种相对简单然而令人吃惊的强大算法,已经伴随我们几乎40年。它结合了优秀内存分配器的两个关键特征:速度和效率。一、伙伴系统结构系统内存中的每个物理内存页(页帧),都对应于一个struct page实例。每个内存域都关联了一个struct zone的实例,其中保存了用于管理伙伴数据的主要数组。<mmzone...

2020-05-28 09:56:26 870

原创 【linux 内存管理】深入理解linux内核架构 内存管理(2)build_all_zonelists、内存布局

一、内存管理初始化各函数功能介绍:1、结点和备用内存域初始化build_all_zonelists建立管理结点及其内存域所需的数据结构。start_kernel->build_all_zonelists(NULL,NULL)->build_all_zonelists_init()->__build_all_zonelists(NULL)...

2020-05-28 09:56:17 581

原创 【linux 内存管理】深入理解linux内核架构 内存管理(1)

一、UMA,一致性内存访问(uniform memory access),将可用内存以连续方式组织起来。SMP系统的每个处理器访问的都是同一个内存区。NUMA,非一致性内存访问,总是多处理器计算机。系统各个CPU都有本地内存,可支持特别快速的访问。各个处理器之间通过总线连接起来,一支持对其他CPU的本地内存的访问,当然比访问本地内存要慢一些。二、NUMA内存组织...

2020-05-28 09:56:08 461

原创 【linux 内存管理】 linux内核设计与实现

部分转载自原文链接:https://blog.csdn.net/u010521366/article/details/89204616页(物理页):内核把物理页作为内存管理的最小单位,用struct page结构体表示系统的每个物理页:flag用来存放页的状态,包括这个页是不是脏的,是不是被锁定在内存中,它至少可以同时表示32种不同的状态。count存放页的引用计数,通常用page...

2020-05-28 09:55:59 174

原创 【linux 内存管理】zone初始化

zone初始化调用:zone_sizes_init->free_area_init_nodesfree_area_init_nodes()的参数max_zone_pfns是一个数组,pfn(page frame num),其实就是标识了各个内存域的起始页帧(页框)标号。ZONE_DMA之前还有大约1M的内存是留给bootloader的。通过这个也可以计算出各个内存域的大小。v...

2020-05-28 09:55:47 1006

原创 【linux 内核】中断下半部

中断下半部包含:软中断、tasklet、任务队列。一、软中断: 软中断是一组静态定义的下半部接口,有32个,可以在所有处理上同时执行---即使两个类型相同的也可以。kernel/softirq.c中定义了饿一个包含有32个该结构体的数组,static struct softirq_action softirq_vec[NR_SOFTIRQS],NR_SOFTIRQS = 32...

2020-05-28 09:53:43 335

转载 [转载]HTTPS 解释很通俗的文章

https://cloud.tencent.com/developer/article/1425339https://blog.csdn.net/hherima/article/details/52469674

2019-11-19 11:40:45 79

原创 【linux 内核】内核编译相关 Kconfig .config

内核源码可以看做是源码树,通过Kconfig .config Makefile 三个文件来控制内核哪些模块被编译,编译什么架构等。一下是经过网上查找的资料自己的理解。Kconfig 是内核模块节点的位置标记,相当于树节点,有位置域,数据域。位置域确定的该节点位于源码树的位置,这样有利于make menuconfig等可视化工具来管理模块,可以说make menuconfig 是根据Kcon...

2019-07-10 21:18:57 500

转载 【linux 内核】转载 内核启动分析

https://www.cnblogs.com/morphling/p/3595287.html

2019-06-11 08:59:55 149

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除