}); } private int getNum() { return 0; } } 报错原因 在匿名内部类的方法里去调用外部类的私有方法或变量就会报这个PMD...的权限改为protected: 1 2 3 protected int getNum() { return 0; } 警告 本文最后更新于 August 23, 2018,文中内容可能已过时,请谨慎使用
PMD是Poll Mode Driver的缩写,即基于用户态的轮询机制的驱动。本文将介绍PMD的基本原理。...在不考虑vfio的情况下,PMD的结构图如下: pmd.jpg 虽然PMD是在用户态实现设备驱动,但还是依赖于内核提供的策略。...当使用DPDK脚本dpdk-devbind来bind网卡时,会通过sysfs与内核交互,让内核使用指定驱动来匹配网卡。...当使用igb_uio bind指定设备后,内核会调用igb_uio注册的struct pci_driver的probe函数,即igbuio_pci_probe。...使用信号异步通知async_queue队列中的进程;目前DPDK没有使用异步IO的方式,所有对于DPDK的PMD来说,只有前两个语句有用。
1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。...可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。...关键字: PTE: 页表项(page table entry) PGD(Page Global Directory) PUD(Page Upper Directory) PMD(Page Middle...Directory) PT(Page Table) PGD中包含若干PUD的地址,PUD中包含若干PMD的地址,PMD中又包含若干PT的地址。
1.背景 使用代码分析工具PMD检查Android Java代码缺陷,本文是个整理。 介绍 PMD是一个静态源代码分析器。它找到常见的编程缺陷,如未使用的变量,空的catch块,不必要的对象创建等等。...PMD具有许多内置检查(在PMD术语,规则中),这些检查在规则参考中针对每种语言进行了记录。我们还支持广泛的API来编写您自己的规则,您可以使用Java或作为自包含的XPath查询来执行。...除其他外,PMD可以运行: 作为Maven的目标 作为Ant任务 作为Gradle任务 从命令行 官网地址 https://pmd.github.io/pmd/index.html 命令行方式使用 PMD...E4%BD%BF%E7%94%A8pmd Gradle 方式使用 PMD 的Demo https://github.com/vir56k/demo/tree/master/pmd/UsePMDByGradle...2.命令行方式使用 PMD 2.1 先了解使用手册 https://pmd.github.io/pmd/pmd_userdocs_installation.html#how-to-install-pmd-and-cpd
PMD是Poll Mode Driver的缩写,即基于用户态的轮询机制的驱动。本文将介绍PMD的基本原理。 在不考虑vfio的情况下,PMD的结构图如下: ? 图1....PMD结构图 虽然PMD是在用户态实现设备驱动,但还是依赖于内核提供的策略。...当使用DPDK脚本dpdk-devbind来bind网卡时,会通过sysfs与内核交互,让内核使用指定驱动来匹配网卡。...当使用igb_uio bind指定设备后,内核会调用igb_uio注册的struct pci_driver的probe函数,即igbuio_pci_probe。...使用信号异步通知async_queue队列中的进程;目前DPDK没有使用异步IO的方式,所有对于DPDK的PMD来说,只有前两个语句有用。
上一节使用checkstyle来规范你的项目主要解决了代码编码规范问题,比如缩进换行等。这次继续代码健康工具类PMD。...它可以用来检查 潜在的bug:空的try/catch/finally/switch语句 未使用的代码:未使用的局部变量、参数、私有方法等 可选的代码:String/StringBuffer的滥用 复杂的表达式...在gradle中使用 gradle还是一贯的简单,新建pmd.gradle /** * The PMD Plugin * * Gradle plugin that performs quality.../gradlew build 报告位置: build/reports/pmd/main.html 在maven中使用 maven需要把ruleset放到resources下读取,如果是单moudle项目...未使用的代码(rulesets/unusedcode.xml)—— 查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。
配置pmd 4....配置jacoco 5.执行指定版本 ---- 这几个工具的用途: checkstyle:检测代码规范 findbugs:检测代码不明显的语法错误,比如使用“==”比较字符串 pmd:扫描潜在问题,如未用过的局部变量...配置pmd 这个pmd一开始我看不太懂的,很多配置文件,第一个反应就是,这配置文件哪里有、怎么配、要自己写吗?...www.cnblogs.com/pixy/p/4718176.html 覆盖率为0的情况: 自动化配置四 Jenkins配置sonar 配置多模块覆盖率为0问题 如果是多个模块,可以把这些依赖放到父pom里,然后在运行的使用使用命令来执行...:pmd org.jacoco:jacoco-maven-plugin:prepare-agent -Dmaven.test.failure.ignore=true 在使用这些命令的时候使用 -Dmaven.test.failure.ignore
* Idea by Alex Bligh (alex@cconcepts.co.uk) */ #include #include #include #include #include #include ...#include #include #include #include ...= pmd_offset(dir, 0); // 清空pgd的内容 pgd_clear(dir); // 如果pmd还有其他进程在使用,则pmd引用数减一即可 if (pmd_inuse...*/ // 如果有多个进程在使用,则需要为执行写操作的进程,新增一个页表项,指向新页,如果只有一个进程在使用,则不需要 if (mem_map[MAP_NR(old_page)] !
使用页面映射需要两层映射结构,页面的选择可以是64KB的大页面或4KB的小页面,如图2.4所示。Linux内核通常使用4KB大小的小页面。 ?...将这个12bit的物理地址和虚拟地址的低20bit拼凑在一起,就得到32bit的物理地址; 如果使用页面映射的方式,段映射表就变成了一级映射表(First Level table,在linux内核中成为...crate_mapping()函数就是为一个给定内存区间建立页表映射,这个函数使用map_desc数据结构来描述一个内存区间。...16个不同域,但在ARM Linux只定义和使用3个; #define DOMAIN_KERNEL 2 #define DOMAIN_TABLE 2 #define DOMAIN_USER 1 #define...512个页面表是给ARM硬件MMU使用的; 一次映射两个相邻的一级页表项,也就是对应的两个相邻的二级页表都存放在一个page中; 然后把这个PTE页面表的基地址通过__pmd_populate(
TTBRx寄存器保存了第0级页表的基地址(L0 Table base address, Linux内核中称为PGD), L0页表中有512个表项(Table Descriptor),以虚拟地址的bit[...每个表项的内容含有下一级页表的基地址,即L1页表(Linux内核中称为PUD)的基地址。...PUD页表中有512个表项,以虚拟地址的bit[38:30]为索引值在PUD表中查找相应的表项,每个表项的内容含有下一级页表的基地址,即L2页表(Linux内核中称为PMD)的基地址。...PMD页表中有512个表项,以虚拟地址的bit[29:21]为索引值在PMD表中查找相应的表项,每个表项的内容含有下一级页表的基地址,即L3页表(Linux内核中称为PTE)的基地址。...索引值可以通过pte_index()来计算,最终会使用虚拟地址bit[20:12]来做索引值。 接下来以PAGE_SIZE即4KB大小为步长,通过while循环来设置PTE页表项。
在 Linux 系统中的每个进程都有独立 4GB 内存空间,而 Linux 把这 4GB 内存空间划分为用户内存空间(0 ~ 3GB)和内核内存空间(3GB ~ 4GB),而内核内存空间由划分为直接内存映射区和动态内存映射区...为什么需要vmalloc区 由于直接内存映射区(3GB ~ 3GB+896MB)是直接映射到物理地址(0 ~ 896MB)的,所以内核不能通过直接内存映射区使用到超过 896MB 之外的物理内存。...这时候就需要提供一个机制能够让内核使用 896MB 之外的物理内存,所以 Linux 就实现了一个 vmalloc 机制。...那么什么时候使用 vmalloc 呢?一般来说,如果要申请大块的内存就可以用vmalloc。...为了解决内核空间同步问题,Linux 并不是直接对当前进程的内核空间映射的,而是对 init 进程的内核空间(init_mm)进行映射,我们来看看 vmalloc_area_pages() 函数的实现:
Linux物理内存三级架构 对于内存管理,Linux采用了与具体体系架构不相关的设计模型,实现了良好的可伸缩性。它主要由内存节点node、内存区域zone和物理页框page三级架构组成。...Linux内核中使用数据结构pg_data_t来表示内存节点node。如常用的ARM架构为UMA架构。...• 内存区域zone 内存区域位于同一个内存节点之内,由于各种原因它们的用途和使用方法并不一样。...如基于IA32体系结构的个人计算机系统中,由于历史原因使得ISA设备只能使用最低16MB来进行DMA传输。又如,由于Linux内核采用 • 物理页框page 2....Linux虚拟内存三级页表 Linux虚拟内存三级管理由以下三级组成: • PGD: Page Global Directory (页目录) • PMD: Page Middle
我们知道linux采用了分页机制,通常采用四级页表,页全局目录(PGD),页上级目录(PUD),页中间目录(PMD),页表(PTE)。如下: ?...linux中对地址转换的实现 /*描述各级页表中的页表项*/ typedef struct { pteval_t pte; } pte_t; typedef struct { pmdval_t pmd;...#include #include #include #include ...#include #include #include #include MODULE_DESCRIPTION...下一篇我们正式进入内存管理的大门——linux内存管理。
左图使用了THP,latency最高1ms;右图则没有使用THP,最高latency大约0.3ms。...2,perf 作者并没有什么好的想法,于是尝试使用perf看看有什么异常。...如果自己使用源代码编译的kernel的话,可以到linux/tools/perf目录下执行make,并把编译后的perf复制到/usr/bin目录下可以使用。 ?...3,do_huge_pmd_wp_page 分析Linux的源代码,发现在THP的情况下,如果发生了COW: a,发生了page fault b,处理page fault,检查地址,然后确定是因为COW...使用systemtap验证,并计算do_huge_pmd_wp_page执行的时间: global count global tm probe begin { printf("start systemtap
linux用vma链表管理一个进程使用的虚拟地址空间。下面是实现代码。.../* * linux/mm/mprotect.c * * (C) Copyright 1994 Linus Torvalds */ #include #include... #include #include #include #include #include #include #include #include <asm/...end; if (pmd_none(*pmd)) return; if (pmd_bad(*pmd)) { printk("change_pte_range: bad pmd
1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制,即...1.3 为什么linux热衷:分页>分段 那么,为什么Linux是如此地热衷使用分页技术而对分段机制表现得那么地冷淡呢,因为Linux的进程处理很大程度上依赖于分页。...2 linux中页表处理数据结构 2.1 页表类型定义pgd_t、pmd_t、pud_t和pte_t Linux分别采用pgd_t、pmd_t、pud_t和pte_t四种数据结构来表示页全局目录项、页上级目录项...2.2 页表描述宏 参照arch/x86/include/asm/pgtable_64 linux中使用下列宏简化了页表处理,对于每一级页表都使用有以下三个关键描述宏: 宏字段 描述 XXX_SHIFT...如果页中间目录项指向一个大型页(2MB或4MB),pmd_large(e)返回1,否则返回0。 宏pmd_bad由函数使用并通过输入参数传递来检查页中间目录项。
这么做的原因是为了访问效率,内核直接使用这些地址时,不需要重映射。并且这些地址是大页映射,tlb miss概率降低。一般来说,x86和arm64都是1G或者2M的大页。...注意:linux内核虽然在开机的时候,映射了(对于64为平台来说)所有物理内存,但是他并没占有这些内存,只是为了访问方便。 以下代码来自于:linux-5.15,ARM64架构。...= end); 398 } 以下函数用来分配pud页表项,注意他会调用 use_1G_block 来判断是否使用1G页表,如果条件为真,那么映射完毕,不需要走PMD和PTE了。...注意,对于一个典型ARM64 Linux架构来说,pte能映射2^9*4K = 2M地址空间。...注意,对于一个典型ARM64 Linux架构来说,pmd能映射2^9*2M = 1G地址空间。
,而是使用L1,L2,L3页表这种术语。...Domain:Domain域,指明所属的域,Linux中只使用了3个域。 bit31:bit10:指向二级页表基地址。 二级页表的表项 bit0:禁止执行标志。...而计算机地址总线却使用超过32位的,比如X86的就使用36位(64G)的地址总线,ARM使用的是48位(64G)的地址总线。...作为参数 如果页面错误不是写操作且内存管理子系统允许使用零页,则映射到零页面 生成一个特殊页表项,映射到专有的0页,一页大小 据pmd,address找到pte表对应的一个表项,并且lock住 如果页表项不为空...小结 从以上的分析中,我们可以学习到关于常用的页表的宏的使用方法。Linux内核就是这样,你不光可以看到某个函数的实现,还可以看到某个函数的调用过程。
10行数据 Linux文件系统结构 / : 根目录 /home: 主文件夹,登录用户的主文件夹 /etc :操作系统配置文件的保存位置 /usr : 用于添加的程序文件,用户的很多应用程序和文件都放在这个目录下...本地文件 :上传本地文件到远程服务器 ,只能是压缩文件,比如.tar.gz push abc.txt : 上传本地当前文件abc.txt到远程服务器 exit : 退出 windows 操作Linux...pyttty 开源软件 Linux打包命令 tar -czvf 包文件.tar.gz 文件夹1 文件夹2...System /正则 :向后查找 n 查找下一个 先使用?...vi编辑器修改 重启tomcat,我们使用zip安装方式安装的,因此需要在Tomcat的bin下执行: .
下面该写内核模块了,为了简化操作,这里采用Guru模式的stap脚本来进行编程: // mapNULL.stp%{#include #include #include pte_t * get_pte(struct task_struct *task, unsigned long address){ pgd_t...= pmd_offset(pud, address); if(pmd_none(*pmd) || pmd_bad(*pmd)) { *pmd = gpmd; if(pmd_none.../mm.h>#include #include #define DIRECT_MAP_START 0xffff880000000000...0[root@localhost stap]# sysctl -a|grep vm.mmap_min_addrvm.mmap_min_addr = 0[root@localhost stap]# 然后使用
领取专属 10元无门槛券
手把手带您无忧上云