
linux
melon_eater
这个作者很懒,什么都没留下…
展开
-
linux动态链接库的创建和使用
1、准备2个源程序/add.c/ intadd(inta,intb){ returna+b;} /sub.c/ intsub(inta,intb){ returna-b;} 2、创建共享库 gcc-c-fPICsub.cgcc-c-fPICadd.c gcc-shared-fPIC-olibouyang.sosub.oadd.o 3、动态加载动态库 所谓动态加载,就是程序自己在运转载 2016-11-25 22:09:03 · 314 阅读 · 0 评论 -
linux内核中虚拟内存有关的数据结构关系图
这只是比较重要的一部分,用来在宏观上感受一下。原创 2018-01-01 19:39:54 · 617 阅读 · 0 评论 -
linux进程虚拟地址空间
内存管理模块是操作系统的心脏;它对应用程序和系统管理非常重要。今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕。由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Linux和Windows系统。本系列第一篇文章讲述应用程序的内存布局。 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address s...转载 2018-01-12 16:42:41 · 357 阅读 · 0 评论 -
linux物理内存的管理
数据结构:typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; struct zonelist node_zonelists[MAX_ZONELISTS]; int nr_zones; struct page *node_mem_map; struct bootmem_data *原创 2017-12-28 16:41:34 · 336 阅读 · 0 评论 -
对linux内核中GDT和LDT的理解
GDT(Global Descriptor Table) 在实模式下当我们需要对一个内存地址进行访问的时候,使用的是 【段基地址:偏移地址】,这样计算出来的地址就是内存的实际地址。但是到了保护模式,内存管理分为段式,和段页式,也就是段模式必不可少。我们先不考虑页模式。 对段模式来说,访问一个内存仍然用的【段基地址:偏移地址】。IA32允许将一个段的基地址设置为32bit所能表示的任何值,li原创 2018-01-05 15:13:00 · 7684 阅读 · 1 评论 -
linux内存管理解析----linux物理,线性内存布局及页表的初始化
早就想搞一下内存问题了!这次正趁着搞bigmemory内核,可以写一篇文章了。本文旨在记录,不包含细节,细节的话,google,百度均可,很多人已经写了不少了。我只是按照自己的理解记录一下内存的点点滴滴而已,没有一家之言,不讨论,不较真。1.最简单的内存使用最简单的模型是冯.诺依曼提出的原始模型,简单的把数据和指令存放在内存中,然后机器从内存中取出指令和数据进行计算,如下图所示:转载 2018-01-05 16:36:30 · 848 阅读 · 0 评论 -
linux内存分配之mmap,munmp,brk
Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 ...原创 2018-02-10 16:52:05 · 461 阅读 · 0 评论 -
带参数的信号
转自:http://blog.youkuaiyun.com/q1007729991/article/details/53893743前面不管我们是使用 signal 信号注册函数还是 sigaction 信号注册函数,我们都只注册了带一个参数的信号处理函数 void handler(int sig)。实际上,我们也可以使用带参数的的信号处理函数。signal 函数没办法注册一个带附加参数的信号处理函数,但是 ...转载 2018-02-26 18:53:54 · 1463 阅读 · 4 评论 -
条件变量之虚假唤醒
转载自:http://blog.youkuaiyun.com/q1007729991/article/details/620399881. 实现方法接下来,给出 pthread_cond_wait 和 pthread_cond_signal 的伪代码(参考man pthread_cond_signal)。语句后面的编号代表时间上的执行顺序。pthread_cond_wait(mutex, cond) { ...转载 2018-03-02 11:37:38 · 596 阅读 · 0 评论 -
水平触发和边缘触发
epoll也是实现I/O多路复用的一种方法,为了深入了解epoll的原理,我们先来看下epoll水平触发(level trigger,LT,LT为epoll的默认工作模式)与边缘触发(edge trigger,ET)两种工作模式。使用脉冲信号来解释LT和ET可能更加贴切。Level是指信号只需要处于水平,就一直会触发;而edge则是指信号为上升沿或者下降沿时触发。说得还有点玄乎,我们以生活中的一个...原创 2018-03-02 18:36:46 · 735 阅读 · 0 评论 -
malloc分配内存泄露检测
mtrace用法:#include <unistd.h>#include <fcntl.h>#include <sys/uio.h>#include <mcheck.h>int main(){ mtrace();//开始监测 int *p=(int *)malloc(4*sizeof(int)); free(p);...原创 2018-02-24 16:20:33 · 661 阅读 · 0 评论 -
linux 同步IO: sync、fsync与fdatasync
传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach ...转载 2018-02-24 21:05:18 · 231 阅读 · 0 评论 -
PLT和GOT表(1)
转载自:http://blog.youkuaiyun.com/linyt/article/details/51635768在介绍PLT和GOT出场之前,先以一个简单的例子引入两个主角,各位请看以下代码:#include <stdio.h>void print_banner(){ printf("Welcome to World of PLT and GOT\n");}int m...转载 2018-03-12 10:42:16 · 291 阅读 · 0 评论 -
linux下增加一个新的系统调用实现pstree功能
这是我们linux课程的一个作业。 首先得到init进程的task_struct,根据list_for_each可以循环遍历可以的到其所有的子进程的 list_head,根据list_head使用list_entry可以得到其task_struct,在循环的同时,每得到一个进程的task_struct,就递归遍历其子进程的task_struct。在递归的同时,记录递归的深度,根据深度在每个子进程的原创 2017-12-17 22:44:40 · 1686 阅读 · 0 评论 -
伙伴系统的概述
转载出处:http://blog.youkuaiyun.com/vanbreaker/article/details/7605367 伙伴系统的概述Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种转载 2017-12-17 22:05:44 · 353 阅读 · 0 评论 -
安卓下反调试方案汇总
Android反调试1.调试端口检测读取/proc/net/tcp,查找IDA远程调试所用的23946端口,若发现说明进程正在被IDA调试。void CheckPort23946ByTcp(){ FILE* pfile=NULL; char buf[0x1000]={0}; // 执行命令 char* strCatTcp= "cat /proc/net/tcp |g原创 2017-12-15 21:36:22 · 2071 阅读 · 0 评论 -
linux管理进程的链表
linux管理进程的链表 linux2.6.11的内核中,为了方便管理linux的进程,主要建了5种linux链表。每个链表节点之间的互联有两种方式,一种是hash节点之间的互联,通过hlist_node的数据结构来实现;另一种就是list_head类型的数据结构来互联。看linux内核的人对这两种类型的数据结构肯定是不会陌生的,因为它们在linux内核中无处不在。转载 2017-02-15 22:51:01 · 1198 阅读 · 0 评论 -
linux遍历子进程详解
首先我们来看看遍历子进程的代码:list_for_each(pos,&task->tasks) { p=list_entry(pos,struct task_struct,tasks); count++; printk("%d---->%s\n",p->pid,p->comm); } 内核维护着一个节点为list_原创 2017-06-02 23:19:59 · 1944 阅读 · 0 评论 -
IDA权威指南阅读笔记1
nm命令nm命令可以列举目标文件中的符号strip命令去除目标文件中的符号,增加逆向的难度示例:源代码:使用nm命令查看符号:此时在IDA中的表现形式:这里我们看到foo函数的名字没有变,如果不去除这些符号,将会大大降低被逆向的难度。使用strip命令后:没有符号了,我们再来看看此时在IDA中的表现形式:这也就是为原创 2017-07-23 15:33:54 · 410 阅读 · 0 评论 -
IDA权威指南阅读笔记2
1.之前查看当前函数被哪个函数调用了都是去跳转到LR寄存器(arm)的地址,看这个地址在哪个函数里,现在发现这个功能IDA提供了依次点击:View--->openSubviews--->Functions calls 即可显示如图:2.查看栈相对变化量:依次点击 Options--->General,勾上 stack pointer看看多了什么:原创 2017-07-25 11:21:13 · 361 阅读 · 0 评论 -
为何要使用两次fork?
首先我们来看看什么事孤儿进程和僵尸进程: 孤儿进程:当子进程还没有结束的时候,其父进程退出,此时此进程就变成了孤儿进程,如图所示: 但是孤儿进程并不会存在很久,当系统发现孤儿进程时,init进程就收养孤儿进程,负责这个孤儿进程exit后的清理工作。僵尸进程:当子进程在父进程退出前退出的情况下,子进程在从自己退出到父进程退出前的这一段时间是僵尸进程,父进程退出时候,会对这个僵尸进程做清理工作。原创 2017-10-16 15:13:17 · 1415 阅读 · 0 评论 -
信号量处理有关的函数和数据结构
1 kill和raise函数#include<signal.h>int kill(pid_t pid,int signo);//pid>0 将信号发送给进程ID==PID的进程//pid==0 讲信号发送给其进程组ID等于发送进程的进程组ID的进程组kill函数将信号量发送给进程或者进程组,raise函数允许进程向自身发送信号,我们常在终端下杀死一个进程使用kill -9 [pid],这实际上是原创 2017-10-20 18:11:11 · 1155 阅读 · 0 评论 -
一篇文章看懂select_poll_epoll
书上还有各种博客介绍select.poll.epoll基本上都是一上来就介绍数据结构,参数等等,这对新手很不友好啊,于是看到了知乎大神的帖子:https://www.zhihu.com/question/32163005以下转自知乎:——————————————————我是分割线——————————————————————– 假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,原创 2017-10-21 20:44:18 · 3799 阅读 · 0 评论 -
dup和dup2
在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表: 其中fd0,1,2分别是标准输入,标准输出,错误输出。 dup和dup2两个函数都可以用来复制打开的文件描述符,复制成功后和复制源共享同一个文件表,如图: 关于dup的测试代码:#include <unistd.h>#include <fcntl.h>#incl原创 2017-10-14 21:10:24 · 510 阅读 · 0 评论 -
unix中的进程间通信
管道管道分为命名管道(FIFO)和匿名管道(PIPE),无论是哪种管道,都是由内核帮你创建和维护的。管道的特点:1.管道是半双工的,即同一时间数据只能从一端流向另一端。试想,如果一个管道从两边同时输入和输出数据,那么管道里的数据就乱了。 2.管道的两端一端作为读端,一端作为写端。 3.管道具有自适应的特点,默认会适应速度比较慢的一方,管道被写满或读空时速度快的一方会自动阻塞。//pipe(2)转载 2017-10-26 21:52:05 · 700 阅读 · 0 评论 -
linux调试器的实现---断点的实现
断点是如何形成的 有两种类型的断点:硬件断点和软件断点。硬件断点通常需要设置处理器中寄存器的值以产生断点,而软件断点则需要修改正在执行的代码。本文将以软件断点为主,因为它更简单,而且想要多少都可以,在X86上,同时只能设置4个硬件断点,不过硬件断点既可以在读取或写入给定地址触发,也可以在执行时触发。我上面说过,软件断点是通过修改执行代码来实现的,所以问题来了: 我们如何修改代码? 我们做什么修原创 2017-11-14 21:24:55 · 2002 阅读 · 0 评论 -
linux调试器的实现---有关寄存器操作的实现
在这里,依旧是我们的利器ptrace//reg.h#ifndef DEBUGGER_REG_H#define DEBUGGER_REG_H#include <string>#include <boost/mpl/size_t.hpp>#include <array>#include <algorithm>enum class reg { rax,rbx,rcx,rdx,原创 2017-11-14 20:51:05 · 549 阅读 · 0 评论 -
信号量
总算把APUE的信号一章看完了,现在进行一下总结。信号量:信号量我们可以理解为软中断,比如进程A正在运行中,突然收到了一个信号,如果进程A捕捉了这个信号,收到信号后,保存当前的运行环境,转而去执行信号处理函数,看以下代码:int main(){ signal(SIGINT,fun_sigint);//注册信号处理函数 while(1);void fun_sigint(int sig原创 2017-10-20 16:57:46 · 331 阅读 · 0 评论 -
一篇文章看懂makefile编写规则
该篇文章为转载,是对原作者系列文章的总汇加上标注。支持原创,请移步陈浩大神博客:(最原始版本)http://blog.youkuaiyun.com/haoel/article/details/2886 我转自一个博主 基于原博客的整理版本:http://blog.youkuaiyun.com/ruglcc/article/details/7814546/ makefile很重要 ...转载 2018-07-17 10:39:58 · 24909 阅读 · 7 评论