通过inode删除特殊字符文件

对于正常使用rm无法删除的文件可以通过查找inode进行删除 ls -i find -inum xxx -delete or ls -i find -inum xxx -exec rm -i {} \; 直接删除 [root@centosgpt vm]# ls -i 2278688 > 13592459 memdump2.c~ 13592454 memzero 7506486 test.c~ 2275894 118902.mem 2275882 memdump2.py 13592461 memzero.c 9733651 translate ... [root@centosgpt vm]# find -inum 2278688 -delete [root@centosgpt vm]# ls 118902.mem idle.py~ memdump3.c memory_layout processwrite.c test.c~ vsyscall.c 18 memdump memdump4 memory_layout.c processwrite.c~ translate 交互式 [root@centosgpt vm]# ls -i 7506464 > 13592459 memdump2.c~ 13592454 memzero 7506486 test.c~ 2275894 118902.mem 2275882 memdump2.py 13592461 memzero.c 9733651 translate [root@centosgpt vm]# find -inum 7506464 -exec rm -i {} \; rm: remove regular empty file ‘./>’? y [root@centosgpt vm]# ls 118902.mem idle.py~ memdump3.c memory_layout processwrite.c test.c~ vsyscall.c 18 memdump memdump4 memory_layout.c processwrite.c~ translate

2020-04-16 · 1 min · 116 words

Linux进程内存布局及映射信息

Linux进程内存布局及映射信息 处理器在运行程序时,需要存储器来存放程序和程序使用的数据, 现代操作系统提供了存储器的抽象:虚拟存储器, 使得应用程序来说不用过多的考虑物理存储使用,简化了内存管理. 虚拟存储器 虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件完美的交互,它为每一个进程提供了一个大的、一致的、私有的地址空间. --深入理解计算机系统 在多应用复杂任务场景下,进程直接使用物理内存存在一些问题: 处理数据大小: 应用程序存储的使用,将受制于物理内存大小; 复杂性:应用程序要清楚需要使用的物理地址,何时申请,何时释放,甚至产生碎片后是否要进行整理等; 安全性:如果一个进程不小心改写了另外一个进程也正在使用的内存,进程可能会莫名其妙的挂掉. 虚拟存储器很好的解决了这类问题: 高效使用内存: 将主存看作存储在磁盘上地址空间的高速缓存,主存只保存活动区域 简化存储管理: 虚拟存储提供一致的地址空间 对进程空间的保护: 以免地址空间被其他进程破坏 内存布局、映射的信息 虚拟存储用于管理,最终还是要使用到物理内存, Linux提供了一些接口可以查看,进程(虚拟)内存布局, 虚拟内存与物理内存的映射等。 相关的proc文件 可以通过下面的proc文件查看布局及映射信息 /proc/iomem: 物理内存布局 /proc/pid/maps: 进程虚拟内存布局 /proc/pid/mem: 进程内存查看 /proc/pid/pagemap: 虚拟内存映射到物理内存的信息 /proc/kpagecount: 映射的次数 /proc/kpageflags: 页面的状态 /proc/kpagecgroup: 可以查看每一页对应的cgroup的inode 物理内存使用布局 /proc/iomem 这个文件显示统内存与每个物理设备映射关系, 虚拟机内存物理内存配置了512M 00000000-00000fff : Reserved 00001000-0009ebff : System RAM 0009ec00-0009ffff : Reserved 000a0000-000bffff : PCI Bus 0000:00 000c0000-000c7fff : Video ROM 000ca000-000cafff : Adapter ROM 000cc000-000cffff : PCI Bus 0000:00 000d0000-000d3fff : PCI Bus 0000:00 000d4000-000d7fff : PCI Bus 0000:00 000d8000-000dbfff : PCI Bus 0000:00 000dc000-000fffff : Reserved 000f0000-000fffff : System ROM 00100000-1fedffff : System RAM 0ba00000-0c600de0 : Kernel code 0c800000-0cc16fff : Kernel rodata 0ce00000-0d00a8ff : Kernel data 0d5dc000-0dbfffff : Kernel bss 1fee0000-1fefefff : ACPI Tables 1feff000-1fefffff : ACPI Non-volatile Storage 1ff00000-1fffffff : System RAM ... 第一列:内存地址范围 第二列:对应的内存用途 可以看到含有System RAM的几个段 ...

2020-04-12 · 21 min · 4431 words

linux-sides-Timers and time management in the Linux kernel. Part 5.

