Other

linux的堆管理及攻击(ptmalloc)

堆基础 堆简介 (部分参考与libc源码) 不同的平台有不同的堆内存管理机制,比如: 管理机制对应的相关的平台 dlmalloc General purpose allocator ptmalloc2 glibc jemalloc FreeBSD and Firefox tcmalloc Google libumem Solaris 本来linux默认的是dlmalloc,但是由于其不支持多线程管理,后来被支持多线程的ptmalloc2代替了。接下来的内容都是基于ptmalloc机制进行的堆管理和攻击。 ptmalloc进行堆分配时有两种方式:brk和mmap。brk分配的堆区由libc管理,在程序结束之前不会返还给操作系统,mmap分配的堆区在使用后会直接munmap返回给系统。 但是也有特例:(glibc malloc 直接mmap的情况) 1.非main_arena区域和它的堆直接通过mmap进行映射 2.申请的chunk大小超过mp_.mmap_thrshold,导致large bin和top都不能满足的情况。 上面提到了几个概念: chunk:堆块,堆结构中最基本的单元,每一个堆块对应一个chunk,对应结构体malloc_thunk。ptmalloc进行堆管理,可以将堆分成三类:allocated chunk (已分配的),free chunk (空闲的),top chunk (顶部chunk)。 bin:用于组织管理空闲堆块的链表结构 top:堆区的头部,实质为一个chunk,记录着剩下的未分配的堆空间的大小(不包含已经free但是还在bin中管理着的空闲堆块) main_arena: 结构体malloc_state 的一个实例,用于组织各种bin链和堆分配信息,main_arena在一个进程中只存在一个,其余的malloc_state为非main_arena,比如线程中的malloc_state结构 堆相关结构体 struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T mchunk_size; /* Size in bytes, including overhead.

linux系统find命令的一些使用技巧

参数: 1.-name选项:按照文件名称查找,允许使用通配符 2.-type选项:按照文件类型查找 3.-user选项:按照文件所有者查找 4.-size选项:按照文件大小查找 5.-maxdepth<目录层级〉:设置最大目录层级 6.-mindepth<目录层级〉:设置最小目录层级 示例 1.find /etc -name net*.conf 查找etc目录下所有文件名是以net开头,.conf结尾的文件 2.find /boot -type d 查找boot目录下所有的目录 3.find /boot -size +1024k 查找boot目录下所有大于1024k的文件 4.find /home -user horse 查找home目录下所有归属者是horse的文件 基于目录深度搜索 find /home -maxdepth 3 -type f 查找向下最大深度限制为3层的普通文件 find /home -mindepth 2 -type f 搜索出深度距离当前目录至少2层目录的普通文件 查找时,忽略一个或多个目录下文件 注意:-path 的前缀要和find的目录一样 #忽略单个目录 #-a逻辑与,当-path ./var为真,则执行-prune,返回真;-o逻辑或,增加查询条件,与前面排除目录条件组合输出符合的内容 理解方法:find . {{{-path ./var} -a {-prune}} -o {-name .log}} -print find . -path ./var -a -prune -o -name .log -print #忽略多个目录 find .

shell:输入输出重定向

重定向命令列表如下: 命令说明 command > file 将输出重定向到 file。 command < file 将输入重定向到 file。 command >> file 将输出以追加的方式重定向到 file。 n > file 将文件描述符为 n 的文件重定向到 file。 n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并。 n <& m 将输入文件 m 和 n 合并。 << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 例子:

c# 操作MongoDB数据库

1.第一步安装MongoDB https://blog.csdn.net/weixin_45404208/article/details/114437260  2.安装可视化数据库软件 Robo 3T (免费但是不再更新) Studio3t (功能完善,但是收费,建议学习版)  3.操作数据库 https://www.cnblogs.com/springsnow/p/13093956.html  4.官方文档,更多操作 https://www.mongodb.com/blog/post/quick-start-c-sharp-and-mongodb-starting-and-setup

短视频系统源码,android 真正的全屏沉浸式体验

短视频系统源码,android 真正的全屏沉浸式体验 1 清单文件中application中引入主题 android:theme=“@style/AppTheme”  <application android:name=.MyApp android:allowBackup=true android:icon=@mipmap/ic_launcher android:label=@string/app_name android:roundIcon=@mipmap/ic_launcher_round android:supportsRtl=true android:theme=@style/AppTheme android:usesCleartextTraffic=true tools:replace=android:allowBackup> ​2自定义style,主要是这个属性:@color/blue   <style name=AppTheme parent=Theme.AppCompat.Light.NoActionBar> <!-- Customize your theme here. --> <item name=colorPrimary>@color/colorPrimary</item> <item name=colorPrimaryDark>@color/blue</item> <item name=colorAccent>@color/colorAccent</item> <item name=textAllCaps>false</item> </style> 以上就是 短视频系统源码,android 真正的全屏沉浸式体验,更多内容欢迎关注之后的文章  

MongoDB部署使用密钥文件进行身份验证的副本集

1.副本集架构 ​  成员 IP 1 192.168.137.110 2 192.168.137.111 3 192.168.137.112 ·副本集成员之间,使用内部身份验证的方式保证安全性 ·客户端和副本之间使用基于角色的访问控制 2.创建keyfile 使用keyfile身份验证,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,用于对部署中的其他成员进行身份验证。只有具有正确密钥文件的mongod实例才能加入副本集。 在其中一个节点生成,拷贝到其它节点即可。 $ openssl rand -base64 756 -out /usr/local/mongodb/mongo.keyfile $ chmod 400 /usr/local/mongodb/mongo.keyfile  3.将步骤1中生成的keyfile拷贝到其它成员 注意,要将keyfile文件的属主改成mongodb的安装用户,通常是mongod。 4.开启访问控制后启动所有成员节点 启动前,修改配置,开启访问控制: # vi /etc/mongod.conf security: authorization: enabled keyFile: /usr/local/mongodb/mongo.keyfile replication: replSetName: <replicaSetName> net: bindIp: localhost,<hostname(s)|ip address(es)> 然后启动mongodb实例 比如: mongod --config <path-to-config-file>  systemctl restart mongod.servicesystemctl status mongod.

Linux c 开发 - 内存管理器ptmalloc

转自:https://blog.csdn.net/initphp/article/details/50833036 目录 一、内存布局 二、ptmalloc内存管理器 1. 设计假设 2. 主分配区和非主分配区 3. chunk 内存块的基本组织单元 4. 内存分配malloc流程 5. 内存释放free流程 6. mallopt 参数调优 7. 使用注意事项 一、内存布局 了解ptmalloc内存管理器,就必须得先了解操作系统的内存布局方式。通过下面这个图,我很很清晰的可以看到堆、栈等的内存分布。 X86平台LINUX进程内存布局: 上图就是linux操作系统的内存布局。内存从低到高分别展示了操作系统各个模块的内存分布。 Test Segment:存放程序代码,只读,编译的时候确定 Data Segment:存放程序运行的时候就能确定的数据,可读可写 BBS Segment:定义而没有初始化的全局变量和静态变量 Heap:堆。堆的内存地址由低到高。 Mmap:映射区域。 Stack:栈。编译器自动分配和释放。内存地址由高到低 二、ptmalloc内存管理器 ptmalloc是glibc默认的内存管理器。我们常用的malloc和free就是由ptmalloc内存管理器提供的基础内存分配函数。ptmalloc有点像我们自己写的内存池,当我们通过malloc或者free函数来申请和释放内存的时候,ptmalloc会将这些内存管理起来,并且通过一些策略来判断是否需要回收给操作系统。这样做的最大好处就是:让用户申请内存和释放内存的时候更加高效。 为了内存分配函数malloc的高效性,ptmalloc会预先向操作系统申请一块内存供用户使用,并且ptmalloc会将已经使用的和空闲的内存管理起来;当用户需要销毁内存free的时候,ptmalloc又会将回收的内存管理起来,根据实际情况是否回收给操作系统 1. 设计假设 ptmalloc在设计时折中了高效率,高空间利用率,高可用性等设计目标。所以有了下面一些设计上的假设条件: 具有长生命周期的大内存分配使用mmap。 特别大的内存分配总是使用mmap。 具有短生命周期的内存分配使用brk。 尽量只缓存临时使用的空闲小内存块,对大内存块或是长生命周期的大内存块在释放时都直接归还给操作系统。 对空闲的小内存块只会在malloc和free的时候进行合并,free时空闲内存块可能放入pool中,不一定归还给操作系统。 收缩堆的条件是当前free的块大小加上前后能合并chunk的大小大于64KB、,并且堆顶的大小达到阈值,才有可能收缩堆,把堆最顶端的空闲内存返回给操作系统。 需要保持长期存储的程序不适合用ptmalloc来管理内存。 不停的内存分配ptmalloc会对内存进行切割和合并,会导致一定的内存碎片  2. 主分配区和非主分配区 ptmalloc的内存分配器中,为了解决多线程锁争夺问题,分为主分配区main_area和非主分配区no_main_area。 每个进程有一个主分配区,也可以允许有多个非主分配区。 主分配区可以使用brk和mmap来分配,而非主分配区只能使用mmap来映射内存块 非主分配区的数量一旦增加,则不会减少。 主分配区和非主分配区形成一个环形链表进行管理。  3. chunk 内存块的基本组织单元 ptmalloc通过chunk的数据结构来组织每个内存单元。当我们使用malloc分配得到一块内存的时候,这块内存就会通过chunk的形式被记录到glibc上并且管理起来。你可以把它想象成自己写内存池的时候的一个内存数据结构。

第一个JAVA程序

1.通过新建文本文件,文件名应与类名相同:Hello.java,键入代码并保存,代码如下 public class Hello{ public static void main(String[] args){ System.out.println(hello); } } 2.在文件目录下打开cmd,通过javac指令编译 javac Hello.java 3.在资源管理器中可以查看到生成的.class文件,通过使用 java Hello 来运行此代码。

Spring Boot+微信小程序_保存微信登录者的个人信息

1. 前言 微信小程序开发平台,提供有一类 API,可以让开发者获取到微信登录用户的个人数据。这类 API 统称为开放接口。 Tip:微信小程序开发平台,会把微信登录用户的个人信息分为明文数据和敏感数据。 明文数据也称为公开数据,开发者可以直接获取到,如登录者的昵称、头像…… 敏感数据如电话号码、唯一标识符……等数据,只有高级认证开发者和经过登录者授权后才能解密获取到。 这一类 API较多,且 API之间功能有重叠之处,相互之间的区别较微小。有的适用于低版本,有的适用于高版本。 为了避免在使用时出现选择混乱,本文将通过具体应用案例介绍几个常用 API的使用。 2. 开放接口 开放接口是对一类 API的统称,开发者可以通过调用这类接口得到微信登录用户的授权或获取登录者的个人数据。 开放接口又分成几个子类 API : 登录接口: 包括 wx.pluginLogin(Object args)、wx.login(Object object)、wx.checkSession(Object object) 几 个 API。 账号信息: 包括Object wx.getAccountInfoSync()此接口用来获取开发者的账号信息。 用户信息: 包括 wx.getUserProfile(Object object)、wx.getUserInfo(Object object)、UserInfo。使用频率非常高的接口,常用于小程序中获取登录者个人公开数据。 授权接口:wx.authorizeForMiniProgram(Object object)、wx.authorize(Object object) 除上述列出的子类接口,还有收货地址、生物认证……等诸多子类 API,有兴趣者可以自行了解。 2.1 登录接口 登录接口中有 3 个 API,对于开发者来说,使用频率较高的是 login接口,此环节将重点介绍此接口。 非本文特别关注的接口,会简略带过。 wx.pluginLogin(Object args):此接口只能在插件中可以调用,调用此接口获得插件用户的标志凭证code,插件可使用此凭证换取用于识别用户的唯一标识 OpenpId。 用户不同、宿主小程序不同或插件不同的情况下,该标识均不相同,即当且仅当同一个用户在同一个宿主小程序中使用同一个插件时,OpenpId 才会相同。 对于一般开发者,此 接口用的不是很多,具体使用细节在此处也不做过多复述。 什么是 OpenId? 当微信用户登录公众号或小程序时,微信平台为每一个微信登录者分配的一个唯一标识符号。 2.1.1 wx.

linux内核调度的机制 tasklet/workqueue/kthread_worker/kthreadx详解及示例【转】

转自:https://blog.csdn.net/zxpblog/article/details/108539245 前言: 一直就感觉linux下面的任务调度机制太丰富了,由于各种调度机制平时工作中只是要用,理解并不是那么深刻,所有有时候说不上道道来,只知道这个要用softirq/tasklet/workqueue/thread/, workqueue的优先级要设置成system_wq,system_highpri_wq, system_unbound_wq 或者thread 的SCHED_RR/SCHED_FIFO这样子,说实话,现在我也不能保证说概述的很全很准确(有不对地方,欢迎大家指出)。就期待后面可以慢慢完善,读者如果有建议补充的可以提建议,我们一起不断更新这篇文章,一起努力可以把linux 线程相关的东西吃懂吃透,目的是争取为社区贡献一篇好文章。 闲话少说:先简述吧 第1章:linux常见的任务调度的机制 1.1 softirq(不允许休眠阻塞,中断上下文) 软终端支持SMP,同一个softirq可以在不同CPU同时运行,必须是可重入的,是编译期间静态分配的,不想tasklet一样能被动态注册,删除(个人感觉因为不方便,所以使用较少)。kernel/softirq.c文件中定义了一个包含32个softirq_action结构体的数组,每个被注册的软终端都占据该数组的一项,因此最多可能有32个软中断。 特性: 1)一个软中断不会抢占另一个软中断 2)唯一可以抢占软中断的是ISR(中断服务程序) 3)其它软中断可以在其它处理器同时执行 4)一个注册的软中断必须被标记后才执行 5)软中断不可以自己休眠(不能自己调用sleep,wait等函数) 6)索引号小的软中断在索引号大的软中断之前执行 1.2 tasklet(不允许休眠阻塞,中断上下文) 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,假设一个数据块到达触发中断时,中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,接受数据的进程就可以在缓冲区找到数据)。因此,内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理,首先,一个快速的“上半部”来处理硬件发出的请求,它必须在一个新的中断产生之前终止。通常,除了在设备和一些内存缓冲区(如果你的设备用到了DMA,就不止这些)之间移动或传送数据,确定硬件是否处于健全的状态之外,这一部分做的工作很少。下半部运行时是允许中断请求的,而上半部运行时是关中断的,这是二者之间的主要区别 中断bai处理的tasklet(小任务)机制 特性: 1)不允许两个相同的tasklet绝对不会同时执行,即使在不同CPU上。 2)从softirq衍生,但是使用简单,效率高(较softirq低,较workqueue高),常用 3)在中断期间运行时, 即使被多次调用也只会执行一次 4)SMP系统上,可以确保在第一个调用它的CPU执行 1.3 workqueue(允许休眠阻塞,进程上下文) 工作队列(work queue)是另外一种将工作推后执行的形式,它和前面讨论的tasklet有所不同。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。 1)工作队列会在进程上下文中执行 2)可以阻塞 3)可以重新调度 4)缺省工作者线程(kthrerad worker && kthread work) 5)在工作队列和其它内核间用锁和其它进程上下文一样 6)默认允许响应中断 7)默认不持有任何锁 那么,什么情况下使用工作队列,什么情况下使用tasklet。如果推后执行的任务需要睡眠,那么就选择工作队列。如果推后执行的任务不需要睡眠,那么就选择tasklet。另外,如果需要用一个可以重新调度的实体来执行你的下半部处理,也应该使用工作队列。它是唯一能在进程上下文运行的下半部实现的机制,也只有它才可以睡眠。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,它都会非常有用。如果不需要用一个内核线程来推后执行工作,那么就考虑使用tasklet。 1.4 kthread Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。这与用户线程是不一样的。因为内核线程只运行在内核态,因此,它只能使用大于PAGE_OFFSET(3G)的地址空间。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。 内核线程(thread)或叫守护进程(daemon),在操作系统中占据相当大的比例,当Linux操作系统启动以后,你可以用”ps -ef”命令查看系统中的进程,这时会发现很多以”d”结尾的进程名,确切说名称显示里面加 []的,这些进程就是内核线程。 内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。让模块在加载后能一直运行下去的方法——内核线程。要创建一个内核线程有许多种方法。 第2章:linux常见的任务调度的优先级 2.1 workqueue(include/linux/workqueue.h)与waitequeue协作(include/linux/wait.h) 使用示例 定义workqueue struct work_struct retreive_frame_work; 1 初始化workqueue和waitqueue及workqueue的callback的定义 INIT_WORK(&retreive_frame_work, retrieve_desc_task_callback); init_waitqueue_head(&frame_wq); void retrieve_desc_task_callback(struct work_struct *work){ add_desc(iav, 0); //生产frame_desc wake_up_interruptible_all(&frame_wq); //通知消费者,frame_desc已经生产完毕,可以去取了 } 中断ISR中:唤醒workqueue queue_work(system_wq, &retreive_frame_work); 消费由 retrieve_desc_task_callback 生产的 frame_desc(blocking 的方式) wait_event_interruptible(frame_wq, (desc = find_frame_desc())); 2.