
linux
文章平均质量分 67
唐伯虎点蚊香dw
这个作者很懒,什么都没留下…
展开
-
linux命令
①linux下抓包,底层报文发送接收信息tcpdump -i eth0 -w /opt/test.cap②查看指定端口socket连接netstat -nat|grep -i "80"|wc -l原创 2017-02-28 19:07:26 · 489 阅读 · 0 评论 -
Linux进程空间地址划分
以Linux 64位系统为例。理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际上只用了其中一小部分(256T)。Linux64位操作系统仅使用低47位,高17位做扩展(只能是全0或全1)。所以,实际用到的地址为空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF(user space)和0xFFFF800000000000 ~ 0xFFFFFFFFFFF转载 2022-06-18 12:04:30 · 1279 阅读 · 0 评论 -
Linux中文件的访问方式
Linux访问文件的模式:1.规范模式: 规范模式下打开文件后,标志O_SYNC与O_DIRECT清零,而且他的内容是由系统调用read()和write()来存取。系统调用read将阻塞调用进程,直到数据被拷贝到用户态地址空间(内核允许返回的字节数小于要求的字节数)。但系统调用write()不同,它在数据被拷贝到页高速缓存(延迟写)后就马上结束。2.同步模式 同步模式下打开文件后,标志O_SYNC置为1或稍后由系统调用fcntl()对其置1。这个标志只影响写操作(读操作总是会阻塞),...原创 2022-03-16 14:50:09 · 1569 阅读 · 0 评论 -
深入Linux内核架构笔记(页缓存和块缓存)
缓存是页交换或调页操作的逆操作(换页的相关信息,在第18章讨论)。尽管缓存牺牲了物理内 存(使得不需要在块设备上进行低速操作),而实现页交换时,则是用低速的块设备来代替物理内存。 因而内核必须尽力同时考虑到这两种机制,确保一种方法带来的好处不会被另一种方法的不利之处抵 消,这不是件容易事。slab缓存是一个内存到内存的缓存, 其目的不是加速对低速设备的操作,而是对现存资源进行更简单、更高效的使用。dentry缓存也用于 减少对低速块设备的访问,但它无法推广到通用场合,因为它是专门用于处理单一数据类型的。原创 2022-01-28 18:13:52 · 3068 阅读 · 0 评论 -
深入Linux内核架构笔记(同步)
内核可以不受限制地访问整个地址空间。在多处理器系统上(或类似地,在启用了内核抢占的单 处理器系统上,可参见第2章),这会引起一些问题。如果几个处理器同时处于核心态,则理论上它们可以同时访问同一个数据结构内核为此提供了各种锁选项,分别优化不同的内核数据使用模式。 原子操作:这些是最简单的锁操作。它们保证简单的操作,诸如计数器加1之类,可以不中断 地原子执行。即使操作由几个汇编语句组成,也可以保证。 自旋锁:这些是最常用的锁选项。它们用于短期保护某段代码,以防止其他处理器的访问。 在内核等待自旋原创 2022-01-28 11:48:54 · 2742 阅读 · 0 评论 -
深入Linux内核架构笔记(缺页异常)
在实际需要某个虚拟内存区域的数据之前,虚拟和物理内存之间的关联不会建立。如果进程访问 的虚拟地址空间部分尚未与页帧关联,处理器自动地引发一个缺页异常,内核必须处理此异常。这是 内存管理中最重要、最复杂的方面之一,因为必须考虑到无数的细节。例如,内核必须确定以下情况。 缺页异常是由于访问用户地址空间中的有效地址而引起,还是应用程序试图访问内核的受保 护区域? 目标地址对应于某个现存的映射吗? 获取该区域的数据,需要使用何种机制?缺页处理的实现因处理器的不同而有所不同。由于CPU采用了不同原创 2022-01-28 10:57:33 · 2283 阅读 · 1 评论 -
深入Linux内核架构笔记(进程空间堆管理)
堆是进程中用于动态分配变量和数据的内存区域,堆的管理对应用程序员不是直接可见的。因为 它依赖标准库提供的各个辅助函数(其中最重要的是malloc)来分配任意长度的内存区。malloc和 内核之间的经典接口是brk系统调用,负责扩展/收缩堆。新近的malloc实现(诸如GNU标准库提供的) 使用了一种组合方法,使用brk和匿名映射。该方法提供了更好的性能,而且在分配较大的内存区时 具有某些优点brk系统调用只需要一个参数,用于指定堆在虚拟地址空间中新的结束地址(如果堆将要收缩, 当然可以小于当前值)。 照原创 2022-01-28 10:34:14 · 1654 阅读 · 0 评论 -
深入Linux内核架构笔记(进程虚拟内存)
在32位架构中,进程的虚拟地址按照3:1的比例划分为内核空间和用户空间,这样划分是为了实现CPU的不同权限,而64位架构中,因为进程的虚拟地址足够大,所以没有这个划分,都是足够的,一般是1:1,高位作为内核空间,地位作为用户空间,虽然64位的系统寻址可以达到很大,但是实际的CPU硬件的寻址并没有那么大,目前一般只有48根地址先,也就是可以256T这么大,那么高位的128T作为内核空间,地位的128T作为用户空间,中间的一部分作为不可用部分,这个通过地址空间的转换来实现的,具体参考前面的文章而用户空间原创 2022-01-27 18:36:36 · 1138 阅读 · 0 评论 -
深入Linux架构笔记(内存管理)
内核初始化期间由初始化内存分配器分配内存,完成后内存分配工作交给伙伴系统基于伙伴系统的内存管理专注于某个结点的某个内存域,例如,DMA或高端内存域。但所有内存域和结点的伙伴系统都通过备用分配列表连接起来也就是说内存的每个区域都有自己的伙伴系统,并且通过备用列表连接起来,比如分配普通区域内存是,伙伴系统分配失败,就使用DMA区域的伙伴系统分配内存内存的碎片处理:用户空间应用程序的内存一般通过页表映射,所以碎片问题一般只涉及到内核很长时间以来,物理内存的碎片确实是Linux的弱点之一。尽管已经提出了许原创 2022-01-27 14:49:40 · 780 阅读 · 0 评论 -
Linux内存管理(转载)
分段和分页 先看一幅图 也就是我们实际中编码时遇到的内存地址并不是对应于实际内存上的地址,我们编码中使用的地址是一个逻辑地址,会通过分段和分页这两个机制把它转为物理地址。而由于linux使用的分段机制有限,可以认为,linux下的逻辑地址=线性地址。也就是,我们编码使用的是线性地址,之后只需要经过一个分页机制就可以把这个地址转为物理地址了。所以我们更重要的可能是去说明一下linux的分页模型。 系统会将整个物理内存分为多个页框,每个页框大小一般是4K(硬件允许的扩展分页(PSE)情转载 2022-01-24 10:50:24 · 179 阅读 · 0 评论 -
Linux伙伴系统算法
伙伴系统算法:内核应该为分配一组连续的页框而建立一种健壮高效的分配策略。因此,必须解决著名的内存管理问题,也就是所谓的外碎片。频繁的请求和释放不同大小的一组连续页框, 必然导致在已分配页框的块内分散了许多小块的空闲页框。因此带来的问题是,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框就无法满足。从本质上说,避免外碎片的方法有两种: 1.利用分页单元吧一组非连续的空闲页框映射到连续的线性地址区间 2.开发一种适当的技术来记录现存的空闲连续页框块的情况,以尽量...原创 2022-01-13 17:45:11 · 659 阅读 · 0 评论 -
Linux操作系统内存管理(笔记)
大空间分配:页分配器小于页的分配:slab(伙伴系统)原创 2022-01-08 23:11:38 · 854 阅读 · 0 评论 -
深入理解Linux内核笔记(关于上下文切换)
进程上下文切换:硬件上下文:CPU核心的寄存器数据, 在Linux中硬件上下文一部分放在TSS段(内存中的一段空间),一部分放在内核态堆栈中thread:因为进程不把硬件上下文保存在TSS中,而是保存在这个类型为thread_struct的thread字段中,这里包含大部分CPU寄存器的值, 但不包括一些通用寄存器,他们的值保留在内核堆栈中Linux调度程序调度进程的过程:首先如果调度程序决定要把CPU交个某个进程,那么开始进行进程切换: 1.吧进程描述符thread字段的值...原创 2022-01-07 18:09:19 · 616 阅读 · 0 评论 -
深入理解Linux内核笔记一
同步和临界区:实现可重入内核需要利用同步机制,因为如果当内核控制路径对某个内核数据结构进行操作时被挂机,那么,其它内核控制路径就不应当再对该数据结构进行操作。对全局变量的安全访问通过原子操作来保证。如果内核支持抢占,如Linux,那么在应用同步机制时,确保进入临界区前禁止抢占,退出临界区时启用抢占。信号量:可以把信号量看成一个对象,其组成如下:一个整数变量 一个等待进程的链表 两个原子方法:down()和up()每个要保护的数据结构都有它自己的信号量,其初始值为1。当内核控制路原创 2022-01-06 14:39:46 · 744 阅读 · 0 评论 -
如何理解用户态和内核态
作者:弟羔羊之妙义链接:https://www.zhihu.com/question/397142622/answer/1246315406来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。0、首先,我们明确一个概念,Linux所谓的用户态和内核态,本质是对CPU提供的功能的一层封装抽象。现代CPU,其设计目标主要是为了完美高效的实现一个多任务系统,多任务系统的三个核心特征是:权限分级、数据隔离和任务切换。以X86_64架构为例,权限分级通过CPU的多模式机制和分段.原创 2021-11-23 09:54:05 · 356 阅读 · 0 评论 -
Linux线程实现原理
一,说在前面1.Linux内核不区分线程和进程,PCB和TCB都是tasc_struct2.task_struct中pid成员值,不论是进程的还是线程的,都是独一无二的3.当我们用fork创建一个新进程时,会创建一个新的独一无二的task_struct,含有独一无二的pid值4.当我们用pthread_create创建一个或多个属于原进程的线程时,也会创建新的独一无二的task_struct,含有独一无二的pid值,但是他们隶属于一个线程组,这个线程组的leader thread是原始进程,原创 2021-11-07 18:08:33 · 522 阅读 · 0 评论 -
深度分析MMAP:是什么,为什么,怎么用
mmap基础概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示: 由上图可以看出,进程的虚拟地址空间,由多个虚拟内...转载 2020-10-12 14:09:23 · 224 阅读 · 0 评论