这篇文章 Timers and time management in the Linux kernel. Part 5. 是出自 linux-insides一书中 Timers and time management 章节 Introduction to timers 内核版本比对5.5-rc6 进行了相关调整, 增加相关备注 clockevents框架简介 这是本章节的第五部分,它描述了Linux内核中与计时器和时间管理相关的内容。正如您可能从本部分的标题中注意到的那样,将讨论clockevents框架。我们已经在本章的第二部分中看到了一个框架。这是clocksource框架。这两个框架都是Linux内核中的计时抽象。 首先,让我们回忆一下clocksource框架以及它的用途。 clocksource框架的主要目标是提供timeline。如documentation中所述: 例如,在Linux终端上输入命令date将最终读取时钟源以确定确切的时间。 Linux内核支持许多不同的时钟源。 您可以在drivers/clocksource中找到其中的一些。 例如,老一些的比如Intel 8253-可编程间隔计时器,频率为1193182, 还有一个-ACPI PM计时器,频率为3579545Hz。 除了drivers/clocksource目录之外,每种体系结构都可以提供自己的体系结构专用时钟源。 例如x86架构提供了高精度事件计时器,或者例如是powerpc通过timebase寄存器提供对处理器计时器的访问。 每个时钟源都提供单调原子计数器。 Linux内核支持大量不同的时钟源,每个时钟源都有自己的参数,例如frequency。 clocksource框架的主要目标是提供API,以选择系统中最佳的可用时钟源,即频率最高的时钟源。 clocksource框架的另一个目标是由时钟源提供的以人类时间单位的表示的原子计数器。 在这个时候,纳秒是Linux内核中给定时钟源的时间值单位的首选。 clocksource框架被定义在include/linux/clocksource.h头文件中的clocksource结构中,其中包含时钟源的name,系统中某些时钟源的额定值(频率较高的时钟源在系统中具有最大的额定值),系统中所有已注册时钟源的list,enable和disable字段来启用和禁用时钟源,指向read函数(必须返回时钟源的原子计数器)的指针等等。 另外,clocksource结构提供了两个字段:mult和shift,这是由某个时钟源提供给人类计时单位的原子计数器转换所必需的,即nanoseconds.通过以下公式进行转换: ns ~= (clocksource * mult) >> shift 我们已经知道,除了clocksource结构之外,clocksource框架还提供了一个API,用于注册具有不同频率比例因子的时钟源: static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) static inline int clocksource_register_khz(struct clocksource *cs, u32 khz) 时钟源注销: int clocksource_unregister(struct clocksource *cs) … 除了clocksource框架之外,Linux内核还提供了clockevents框架。 如文档中所述: 时钟事件与时钟源在概念上相反 主要目标是管理时钟事件设备,或者换句话说,即管理允许注册事件的设备,换句话说,就是要进行以下操作的设备:中断将在将在将来的指定时间发生。 现在,我们对Linux内核中的clockevents框架有了一些了解,现在是时候来看一下API. clockevents框架相关API 描述时钟事件设备的主要结构是clock_event_device结构。 此结构在include/linux/clockchips.h头文件中定义,并且包含大量字段。 除了clocksource结构之外,它还具有name字段,其中包含时钟事件设备的可读名称,例如local APIC计时器: static struct clock_event_device lapic_clockevent = { .name = "lapic", ... ... ... } 某个时钟事件设备的event_handler,set_next_event,next_event函数的地址是中断处理程序,下一个事件的设置程序和本地分别存储下一个事件。 clock_event_device结构的另一个字段是-features字段。 它的价值可能来自以下通用功能: ...

2020-01-19 · 4 min · 715 words

内存管理 - 页面大小

内存管理发展阶段 内存(RAM)是计算机一种重要资源, 随着应用越来越复杂,不管存储器有多大,程序都可以把他填满,这就迫使人们不断寻找解决方案去管理它. 内存管理经历的几个阶段; 无存储抽象阶段 (No Memory abstraction) 地址空间 (Address Spaces) 虚拟内存 (Virtual Memory) 无存储抽象阶段: 直接使用物理地址, 简单和划分了用户和操作系统,(驱动程序)使用的内存. 早期的MSDOS采用这种管理方案。 通过每个进程基址寄存器和界限寄存器实现动态重定位,映射到不通的物理内存。通过交换技术和空闲内存管理, 处理内存超载 构建虚拟地址空间,通过MMU(内存管理单元)完成虚拟内存与物理内存的映射。 分页 分页就是出现虚拟内存这个阶段.虚拟地址按照固定大小划分成若干个页面Page, 物理内存中对应为页框 Page Frame (物理内存最小数据单位), 当程序试图访问内存时,MMU根据虚拟地址映射为物理地址. 页面大小 不同处理器体系结构页面大小 体系结构 最小页面 支持大页面 32-bit x86 4 KiB 4 MiB, 2 MiB x86-64 4 KiB 2 MiB, 1 GiB IA-64 (Itanium) 4 KiB 8 KiB, 64 KiB, 256 KiB, 1 MiB, 4 MiB, 16 MiB, 256 MiB Power ISA 4 KiB 64 KiB, 16 MiB, 16 GiB SPARC v8 with SPARC Reference MMU 4 KiB 256 KiB, 16 MiB ARMv7 4 KiB 64 KiB, 1 MiB , 16 MiB UltraSPARC Architecture 2007 8 KiB 64 KiB, 512 KiB , 4 MiB, 32 MiB, 256 MiB, 2 GiB, 16 GiB 页面大小考虑因素(wiki) 页面大小通常有处理器体系结构决定, 目前常用页面大小4KB。选择最佳页面大小要考虑一下几个因素: ...

