linux_cpu_大致信息查看
因为需要知道当前linux cpu是多少位的,才能知道内核空间的分布
64位Linux-般使用48位来表示虚拟地址空间,45位表示物理地址。通过命令: cat/proc/cpuinfo。
查看Linux内核位数和proc文件系统输出系统软硬件信息如下:
通过cat /proc/cpuinfo输出地址大小,具体其它选项参数: .
vendor_ id : GenuineIntel // CPU制造商
cpu family : 6 // CPU产品代号
model: 142 // CPU属于其系列当中的哪一一个代号
model name : Intel(R) Core(TM) i7-10510U CPU @ 1 .80GHz // CPU属于的名称、编号、主频
stepping : 12 // CPU属于制作更新版本
cpu MHz: 2303.996 // CPUr实际使用主频
cache size: 8192 KB // CPU二级缓存
physicalid : 0 //单个CPU的标号
siblings : 1 II单个CPU逻辑物理核数
core id: 0//1 当前物理核在其所处的CPU中编号
cpu cores: 1 //逻辑核所在CPU的物理核数
apicid: 0 //用来区分不同逻辑核的编号
bogomips: 4607.99 //系统内核启动时测算的CPU速度
clflush size : 64 //每次刷新缓存的大小单位
cache_ alignment : 64 //缓存地址空间对齐单位
address sizes : 45 bits physical, 48 bits virtual //可以访问的地址空间位数!!!!!
ARM64内核内存分布(虚拟地址)
ARM64架构处理器采用48位物理寻址机制,最大可寻找256TB的物理地址空间。对于目前应用完全足够,不需要扩展到64位的物理寻址。虚拟地址也同样最大支持48位寻址,所以在处理器架构设计上,把虚拟地址空间划分为两个空间,每个空间最大支持256TB,
linux内核在大多数体系结构上都把两个地址划分为:用户空间和内核空间
详细虚拟地址内存分布
用户空间:0x0000_0000_0000_0000至0x0000_ffff_ffff_ffff。
内核空间:0xffff_0000_0000_0000至0xffff_ffff_ffff_ffff。
对上面的图片做出细致的描述
如果内存没用完 可以使用8/1作为影子区域kasan
查看系统中内存使用情况
cat /proc/meminfo输出系统架构内存分布情况
MemTotal: 12165668 kB //所有可用内存空间的大小
MemFree: 10151616 kB //系统还没有使用内存(没回收的内存也在这里面)
MemAvailable: 10570548 kB //真正系统可用内存(有些内存被使用了还没有被回收,比如cachebuffsr slbas
Buffers: 52596 kB I1专用用来给块设备做缓存的内存
Cached: 575008 kB //分配给文件缓冲区的内存(比如vi文件,把没有保存的内容写到缓冲区)
SwapCached:0 kB //被高速缓冲缓存使用的交换空间大小(一般指硬盘swap的大小)
Active:1158808 kB //使用高速缓冲存储器页面文件大小
Inactive:345196 kB // 没有经常使用的高速缓存存储器大小
Active(anon): 870720 kB //活跃的匿名内存
Inactive(anon): 12504 kB // 不活跃的匿名内存
Active(ile): 288088 kB //活跃的文件使用内存
Inactive(ile): 332692 kB //不活跃的文件使用内存
Unevictable:16 kB //不能被释放的内存页
Mlocked:16 kB 系//统调用mlock允许程序在物理内存上锁住部分或全部地址空间(可以阻止linux的内存页调度到交换空间)
SwapTotal:2097148 kB //交换空间总内存大小
SwapFree:2097148 kB //交换空间空闲的内存大小
Dirty: 24 kB //等待被写回到磁盘
Writeback:0 kB //正在被写加的大小.
AnonPages:876420 kB //未映射页的内存/映射到用户空间的非文件页表大小
Mapped: 255420 kB //映射文件内存
Shmem:13896 kB // 已经被分配的共享内存
KReclaimable:70884 kB //可回收的slab内存
Slab:151976 kB //内存数据结构缓存的大小
CommitLimit: 8179980 kB //系统实际可以分配内存
Committed_ AS: 4649264 kB //系统当前已经分配的内存
VmallocTotal: 34359738367 kB // 预留虚拟内存的总量
VmallocUsed:27836 kB //已经被使用的虚拟内存
VmallocChunk:0 kB //可分配的最大逻辑地址连续的虚拟内存
内存的堆管理
堆是进程中主要用于动态分配变量和数据的内存区域,堆的管理对应程序员不是直接可见的。malloc和内核之间的经典接口是brk系统调用, 负责扩展/收缩堆。
每个进程都有独立的虚拟地址空间 虚拟地址可以通过每个进程的页表和物理进程映射用来获得真正的物理地址
如果虚拟地址对应的物理页不在物理内存这时候产生一个缺页中断,此时分配一个真正的物理地址,此时更新一些进程页表 如果此时物理内存已经耗尽,会根据内存替换规则的算法设计,删除一些页面保存
linux在堆的使用通过 brk或sbrk进行动态调整
结构体引入
堆是一个连续的内存区域,在扩展时自下至上增长。其中mm struct结构, 包含堆在虚拟
地址空间中的起始和当前结束地址(start brk和brk)。
Mm_struct 内存描述结构体中有堆栈的起始地址和结束地址
Linux系统当中有两个方法可以创建堆:
用户空间使用malloc 系统空间使用brk()是系统调用,实际是设置进程数据段的结束地址,将数据段的结束地址向高地址移动。
mmap()向操作系统申请- -段虚拟地址空间(使用映射到某个文件)