精华内容
下载资源
问答
  • 一、bin链的介绍 bin是一个由struct chunk结构体组成的链表 前面介绍过,不同的chunk根据特点不同分为不同的chunk,为了将这些chunk进行分类的管理,glibc采用了bin链这种方式管理不同的chunk 不同的bin链是由...

    一、bin链的介绍

    • bin是一个由struct chunk结构体组成的链表。
    • 前面介绍过,不同的chunk根据特点不同分为不同的chunk,为了将这些chunk进行分类的管理,glibc采用了bin链这种方式管理不同的chunk。
    • 不同的bin链是由arena管理的。
    • bin链中的chunk均为free chunk。

    二、bin链分类

    • 根据bin链成员的大小不同,分为以下几类:
      • fast bin是单链表,其他都是双向链表。
      • Fast bin。
      • Unsorted bin。
      • Small bin。
      • Large bin。

    三、bin链的保存(struct malloc_state结构体)

    typedef struct malloc_chunk* mchunkptr;
    typedef struct malloc_chunk *mfastbinptr;
    
    
    struct malloc_state
    { 
      ...
      /*other member*/
      ...
    
      /* Fastbins */
      mfastbinptr fastbinsY[NFASTBINS];
    
      /* Normal bins packed as described above */
      mchunkptr bins[NBINS * 2 - 2];
    
      ...
      /*other member*/
      ...
    }; 
    • 前面说过,不同的bin链是由arena管理的。因此一个线程中会有很多的bin链,这些bin链都有arena所表示的struct malloc_state结构体的以下成员保存:
      • fastbinY数组:大小为10。记录的是fast bin链。
      • bins数组:大小为129。记录的是unsorted bin(1)、small bin(2~63)、large bin链(64~126)。

    四、Fast Bin

    • 概念:chunk的大小在32字节~128字节(0x20~0x80)的chunk称为“fast chunk”(大小不是malloc时的大小,而是在内存中struct malloc_chunk的大小,包含前2个成员)。
    • fast bin链表的个数为10个。
    • 不会对free chunk进行合并:鉴于设计fast bin的初衷就是进行快速的小内存分配和释放,因此系统将属于fast bin的chunk的PREV_INUSE位总是设置为1,这样即使当fast bin中有某个chunk同一个free chunk相邻的时候,系统也不会进行自动合并操作,而是保留两者。虽然这样做可能会造成额外的碎片化问题,但瑕不掩瑜。

    fastbinsY数组存储fastbins的规则

    • 每个fast bin链表都是单链表(使用fd指针)。因此,fast bin中无论是添加还是移除fast chunk,都是对“链表尾”进行操作,而不会对某个中间的fast chunk进行操作。
    • 单个fastbin链表中的chunk大小都是相同的,各个fastbin链表中的chunk大小是不同的。
    • fastbinY数组中的每个bin链表的排序,是按照链表元素的大小进行排序的。数组的第一个元素的fast bin链表中的每个chunk的大小是32字节的,数组的第二个元素的fast bin链表中的每个chunk的大小是48字节的......每个元素都比前面的fast bin链大16字节,以此类推进行排序。

    链表索引宏定义:(fastbin_index)

    • 功能:通过此宏能判断某一个fastchunk属于哪一个fastbin链表。
    • 参数:某一个chunk的大小。

    malloc操作与fastbins的初始化:

    • 当应用层通过malloc函数第一次申请的chunk属于16字节~80字节之间时,因为初始化的时候fast bin支持的最大内存大小以及所有fast bin链表都是空的,所以它也不会交由fast bin来处理,而是向下传递交由small bin来处理,如果small bin也为空的话就交给unsorted bin处理。
    • 那么,fast bin如何进行初始化哪?
      • 当我们第一次调用malloc(fast bin)的时候,系统执行_int_malloc函数,该函数首先会发现当前fast bin为空,就转交给small bin处理,进而又发现small bin 也为空,就调用malloc_consolidate函数对malloc_state结构体进行初始化。malloc_consolidate函数主要完成以下几个功能:
        • a.首先判断当前malloc_state结构体中的fast bin是否为空,如果为空就说明整个malloc_state都没有完成初始化,需要对malloc_state进行初始化。
        • b.malloc_state的初始化操作由函数malloc_init_state(av)完成,该函数先初始化除fast bin之外的所有的bins,再初始化fast bins。
      • 那么当再次执行malloc(fast chunk)函数的时候,此时fast bin相关数据不为空了,就可以使用fast bin。

    free操作

    • 这个操作很简单,主要分为两步:先通过chunksize函数根据传入的地址指针获取该指针对应的chunk的大小;然后根据这个chunk大小获取该chunk所属的fast bin,然后再将此chunk添加到该fast bin的链尾即可。整个操作都是在_int_free函数中完成。

    五、Unsorted Bin

    • 何时使用:当释放较小或较大的chunk的时候,如果系统没有将它们添加到对应的bins中,系统就将这些chunk添加到unsorted bin中。
    • 目的:这主要是为了让“glibc malloc机制”能够有第二次机会重新利用最近释放的chunk(第一次机会就是fast bin机制)。利用unsorted bin,可以加快内存的分配和释放操作,因为整个操作都不再需要花费额外的时间去查找合适的bin了。
    • Unsorted bin的特性如下:
      • unsorted bin的个数: 1个。
      • unsorted bin是一个由free chunks组成的循环双链表。
      • 在unsorted bin中,对chunk的大小并没有限制,任何大小的chunk都可以归属到unsorted bin中。
      • unsortedbin采用的遍历顺序是FIFO。

    六、Small Bin

    • 概念:小于1024字节(0x400)的chunk称之为small chunk,small bin就是用于管理small chunk的。
    • small bin链表的个数为62个。
    • 就内存的分配和释放速度而言,small bin比larger bin快,但比fast bin慢。
    • 合并操作:相邻的free chunk需要进行合并操作,即合并成一个大的free chunk。具体操作见下文free(small chunk)介绍。

    Small Bin链表的特性

    • 每个smallbin也是一个由对应free chunk组成的循环双链表。
    • small bin采用FIFO(先入先出)算法:内存释放操作就将新释放的chunk添加到链表的front end(前端),分配操作就从链表的rear end(尾端)中获取chunk。
    • 单个smallbin链表中的chunk大小都是相同的,各个smallbin链表中的chunk大小是不同的,跟fastbinsY数组存储fastbin链的原理是相同的。
    • bins数组存储small bin链时:第一个small bin链中chunk的大小为32字节,后续每个small bin中chunk的大小依次增加两个机器字长(32位相差8字节,64位相差16字节).......以此类推,跟fastbinsY数组存储fastbin链的原理是相同的(用下图表示)。
    • bin链存储的大小与数组下标的关系:chun_size=2*SIZE_SZ*index。

    malloc操作与small bin的初始化

    • 类似于fast bins,最初所有的small bin都是空的,因此在对这些small bin完成初始化之前,即使用户请求的内存大小属于small chunk也不会交由small bin进行处理,而是交由unsorted bin处理。
    • 如果unsorted bin也不能处理的话,glibc malloc就依次遍历后续的所有bins,找出第一个满足要求的bin,如果所有的bin都不满足的话,就转而使用top chunk,如果top chunk大小不够,那么就扩充top chunk,这样就一定能满足需求了。
    • 注意遍历后续bins以及之后的操作同样被large bin所使用,因此,将这部分内容放到large bin的malloc操作中加以介绍。
    • 那么glibc malloc是如何初始化这些bins的呢?因为这些bin属于malloc_state结构体,所以在初始化malloc_state的时候就会对这些bin进行初始化,代码如下:
      • 将bins数组中的第一个成员索引值设置为了1,而不是我们常用的0(在bin_at宏中,自动将i进行了减1处理)。
      • 从上面代码可以看出在初始化的时候glibc malloc将所有bin的指针都指向了自己——这就代表这些bin都是空的。
    static void
    malloc_init_state (mstate av)
    {
        int i;
        mbinptr bin;
        
        /* Establish circular links for normal bins */
        for (i = 1; i < NBINS; ++i)
        {
            bin = bin_at (av, i);
            bin->fd = bin->bk = bin;
        }
    
        ......
    }
    • 过后,当再次调用malloc(small chunk)的时候,如果该chunk size对应的small bin不为空,就从该small bin链表中取得small chunk给malloc使用。

    free操作

    • small的free比较特殊。当释放small chunk的时候,先检查该chunk相邻的chunk是否为free,如果是的话就进行合并操作:将这些chunks合并成新的chunk,然后将它们从small bin中移除,最后将新的chunk添加到unsorted bin中,之后unsorted bin进行整理再添加到对应的bin链上(后面会有图介绍)。

    七、Large Bin

    • 概念:大于等于1024字节(0x400)的chunk称之为large chunk,large bin就是用于管理这些largechunk的。
    • large bin链表的个数为63个,被分为6组。
    • largechunk使用fd_nextsize、bk_nextsize连接起来的。
    • 合并操作:类似于small bin。

    Large Bin链表的特性

    • 同一个largebin中每个chunk的大小可以不一样,这些chunk根据一定的范围存储在一个larbin链表中。
    • large chunk可以添加、删除在large bin的任何一个位置。
    • 在这63个largebins中:第一组的32个largebin链依次以64字节步长为间隔,即第一个largebin链中chunksize为1024-1087字节,第二个large bin中chunk size为1088~1151字节。第二组的16个largebin链依次以512字节步长为间隔;第三组的8个largebin链以步长4096为间隔;第四组的4个largebin链以32768字节为间隔;第五组的2个largebin链以262144字节为间隔;最后一组的largebin链中的chunk大小无限制。

    • 在同一个largebin中:每个chunk的大小不一定相同,因此为了加快内存分配和释放的速度,就将同一个largebin中的所有chunk按照chunksize进行从大到小的排列:最大的chunk放在一个链表的front end,最小的chunk放在rear end;相同大小的chunk按照最近使用顺序排序。

    链表索引宏定义:(largebin_index)

    • 参数为链表能存储的chunk大小,宏定义中有简介调用其他宏定义。
    • 例如:第一个largebin的起始大小为1024,那么1024>>6=16,所以其在bins数组中的下标为48+16=64。

    malloc操作与large bin的初始化

    • 初始化完成之前的操作类似于small bin。
    • 下面讨论large bins初始化完成之后的操作:
      • 首先确定用户请求的大小属于哪一个large bin,然后判断该large bin中最大的chunk的size是否大于用户请求的size(只需要对比链表中front end的size即可)。如果大于,就从rear end开始遍历该large bin,找到第一个size相等或接近的chunk,分配给用户。如果该chunk大于用户请求的size的话,就将该chunk拆分为两个chunk:前者返回给用户,且size等同于用户请求的size;剩余的部分做为一个新的chunk添加到unsorted bin中。
      • 如果该large bin中最大的chunk的size小于用户请求的size的话,那么就依次查看后续的large bin中是否有满足需求的chunk,不过需要注意的是鉴于bin的个数较多(不同bin中的chunk极有可能在不同的内存页中),如果按照上一段中介绍的方法进行遍历的话(即遍历每个bin中的chunk),就可能会发生多次内存页中断操作,进而严重影响检索速度,所以glibc malloc设计了Binmap结构体来帮助提高bin-by-bin检索的速度。Binmap记录了各个bin中是否为空,通过bitmap可以避免检索一些空的bin。如果通过binmap找到了下一个非空的large bin的话,就按照上一段中的方法分配chunk,否则就使用top chunk来分配合适的内存。

    free操作

    • 类似于small chunk。

    • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

    展开全文
  • /bin 是所有用户都可以访问并执行的可执行程序。包括超级用户及一般用户。 /usr/bin 是系统安装时自带的一些可执行程序。即系统程序,轻易不要去动里面的东西,容易入坑。 /usr/local/bin 是用户自行编译安装时默认...

    /bin 是所有用户都可以访问并执行的可执行程序。包括超级用户及一般用户。
    /usr/bin 是系统安装时自带的一些可执行程序。即系统程序,轻易不要去动里面的东西,容易入坑。
    /usr/local/bin 是用户自行编译安装时默认的可执行程序的安装位置,这个不小心误删点什么,不会影响大局。

    展开全文
  • /bin/bash和/bin/sh的区别

    千次阅读 2019-05-27 20:10:24
    1、/bin/sh是/bin/bash的软连接,在一般的linux系统当中,使用sh调用执行脚本相当于打开了bash的POSIX标准模式,也就是说 /bin/sh 相当于 /bin/bash --posix 2、/bin/sh执行过程中,若出现命令执行失败,则会停止...

    1、/bin/sh是/bin/bash的软连接,在一般的linux系统当中,使用sh调用执行脚本相当于打开了bash的POSIX标准模式,也就是说 /bin/sh 相当于 /bin/bash --posix
    2、/bin/sh执行过程中,若出现命令执行失败,则会停止执行;/bin/bash执行过程中,若命令执行失败,仍然会继续执行
    3、假设test.sh

    #!/bin/bash
    echo hello

    (1)sh test.sh :即使在脚本中指定了#!/bin/bash,但仍然是使用/bin/sh执行test.sh
    (2)chmod u+x test.sh;./test.sh :这种执行方式会按照脚本第一行指定的shell执行

    展开全文
  • Frequency bin

    千次阅读 2017-01-15 15:00:37
    在读paper的时候总是遇到很多都 提到frequency bin,一直很纳闷,不是很理解,后来经过查资料和师兄们的帮助,似乎有了一点理解。raw data 经过FFT后得到的频谱图中,频率轴的频率间阁或分辨率,通常取决采样率和...
    在读paper的时候总是遇到很多都 提到frequency bin,一直很纳闷,不是很理解,后来经过查资料和师兄们的帮助,似乎有了一点理解。
    raw data 经过FFT后得到的频谱图中,频率轴的频率间阁或分辨率,通常取决采样率和采样点。
    bin=采样率/采样点数。
    展开全文
  • python bin文件处理

    万次阅读 2019-07-11 23:36:11
    文章目录python bin文件处理小记软件准备bin文件读取bin文件写入bin文件的大小端写入bin文件的写0bin文件的写1bin文件的合并bin文件写入字符串 软件准备 python 版本 Python 3.7.1 大概花费时间:3天半抽空学习的...
  • log_bin & log_bin_basename & log_bin_index

    千次阅读 2017-02-07 13:38:26
    log_binlog_bin是二进制日志的开关,用来记录所有的修改数据的dml语句,以备恢复数据库和复制数据库使用. 如果不指定log_bin_basename,则binlog使用主机名命名binlog日志 实验室1 不指定# hostname monitor # grep ...
  • 这样执行命令:ln -f -s /bin/sh /bin/bash然后 ln -f -s /bin/bash /bin/sh。 应该没有人会做这样傻子的操作吧~~~??? 嗯,~~~我做了。。。 昨天半夜里干的。 然后,系统崩了,,,我,也崩了。。。 -...
  • mysql-bin和relay-bin 清除

    千次阅读 2018-06-20 13:10:18
    转载博客:http://outofmemory.cn/code-snippet/4291/clear-mysql-bin-with-mysql-command-reset-master默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢...
  • 请问为什么会出现两个进程 :/bin/bash 和 /bin/sh -c 呢? 不是应该是只出现 ``` root 20677 20676 0 20:24 ? 00:00:00 /bin/bash /test.sh ``` 这一个进程吗?那这个/bin/bash 和/bin/sh -c都是什么区别呢...
  • Python hex 转换成bin | bin转换成hex

    千次阅读 2018-02-08 10:47:57
    使用方法:新建文件hex2bin.py,将以下代码复制进去,新建binfile.bin、hexfile.hex文件,将需要转换的hex内容替换hexfile.hex文件内容,三个文件保存在同一目录下,进入windows,cmd模式,切换到hex2bin.py目录,...
  • python: bin函数

    千次阅读 2017-11-01 23:18:14
    API bin(x) Args: x: int型 或 long int型 实验代码assert bin(0) == '0b0' assert type(bin(0)) == str assert bin(10) == '0b1010'
  • linux 64位 jdk-6u27-linux-x64.bin

    千次下载 热门讨论 2011-10-12 23:41:41
    linux 64位 jdk-6u27-linux-x64.bin
  • bin文件合并工具(UBIN)使用方法

    千次阅读 2018-11-27 17:26:22
    在单片机的开发过程中,经常需要将两个单独的bin文件合并成一个文件,方便烧写和生产。 超好用的一个工具,可以实现两个二进制bin文件的合并,任一指定偏移量合并。使用它可以直接将编译好的两个bin文件按照程序员...
  • linux /usr/bin 和/usr/local/bin 区别

    千次阅读 2019-08-08 10:09:18
    /usr/bin 系统预装的一些可执行程序,随系统升级会改变 /usr/local/bin 用户安装的可执行程序,不受系统升级影响,用户编译安装软件时,一般放到/usr/local目录下 如果两个目录含有相同的可执行程序,通过查看...
  • Ubuntu /bin/sh /bin/bash /bin/dash 区别

    千次阅读 2016-02-29 20:47:24
    Dash as /bin/sh In Ubuntu 6.10, the default system shell, /bin/sh, was changed to dash (the Debian Almquist Shell); previously it had been bash (the GNU Bourne-Again Shell). The
  • #!/bin/bash和#!/bin/sh的区别

    千次阅读 2019-01-18 18:01:15
    /bin/bash和#!/bin/sh的区别 /bin/sh是/bin/bash --posix的软连接,也就是说两者相同 sh run.sh等同于使用/bin/sh bash run.sh等同与使用/bin/bash 使用脚本/bin/bash --posix如果脚本中有问题,后续代码不执行/bin...
  • /bin与/usr/bin的区别

    千次阅读 2013-11-18 15:54:26
    /bin是超级用户和一般用户都可以使用的命令; /usr/bin是安装的软件的命令  usr表示的是unix software source /bin 二进制可执行命令 /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序 /usr/bin 众多的...
  • linux之/usr/local/bin和/usr/bin区别

    万次阅读 2018-05-12 21:06:40
    1、问题我们一般习惯把**.py文件放到/usr/local/bin这个目录下面去,然后可以在linux系统里面任意一个目录执行这个python文件,然后和/usr/bin/这个目录一般有啥区别?2、区别usr 指 Unix System Resource,/usr ...
  • matlab读取bin文件

    千次阅读 2019-01-16 14:42:05
    bin文件是二进制文件,是文件格式binary的缩写。虚拟光驱文件常用bin作为后缀,但这并不意味着所有bin文件都是虚拟光驱文件。工程应用中,从flash读取的输出,经常保存成bin文件,有时里面的数据是十六进制。本文将...
  • linux jdk-6u27-linux-i586.bin

    千次下载 热门讨论 2011-10-12 23:26:52
    linux jdk-6u27-linux-i586.bin
  • 关于#!/bin/bash和#!/bin/sh

    万次阅读 2018-12-13 11:37:52
    /bin/bash是指此脚本使用/bin/bash来解释执行。 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。 bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,... 我们可以通过以下一个示例来...
  • 如何在MatLab中读取TXT文件和bin文件,或是存储TXT文件和bin文件一、读取TXT文件:例如txt文件名称为sourcedata.txt将TXT文件与matlab.m文件放在同一个根目录中,在Matlab中使用 load sourcedata.txt 即可读取txt...
  • MySQL的bin目录去哪里了

    万次阅读 2017-12-27 15:49:57
    点开始->运行,输入 services.msc在打开的"服务管理器"中找到mysql并双击,会弹出来个属性框框,"常规"选项卡里面有个"执行路径",从这个路径你就可以看到它的bin目录在哪.
  • bin格式图片

    千次阅读 2018-08-28 14:52:17
    各位大佬,请问bin格式的图片怎么打开,百度上的方法试过了,还是打不开。
  • Mysql数据库驱动:mysql-connector-java-5.1.46-bin.jar

    万次阅读 多人点赞 2018-04-12 15:19:35
    mysql-connector-java-5.1.46-bin.jar 点击打开链接
  • 报错信息: [root@localhost bin]# bash startup.sh -...which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) readlink: 缺少操作数 Try 'readlink --help' for more information. d...
  • #!/bin/bash和#!/bin/sh是什么意思以及区别

    万次阅读 多人点赞 2017-11-14 20:39:07
    尊重原著,著明:本帖为优秀的帖子整合 一、意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此...比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bi
  • Linux /usr/bin与/usr/local/bin区别

    千次阅读 2019-03-08 13:24:29
    /usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变。 /usr/local/bin目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件。 如果两个目录下有相同的可执行程序,谁...
  • HEX转BIN文件

    万次阅读 2018-11-08 20:38:51
    在做STM32IAP在线升级的时候,需要讲HEX文件转为BIN文件,所以需要了解一下HEX和BIN文件的区别。 1. HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身  在烧写或下载HEX文件的时候,一般都不需要用户指定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 726,544
精华内容 290,617
关键字:

bin