2020-01-10 · 2 min · 399 words

HugeTLB Pages

这篇文章 Huge TLB Pages是出Linux Kernel文档 概述 该文档目的是简要概述在Linux内核HugePage。 现代CPU体系架构支持基于多个页面。 例如,x86 CPU通常支持4K和2M(如果体系结构支持,则为1G)页面大小,ia64架构支持多种页面大小4K,8K,64K,256K,1M,4M,16M,256M和ppc64支持4K和16M。 TLB是虚拟到物理的缓存转化。 通常,这是处理器上非常稀缺的资源。 操作系统试图充分利用有限数量的TLB资源。 现在,随着物理内存越来越大,这种优化变得越来越(几个GB)容易获得。 用户可以通过使用mmap系统调用来使用Linux内核中的Huge Page或标准SYSV共享内存系统调用(shmget,shmat)。 首先,Linux内核需要使用CONFIG_HUGETLBFS构建和CONFIG_HUGETLB_PAGE配置选项。 /proc/meminfo 文件提供内核Huge Page池中的持久性Huge Page的总数。它还显示默认Huge Page大小和空闲的数量,保留数量的信息 以及默认大小的Huge Page池中的多余Huge Page。 需要Huge Page大小才能生成正确的对齐方式, 映射Huge Page区域的系统调用的参数大小。 /proc/meminfo 文件中包含Huge Page信息如下: HugePages_Total: uuu HugePages_Free: vvv HugePages_Rsvd: www HugePages_Surp: xxx Hugepagesize: yyy kB Hugetlb: zzz kB HugePages_Total 总页面数量 HugePages_Free 未使用页面数量 HugePages_Rsvd 预留未使用数量 HugePages_Surp 预留未使用数量, 指大于/proc/sys/vm/nr_hugepages部分, 最大保留值由/proc/sys/vm/nr_overcommit_hugepages控制. Hugepagesize 每个页的大小单位Kb Hugetlb 占用内存大小(kB)相当于 HugePages_Total * Hugepagesize 详细信息可以查看 /sys/kernel/mm/hugepages /proc/filesystems 可以看到内核中的的hugetlbfs文件系统类型 ...

2020-01-07 · 2 min · 353 words

putty免密登录SSH服务

环境 cenos7(X86_64) + openssh windows10 putty 配置 生成公私钥对 - 使用puttygen.exe生成公私钥对; 1. 运行puttygen.exe 点击 Generate按钮, 鼠标在进度条下方的窗口空白区移动生成公私钥对。 2. 分别点击 Save public key,Save private key导出后保存在本地. 安装公钥到远程服务器 公钥上传server, 相应用户目录下, 生成authorized_keys文件; mkdir .ssh ssh-keygen -i -f mypublickey >> .ssh/authorized_keys 其中mypublickey,为上一个步骤保存的公钥文件 配置putty 载入服务器配置信息 Session 选项卡片 Load按钮,载入要登录服务器信息 登录用户 Connection - Data选项,Auto-login username 输入登录使用的用户名 配置私钥 Connection - SSH - Auth选项卡片中, 点击Browse按钮选择之前导出私钥文件 保存信息 Session 选项卡片 Save按钮,保存登录服务器信息配置步骤: 常见问题 Server refused our key: 由于目录权限问题到导致可以通过以下命令处理: $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys ...

2019-12-31 · 1 min · 92 words

Linux Swap 分区相关命令

/proc/swaps 文件 # cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 0 -2 /proc/meminfo 文件 # grep Swap /proc/meminfo SwapCached: 0 kB SwapTotal: 4194300 kB SwapFree: 4194300 kB swapon # swapon -s Filename Type Size Used Priority /dev/dm-1 partition 4194300 0 -2 free free -g/-k/-m # free -g total used free shared buff/cache available Mem: 1 0 0 0 1 1 Swap: 3 0 3 vmstat # vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 130536 172 1654888 0 0 0 3 1 23 0 0 100 0 0 top/atop/htop/glance 参考引用 How To Check Swap Usage Size and Utilization in Linux

2019-11-03 · 1 min · 122 words

物理内存管理

