基态-激发态电子密度差可以比较直观地展示体系激发后电子的流向,分析体系的电子激发属性。关于电子密度,可以参看《从密度矩阵产生自然轨道-理论篇》一文。 nstates=20) density b3lyp/def2tzvp guess=read geom=allcheck out=wfn HCHO-TD.wfn 此处加了density关键词,表示将激发态的电子密度写入 同时使用了out=wfn,可以生成激发态的波函数信息,用于后续Multiwfn分析。若只用GaussView分析,则不需要此关键词。 一、用GaussView绘制等值面 1. 再次点击New Cube,Type中依然选择Total Density,而Density Matrix中选择CI,即生成激发态电子密度的cube文件。 4. 创建基态-激发态电子密度差的cube文件。 可修改一下顺序,使第一个为激发态电子密度,第二个为基态电子密度。不改也无妨,结果相差负号而已。 5.
第一性原理态密度分析的意义和用途在探索材料微观世界时,态密度(Density of States, DOS)犹如一把精密的电子扫描器,揭示电子在材料中能量分布的关键密码。 一、态密度分析的意义DOS 描述了材料中电子态在能量上的密集程度,即单位能量区间内可被电子占据的量子态数量。 二、态密度分析能获取的关键数据总体态密度(Total DOS, TDOS):含义: 材料中所有电子态在能量上的总分布。核心信息:费米能级位置: 标志绝对零度下电子占据的最高能级。 杂质或缺陷态分析: 分析掺杂或缺陷附近的局域电子态在带隙中的分布,理解其对材料电学或光学性质的影响。 第一性原理态密度分析通过计算并解读总态密度(TDOS)、投影态密度(PDOS)、局域态密度(LDOS)等关键数据,我们能精准定位材料的费米能级、精确计算带隙、深入解析复杂化学成键、揭示磁性微观机制、识别潜在的反应活性位点
init init 是用户态的第一个进程,由 Linux 内核启动,进程号为1。 second_stage 第二阶段的 init 进程,就是我们在 Android 用户态中见到的真正程序。 除了属性服务,init 中另外一个重要的功能就是对 initrc 的处理,毕竟作为用户态的第一个进程,其肩负了启动其他进程和服务的使命。 参考链接 Android 操作系统架构 Android HAL 与 HIDL 开发笔记 Android进程间通信与逆向分析 从STM32L4看ARM裸板的启动过程
当一个任务进入内核态运行时,就会使用其TSS段中给出的特权级0的堆栈指针tss.ss0、tss.esp0,即内核栈。原用户栈指针会被保存在内核栈中。而当从内核态返回用户态时,就会恢复使用用户态的堆栈。 5.8.2 任务的堆栈 每个任务都有两个堆栈,分别用于用户态和内核态程序的执行,并且分别称为用户态堆栈和内核态堆栈。 在定位了新堆栈(内核态堆栈)之后,CPU就会首先把原用户态堆栈指针ss和esp压入内核态堆栈,随后把标志寄存器eflags的内容和返回位置cs、eip压入内核态堆栈。 此时内核代码就会使用该任务的内核态堆栈进行操作。同样,当进入内核程序时,由于特权级别发生了改变(从用户态转到内核态),用户态堆栈的堆栈段和堆栈指针以及eflags会被保存在任务的内核态堆栈中。 图5-26 内核态和用户态堆栈的切换 如果一个任务正在内核态中运行,那么若CPU响应中断就不再需要进行堆栈切换操作,因为此时该任务运行的内核代码已经在使用内核态堆栈,并且不涉及优先级别的变化,所以CPU
ππ*态和nπ*态。 根据激发前后电子密度分布的变化情况又可分为局域激发(local excitation, LE)和电荷转移(charge transfer, CT)激发,顾名思义,前者电子密度在局部范围内变化,后者电子密度的分布区域发生了显著的变化 ,对每个激发态,会给出最大的几个轨道跃迁系数,利用这些系数可以得到相应的轨道跃迁对该激发态的贡献。 之后做TD(nstates=50)激发态计算。以下我们分析S1和S2两个态。 很多时候仅用一对轨道的跃迁无法很好地描述激发态,此时可以使用自然跃迁轨道来进行分析,我们后面进行介绍。
随着学习的不断深入,用户态、内核态知识的缺失,也就暴露出来。不过好在,知道反省自己。于是今天将操作系统用户态、内核台研究透! 我们线程是程序运行的最小单位。 用户态、内核台都是CPU的状态,且有自己的专用内存空间 CPU从用户态切换内核态需要传递许多变量、参数给到内核。内核态会存储用户态的信息,当内核态在切换用户态的时候,才能使得用户态正常工作。 CPU就划分出两个权限等级:用户态、内核态 用户态 访问内存受限。不允许访问外置设备,无占用CPU的能力,也就是说用户态的线程会被别的程序占用。 内核态 访问内存所有数据。 用户态、内核态的切换 我们的用户程序都是运行在用户态的。有些时候我们可能需要访问外置设备的内存数据,我们就需要从用户态切换到内核态了。 注意,既然用户态受限,我干脆直接使用内核态不就完了么? 事实是,用户应用程序的内核态只能由用户态切换过来。 如何让触发用户态到内核态的切换?
>用户态 内核态中,可以完成对用户文件系统任意文件的访问。 因此,可以在内核态将要输出的信息写入文件,写入后用户态程序直接读取文件就可以完成从内核空间向用户空间的数据传递。 4/内核态<->用户态 proc文件系统,是当前内核或内核模块,和用户交互的主要方式,它通过将虚拟的文件系统挂载在/proc下,利用虚拟文件读写在用户和内核态间传递信息。 向内核中注册/proc下文件的调用是create_proc_entry 5/内核态<->用户态 netlink是一种特殊的socket,用于用户态与内核态的双向通讯。 在用户态中,netlink的使用与标准的socket API相同,在内核态,则需要使用专门的API。
作者,Evil Genius今天我们来画一画空间密度图吧。不同条件的基因/细胞密度分布图一目了然可以看出疾病带来的影响。
内核态(也称管态,核心态): 内核态具有对硬件的完全访问权,可以执行机器能够执行的任何指令。 用户态: 只能执行机器的部分指令,使用全部指令集的一个子集。 能影响机器的控制指令或者是I/O操作指令,在用户态都是不被允许的。当然也不能更改PSW中模式位为内核态。 用户程序为了获取操作系统服务,必须使用系统调用。系统调用陷入内核并调用操作系统。 TRAP指令把用户态切换成内核态,并启用操作系统。 程序计数器(PC): 它保存下一条将要执行的指令在内存中的地址。在指令被取出之后,程序计数器就需要更新。 程序状态字(PSW): 它包含了CPU优先级,模式(内核态或者用户态),条件码位,以及各种其他控制位。通常在PSW中有1个二进制位用来控制CPU处于内核态还是用户态。
偏态分布的回归分析 回归是我们经常遇到的模型,但是回归会根据Y因变量的类型,分成分类问题(Y是分类变量,如生存或死亡)与回归问题(Y是连续性变量,如身高体重)。 image.png 当然,我们遇到偏态分布时候,一般有两种处理方式。 通过将偏态数据进行log变换,转成正态分布进行回归。 直接使用 family=Gamma 指定Gamma分布。
搞清楚上面两个概念之后,我们再来看信号的频率特性分类,有四种:功率信号的频谱、能量信号的频谱密度、功率信号的功率谱(密度)和能量信号的能量谱密度 功率信号的频谱: 周期性功率信号的频谱函数为: ? 因此傅里叶变换的结果就是能量信号的频谱密度,但为了统一说法,我们一般也叫频谱。 (我们平时所说的做个fft看频谱,其实是指的频谱密度) 那为什么叫频谱密度呢? 这里多说一点,量纲是个好东西,很多公式不理解的时候,把量纲分析一下,能起到很大作用。 看到这里,可能有点明白了。 称为能量信号的能量谱密度,它表示在频率f处宽度为df的频带内的信号能量,或者可以看做是单位频带内的信号能量。 功率信号的功率谱(密度): 这里为什么要把密度加括号呢? 设 表示信号的功率谱密度,则有 ? 因此,信号的功率谱密度为: ?
写在前面 博文内容为 通过 BCC 工具集 memleak 进行内存泄漏分析的简单认知 包括 memleak 脚本简单认知,内核态(内核模块)、用户态(Java,Python,C)内存跟踪泄漏分析 Demo ,下面的 Demo使用的最新版本的工具,实际上如果有特殊需求,可以定制化开发,感兴趣小伙伴可以尝试,欢迎留言讨论 内核态内存泄漏分析 这里我们通过一个内核模块来模拟内存泄漏的问题,memory_leak 用户态内存泄漏分析 java 内存泄漏分析 堆外内存 使用的 JDK 版本 [developer@developer ~]$ java --show-version openjdk 17.0.13 2024 , tracemalloc 是 Python 标准库中的内存追踪调试工具,用于监控和分析 Python 程序的内存分配行为 C 内存泄漏分析 前面我们简单分析了这个 BCC 脚本,可以看到实际上他直接对内核库的一些用户态和内核态的内存分配函数进行埋点跟踪 关于 BCC 工具 memleak 进行内存泄漏分析和小伙伴分析到这里,上面都是一些 Demo,只是为了展示工具如何使用,实际的分析要结合调用栈复杂的多。
切换方式 从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作: 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。 代价何在 当发生用户态到内核态的切换时,会发生如下过程(本质上是从“用户程序”切换到“内核程序”) 设置处理器至内核态。 保存当前寄存器(栈指针、程序计数器、通用寄存器)。 而之后从内核态返回用户态时,又会进行类似的工作。 3. 如何避免频繁切换 用户态和内核态之间的切换有一定的开销,如果频繁发生切换势必会带来很大的开销,所以要想尽一切办法来减少切换。 3.1 减少线程切换 因为线程的切换会导致用户态和内核态之间的切换,所以减少线程切换也会减少用户态和内核态之间的切换。那么如何减少线程切换呢? 无锁并发编程。 首先要同意这个说法,即I/O会导致系统调用,从而导致内核态和用户态之间的切换。因为对I/O设备的操作是发生在内核态。那如何减少因为I/O导致的系统调用呢?答案是:使用户进程缓冲区。
现在我们就可以再来说下用户态和内核态的概念了,用户态和内核态粗略的说就是进程工作在内核空间下就叫用户态,进程工作在内核空间下就叫内核态。 当正在执行用户程序而突然中断时,此时用户程序也可以象征性地处于进程的内核态。因为中断处理程序将使用当前进程的内核态。 然后我们细细的说一下用户态和内核态的区别和联系,说道这里,就不得不提一下CPU的三种运行级别了,工作在内核态下的进程拥有最高级别Ring0,工作在用户态下的进程拥有最低级别Ring3,在Ring3状态下是不能访问 也就是说,进程在用户态下是没法访问到内核空间中的数据的,那么我们就看出这样做的好处了,通过内核态和用户态就产生了一个保护机制,用户无法随意的进入所有进程共享的内核空间。 那么进程是如何完成用户态到内核态的切换的呢?具体的步骤大致如下: (1)从当前进程的描述符中提取其内核栈的ss0及esp0信息。
(1)用户态和内核态的概念? —>内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. —>由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用户态 和 内核态 (3)用户态与内核态的切换? 3)用户态和内核态 现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级 特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态 用户态和内核态的转换 1)用户态切换到内核态的3种方式 a. 关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态 的步骤主要包括: [1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
用户态的内存映射机制,我们解析的差不多了,我们来总结一下,用户态的内存映射机制包含以下几个部分。 用户态内存映射函数mmap,包括用它来做匿名映射和文件映射。 用户态的页表结构,存储位置在mm_struct中。 在用户态访问没有映射的内存会引发缺页异常,分配物理页表、补齐页表。 对于内存的分配需求,可能来自内核态,也可能来自用户态。 内核态中vmalloc分配的部分会被换出,因而当访问的时候,发现不在,就会调用do_page_fault。 对于用户态 ,或者 直接调用mmap系统调用分配,或者调用malloc 。 正常情况下,用户态的内存都是可以换出的,因而一旦发现内存中不存在,就会调用do_page_fault。
本篇文章是第1篇文章,也是后续知识的基础,笔者觉得只有真正弄清楚了内核态和用户态,才能更好的理解后续的知识。 一、内核态与用户态的介绍 ? 2.内核态执行操作:进入3GB-4GB中的内核地址空间去执行这些代码完成操作。 3.切回用户态:内核态执行完之后,切换用户态。 备注:这样操作的好处在于用户态的程序就不能随意操作1内核地址空间,具有一定的安全保护作用。 二、操作系统区分内核和用户态的原因 1. 设计用户态和内核态,并且用户态成运行程序需要调用内核态的原因? 2.内核态和用户态有什么不同? 三、内核态与用户态的交互 运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制,下面是用户态转换成内核态的几种方式: 1.
这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? 进程可以分成用户态进程和内核态进程两类。用户态进程通常是应用程序的副本,内核态进程就是内核本身的进程。如果用户态进程需要申请资源,比如内存,可以通过系统调用向内核申请。 如果进程想要创造更多的线程,就需要思考一件事情,这个线程创建在用户态还是内核态。 你可能会问,难道不是用户态的进程创建用户态的线程,内核态的进程创建内核态的线程吗? 其实不是,进程可以通过 API 创建用户态的线程,也可以通过系统调用创建内核态的线程,接下来我们说说用户态的线程和内核态的线程。 用户态线程和内核态线程的区别? 老规矩,请你先在脑海里构思下给面试官的表述,并把你的思考写在留言区,然后再来看我接下来的分析。 【解析】 用户态线程工作在用户空间,内核态线程工作在内核空间。
这篇文章较好的介绍使用 eBPF 对几种语言开发的应用程序进行可观测分析。介绍的也比较详细,对这块有兴趣的同学可以深入学习。 可用于检测分析应用程序的 eBPF 技术 跟踪用户空间进程有多种方法: 静态声明的 USDT 动态声明的 USDT 使用 uprobes 进行动态跟踪 静态声明的 USDT USDT (Userland 在简单的理论介绍之后,我们来看一些具体的例子,看看如何用跟踪分析不同的语言的应用程序。 让我们分析一下实际的 uprobe 程序。 在必需的 include 语句之后,有宏的定义,该宏通过偏移量处理的方式负责从堆栈中获取参数。
(1)用户态和内核态的概念? —>内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. —>由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用户态 和 内核态 (3)用户态与内核态的切换? 3)用户态和内核态 现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级 特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态 用户态和内核态的转换 1)用户态切换到内核态的3种方式 a. 关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态 的步骤主要包括: [1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。