![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
时光耗子_hzh
码农
展开
-
Linux下的虚拟地址映射详解(一)逻辑地址到线性地址的映射
现在假设有这么一段代码: void main(){int a = 100;cout} 如果编译执行,先打印地址,假设是0x12345678。那么,这个地址,是逻辑地址呢,还是线性地址,亦或是物理地址呢? 首先我们需要引入一些别的东西。在英特尔的X86体系下,从他的发展可以看出他是从实模式向保护模式发展的,内存管理是从分段是管理往分页式管理的。既然是一原创 2017-05-14 15:05:24 · 3114 阅读 · 0 评论 -
Linux 消息队列、共享内存、信号量(二)共享内存和信号量
Linux 消息队列、共享内存、信号量(二)共享内存和信号量 一般来说,进程间通信会加上一个进程间同步或者互斥的功能,比如管道,读进程没有东西读的时候会进入睡眠,写进程在缓冲区满的时候也会进入睡眠。虽然这两个过程从宏观上来说是并发的,但是从微观上来说是原子的。但是共享内存不一样,在一个进程对该内存读的时候,另一个进程能够对该内存执行写操作。所以,我们要通过信号量来达到对共享内存的同步和互斥原创 2017-06-11 21:31:36 · 317 阅读 · 0 评论 -
Linux 管道浅谈
管道分为有名管道和无名管道。我们先从无名管道开始。 无名管道用于父子进程、兄弟进程之间的通信。管道的主体是pipe,pipe所建立的管道只在一个进程里,所以我们要通过fork来实现进程间通信。 我们使用管道就可以看出,对管道的读写,实际上就是read和write。那是不是说,管道实际上就是一个文件呢? 是的,在具体的实现上,管道是作为匿名文件存在的,fd[2]里的两个元素实原创 2017-06-03 22:47:59 · 335 阅读 · 0 评论 -
Linux 信号浅谈
信号机制是在软件层次上对中断机制的一种模拟,从概念上来说,一个进程接受到一个信号与一个处理器接收到的中断请求是一样的。实际上,信号是一种软中断。 既然是中断,那么就得有一个处理中断方法的中断向量表。在task_struct里,有一个指针sig,指向一个sig_struct结构。这个结构我们可以成为“信号向量表”。 struct signal_struct{atomic_t原创 2017-06-03 22:45:41 · 359 阅读 · 0 评论 -
Linux select、poll、epoll解析
一个已打开的文件可以是一个常规文件,也可以是一个设备文件,还可以是进程为了实现通信建立的管道或者套接字等等。如果现在有一个进程要监听一个打开文件,while循环就好了。但是如果要监听多个文件,那就得是异步IO。这就是我们今天要讨论的三种方法。 我们先从select开始 int select(int maxfdp1,//一共有多少个文件描述符fd_set *readset,原创 2017-06-18 21:00:09 · 399 阅读 · 0 评论 -
Linux下的虚拟地址映射详解(二)线性地址到物理地址的映射
现在有这么一个函数 void main(){int a = 2;cout while(a){;}cout} 函数运行起来会是这个样子:先打印出a的地址,假设是0x12345678,接着会进入死循环。现在如果要求你寻找某个办法,来跳出循环打印”fun end”,然后结束整个函数。(函数正在运行,不允许修改代码,也不能ctrl+c)你原创 2017-05-14 15:17:18 · 1973 阅读 · 0 评论 -
Linux 从PCB的角度谈用户空间
进程控制块PCB,实际上指的是一个结构体task_struct。下面说说这个task_struct Task_struct有一个指向mm_struct的指针,mm_struct结构体是该进程整个用户空间的抽象。包含着装入的可执行映像信息以及进程的页目录指针。Mm_struct结构体非常有意思,在一个进程控制块里,只含有一个指向mm_struct的指针,但是一个mm_struct能够被若干个原创 2017-05-21 00:06:10 · 1097 阅读 · 0 评论 -
Linux 物理页面的周转
在前几篇博文我们频繁提到了物理页面,swap交换分区。那么,在这一篇博文,我们将详细探索物理页面。 物理页面的周转 物理页面的周转有两层意思,一层是盘区交换。第二层是页面的换入换出。 下面来谈谈盘区交换首先,不是所有的物理页面都能被交换的,比如系统空间的页面就不会被交换掉(交换掉了就没人干活了)。页面的交换比较复杂,我们一共能想到这几种思路。1、最简单的很明显,不够原创 2017-05-21 00:04:21 · 625 阅读 · 0 评论 -
Linux 消息队列、共享内存、信号量(一)消息队列
消息队列、共享内存、信号量这三个放到一起说是因为这三种机制统称为“系统V进程间的通信机制”,系统为V IPC提供了一个统一的系统调用ipc(),内核的实现是sys_ipc()。 int sys_ipc(unsigned int call, int first,int second,int third,void*ptr,int forth);其中call为操作码,操作码对应着这三种机制共原创 2017-06-04 21:05:16 · 833 阅读 · 0 评论 -
Linux 从GDB谈进程跟踪
进程跟踪的系统调用是ptrace(),通过ptrace,一个进程可以动态的读写另一个进程的内存和寄存器,包括数据段、代码段、堆栈以及所有的寄存器。从概念上来说,着似乎也是进程间通信的一种方法。但实际上,这种通信是单方面的,被跟踪的进程并不知道自己是在收到控制和监视的条件下进行。从这个角度来说,这又不属于进程间通信。 ptrace格式:Int ptrace(int request,//具原创 2017-06-04 21:01:26 · 857 阅读 · 0 评论 -
Linux fork(),vfork(),clone()底层浅谈
Linux fork(),vfork(),clone()底层浅谈 我们平常进程会用到fork,但是fork只是创建了一个与父进程一模一样的子进程,并且复制了父进程所有的资源,包括打开的文件,父进程的数据结构、映射的物理页面,以及各种堆栈等等。如果我们不需要这么多资源,那我们该怎么操作呢? vfork会共享父进程的堆栈,同时也会先于父进程运行(将父进程挂起),只有在子进程结束后父进原创 2017-05-30 20:56:08 · 266 阅读 · 0 评论 -
Linux socket浅谈
限于篇幅,本文将主要讨论在同一计算机下的socket进程间通信 从概念上说,socket和管道没多大区别。但是从实现上来说,管道传递的是无结构的字节流,但是socket传递的是报文。 与V IPC相同,内核为socket设置的总入口为sys_socketcall() sys_socketcall(int call, unsigned long *args) 之后会原创 2017-06-11 21:33:44 · 461 阅读 · 0 评论