物理内存组织方式 SMP: CPU 通过总线访问内存, 称为 SMP 对称多处理器, 采用平坦内存模型, 物理页号连续, 总线成为瓶颈 NUMA: CPU 都有本地内存, 访问内存不用总线, 称为 NUMA 非一致内存访问 采用非连续内存模型,页号不连续 稀疏内存模型 下面以NUMA 为例. 节点 数据结构 pglist_data 表示 NUMA 节点 包括 id,page 数组,起始页号, 总页数, 可用页数 区域 zone 节点分为多个区域 zone ZONE_DMA; ZONE_NORMAL; ZONE_HIGHMEM, ZONE_MOVABLE 数据结构 zone 表示 区域 包含第一个页页号; 区域总页数; 区域实际页数; 被伙伴系统管理的页数; 用 per_cpu_pageset 区分冷热页(热页, 被 CPU 缓存的页) 页 数据结构 page 表示, 分配方式: 匿名页分配; 分配小块内存: Linux 采用 slab allocator 技术; 申请一整页, 分为多个小块存储池, 用队列维护其状态(较复杂) slub allocator 更简单 slob allocator 用于嵌入式 page 记录: 第一个 slab 对象; 空闲列表; 待释放列表 页分配 使用伙伴系统 进行管理分配 Linux 把空闲页分组为 11 个页块链表, 链表管理大小不同的页块(页大小 2^i * 4KB)

2019-11-03 · 1 min · 93 words

linux-sides-Timers and time management in the Linux kernel. Part 4.

这篇文章 Timers and time management in the Linux kernel. Part 4. 是出自 linux-insides一书中 Timers and time management 章节 Introduction to timers 内核版本比对5.4-rc2 进行了相关调整, 增加相关备注 Linux内核中的定时器和时间管理.Part 4. 定时器 这是本章的第四部分,通过前一部分描述了Linux内核中与计时器和时间管理相关的内容,我们知道Linux内核中的tick broadcase框架和NO_HZ模式。我们将在这一部分继续研究与Linux内核中与时间管理相关的内容,并熟悉Linux内核中的另一个概念-timers。在研究Linux内核中的计时器之前,我们必须学习一些有关此概念的理论。请注意,我们将在本部分中考虑软件计时器。 Linux内核提供了软件计时器的概念,以允许将来可以调用内核功能。计时器在Linux内核中被广泛使用。例如,查看源代码文件 net/netfilter/ipset/ip_set_list_set.c。此源代码文件提供了用于管理IP地址组的框架的实现。 在 list_set 结构中包含了 time_list 变量 gc : struct list_set { ... struct timer_list gc; ... }; 并非gc字段具有timer_list类型。 在include/linux/timer.h 头文件中定义的结构,该结构的要点是存储 Linux内核中的动态计时器。 实际上,Linux内核提供了两种类型的计时器,称为动态计时器和间隔计时器。 内核使用第一种计时器,用户模式使用第二种计时器。timer_list结构包含实际的dynamic定时器。 在我们的示例中,list_set包含gc计时器代表垃圾收集的计时器。 该计时器将在list_set_gc_init函数中初始化: static void list_set_gc_init(struct ip_set *set, void (*gc)(struct timer_list *t)) { struct list_set *map = set->data; timer_setup(&map->gc, gc, 0); mod_timer(&map->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ); } 按照现有版本进行调整 由gc指针指向的函数,将在超时时间等于map->gc.expires后被调用。 ...

2019-10-25 · 6 min · 1230 words

进程内存布局

内存管理包含: 物理内存管理 虚拟内存管理 物理内存与虚拟内存的映射 除了内存管理模块, 其他模块都使用虚拟地址(包括内核) 虚拟内存空间包含: 内核空间(高地址) 用户空间(低地址) +--------------+ | kernel space | high address +--------------+ ^ | stack | | +--------------+ | ^ | | user | | space | | v +--------------+ | heap | +--------------+ | bss | +--------------+ | | data | | +--------------+ | | text | v +--------------+ low address 空间存放内容 用户空间:多个进程看到的用户空间是独立的 从低到高布局为: 代码段 数据段 BSS段(未初始化静态变量) 堆 内存映射段 栈地址空间段 内核空间: 多个进程看到同一内核空间, 但内核栈每个进程不一样 内核代码也仅能访问内核空间 内核也有内核代码段, DATA 段, 和 BSS 段; 位于内核空间低地址 内核代码也是 ELF 格式, 只是所处的位置不同 内存映射 分段 虚拟地址 = 段选择子(段寄存器) + 段内偏移量 段选择子 = 段号(段表索引) + 标识位 段表 = 物理基地址 + 段界限(偏移量范围) + 特权等级 段表称为段描述符表, 放在全局标识符表中 Linux 将段基地址都初始化为 0, 不用于地址映射 Linux 分段功能主要用于权限检查 分页 物理内存被换分为大小固定(4KB)的页, 物理页可在内存与硬盘间换出/换入 ...

2019-10-25 · 1 min · 163 words