首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 的各种:进程 线程 内核 中断

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...结束地址 的获取有点麻烦,我们需要先利用递归函数把搞溢出了,然后再 GDB 溢出的时候把指针 esp 打印出来即可。...进程在运行的过程,通过不断向区压入数据,当超出区容量时,就会耗尽所对应的内存区域,这将触发一个 缺页异常 (page fault)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct

3.3K20

Linux 的各种:进程 线程 内核 中断

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...结束地址 的获取有点麻烦,我们需要先利用递归函数把搞溢出了,然后再 GDB 溢出的时候把指针 esp 打印出来即可。...进程在运行的过程,通过不断向区压入数据,当超出区容量时,就会耗尽所对应的内存区域,这将触发一个 缺页异常 (page fault)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct

2.8K50
您找到你想要的搜索结果了吗?
是的
没有找到

一文搞懂 | Linux 的各种(进程 线程 内核 中断

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...结束地址 的获取有点麻烦,我们需要先利用递归函数把搞溢出了,然后再 GDB 溢出的时候把指针 esp 打印出来即可。...进程在运行的过程,通过不断向区压入数据,当超出区容量时,就会耗尽所对应的内存区域,这将触发一个 缺页异常 (page fault)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct

5.1K20

一文读懂 | Linux 的各种:进程 线程 内核 中断

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 。...Linux 为什么需要区分这些? 为什么需要区分这些,其实都是设计上的问题。这里就我看到过的一些观点进行汇总,供大家讨论: 1. 为什么需要单独的进程内核?...Linux 调度程序并没有区分线程和进程,当调度程序需要唤醒”进程”的时候,必然需要恢复进程的上下文环境,也就是进程;但是线程和父进程完全共享一份地址空间,如果也用同一个那就会遇到以下问题。

1.6K20

浅墨: 聊聊Linux IO()——Linux内核的IO

接上一篇浅墨: 聊聊Linux IO(上),先上一张全貌图[4]: ?...由图可见,从系统调用的接口再往下,Linux下的IO致大致有三个层次: 文件系统层,以 write(2) 为例,内核拷贝了write(2)参数指定的用户态数据到文件系统Cache,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间的交互 结合这个图,想想Linux系统编程里用到的Buffered IO、mmap(2)、Direct IO,这些机制怎么和Linux IO联系起来呢...假设要去读一个冷文件(Cache不存在),open(2)打开文件内核后建立了一系列的数据结构,接下来调用read(2),到达文件系统这一层,发现Page Cache不存在该位置的磁盘映射,然后创建相应的...然后请求继续到达块设备层,在IO队列里排队,接受一系列的调度后到达设备驱动层,此时一般使用DMA方式读取相应的磁盘扇区到Cache,然后read(2)拷贝数据到用户提供的用户态buffer中去(read

2.3K20

扩展Linux网络

扩展Linux网络 来自Linux内核文档。之前看过这篇文章,一直好奇,问什么一条网络流会固定在一个CPU上进行处理,本文档可以解决这个疑问。为了更好地理解本文章的功能,将这篇文章穿插入内。...简介 本文的描述了Linux网络的一组补充技术,用于增加多处理器系统的并行性和提高性能。...IPI会唤醒远端CPU对backlog的处理,后续队列的报文会在网络中进行处理。...为了启用加速RFS,网络会带调用ndo_rx_flow_steer 驱动函数来与期望(匹配特定流)的硬件队列进行交互。网络会在rps_dev_flow_table 的流表项更新之后调用该函数。...参考: Queues, RSS, interrupts and cores Linux Network Scaling: Receiving Packets Linux 网络协议收消息过程-Per CPU

3.5K30

Linux存储

前言: 随着Linux的版本升高,存储的复杂度也随着增加。作者在这里简单介绍目前Linux存储。...注意,这里virtio驱动最后会把数据写入到内存(也就是vring buf,并不是写入到具体的设备),然后还要访问PCI设备,因为virtio-blk本身就是一个虚拟的PCI设备,guest写入数据后...向loop设备读写,loop设备经过转化操作,转到真正的后端的file operation读写。...理解LVM的逻辑的核心在于上文的图中:理解清楚存储的层次关系,虚拟块设备到物理块设备之间的映射。...尝试把存储迁移到虚拟机,也许是一个不错的选择。哪怕虚拟机真的出现了kernel die,也不会真正影响到宿主机的运行,以及宿主机上的业务至少还是没有崩溃的。

5.2K132

Linux 内核,多线程空间模型是怎样的?

当进程运行起来后,产生另外两个动态区域,这就是堆和。 大多情况下,是CPU直接支持的一个内存区域。函数的局部变量便位于这个区域。 堆是一个没有严格定义的区域。...很简单,通过CPU直接支持的区,自动维护“函数调用链”: 顶 printSth函数的局部变量 main函数里面调用printSth函数的那条指令的位置 main函数的局部变量 底 对于printSth...而所谓“线程获得执行权”呢,实质上就是把对应线程的顶指针等信息载入CPU的指示器,使得它沿着这条调用链继续执行下去——执行一段时间,把它的顶指针等信息找个地方保存、然后载入另一个线程的顶指针等信息...4、线程取得的、进程生存期有效的资源,要么直接/间接挂载到全局变量/全局静态变量上,要么就一定要在线程结束前释放。...换句话说,所有线程都是平等的,它们各自独立使用自己的专属区(但主线程较为特殊,大多实现,它的退出就意味着进程结束;除此之外,它们是平等的)。

2.1K50

Linux溢出入门

ebp是底指针 esp是顶指针 好奇为啥底指针在最高的地方 aris说是为了最大化利用空间(懵逼) ~~学习一下的知识~~ 只要覆盖0x44个字节把 v5覆盖了就行 # coding=utf8...有一个getenv函数 是从系统环境获得变量,问了一下aris export这个命令就行 ch1p告诉我在ida里面可以用h将值变成16进制 ?...看到win的入口地址是 0x08048424 把v5的值改成这个就行 需要 0x40个A+0x08048424 aris教我可以用hex来查看堆栈信息 使用回车可以看后面的内容 可以发现我已经将v5的值改掉了...发现并没有跳到我给的地址打印一下看一下 ? 发现我的已经写上去了,但是地址还在后面8位 所以更改payload A*0x48+'bbbb'+p32(0x08048424) 成功! ?

2.8K10

Linux 内核的网络协议

前言 本文主要记录 Linux 内核网络协议的运行原理 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络...分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部的协议标识,以确定接收数据的上层协议。这个过程称作分用。...Linux 内核网络协议 协议的全景图 协议的分层结构 逻辑抽象层级: 物理层:主要提供各种连接的物理设备,如各种网卡,串口卡等。...,最后跳到 start_kernel() 函数初始化硬件相关的代码,完成 Linux Kernel 环境的建立。...NOTE:在整个协议实现 dev.c 文件的作用重大,它衔接了其下的硬件层和其上的网络协议层,可以称它为链路层模块,或者设备无关层的实现。

2.8K50

Linux内核IO技术详解

这是《Linux系统调用那些事》高级部分的第一章《聊聊Linux IO》。高级部分的文章均假设读者完整的学习过Linux系统基础以及Linux系统编程相关的内容,并已有一定的工程实践经验。...从上文的描述也介绍了文件的内核级缓存是保存在文件系统的Page Cache的。所以后面的讨论基本上是讨论IO相关的系统调用和文件系统Page Cache的一些机制。...Linux内核的IO 这一小节来看Linux内核的IO的结构。...先上一张全貌图[4]: 由图可见,从系统调用的接口再往下,Linux下的IO致大致有三个层次: 文件系统层,以 write 为例,内核拷贝了write参数指定的用户态数据到文件系统Cache,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间的交互 结合这个图,想想Linux系统编程里用到的Buffered IO、mmap、Direct IO,这些机制怎么和Linux IO联系起来呢

2.4K10

3)当我们要在压入一个元素的时候,我们把 TOP 的值加 1,然后把新压入的元素指向 TOP。...空的时候,TOP 等于 -1;把元素 1 压入的时候,stack[0] 为 1,TOP 加 1 变为 0;把元素 2 压入的时候,stack[1] 为 2,TOP 加 1 变为 1;把元素 3...假设的元素是 int 类型,我们可以用 Java 语言来自定义一个最简单的。...,按照正常的顺序把字符压入,然后再弹出来就行了。...3)用于浏览器:浏览器的后退按钮会把我们访问的 URL 压入一个,每次我们访问一个新的页面,新的 URL 就压入了的顶部,当我们点了后退按钮,最新的那个 URL 就从移除,之前的那个 URL

68820

python的实现

是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,数据的插入删除操作都是在顶端进行,常见的函数操作包括 empty() – 返回是否为空 – Time Complexity : O...(1) size() – 返回的长度 – Time Complexity : O(1) top() – 查看顶元素 – Time Complexity : O(1) push(g) – 向顶添加元素...– Time Complexity : O(1) pop() – 删除顶元素 – Time Complexity : O(1) python可以用以下三种方法实现: 1)list 2)collections.deque...3)queue.LifoQueue 使用列表实现 python的内置数据结构list可以用来实现,用append()向顶添加元素, pop() 可以以后进先出的顺序删除元素 但是列表本身有一些缺点...,主要问题就是当列表不断扩大的时候会遇到速度瓶颈.列表是动态数组,因此往其中添加新元素而没有空间保存新的元素时,它会自动重新分配内存块,并将原来的内存的值复制到新的内存块.这就导致了一些append

46810

与队列:系统处处都是的应用

题意其实就像我们在写代码的过程,要求括号的顺序是一样的,有左括号,相应的位置必须要有右括号。...如果还记得编译原理的话,编译器在 词法分析的过程处理括号、花括号等这个符号的逻辑,也是使用了这种数据结构。 再举个例子,linux系统,cd这个进入目录的命令我们应该再熟悉不过了。...动画如下: 第一种情况:已经遍历完了字符串,但是不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程,发现里没有要匹配的字符。...所以return false 第三种情况:遍历字符串匹配的过程已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false 那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后...已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false // 第二种情况:遍历字符串匹配的过程,发现里没有我们要匹配的字符。

43620

Tarjan的分析与SLT的实现

首先看一下手写的: 1 do{ 2 printf("%d ",stack[index]); 3 visit[stack[index]]=0; 4 index--; 5...=stack[index+1]);//出,并且输出。 6 printf("\n"); 我们可以发现。...x是与index的上一个元素比较的 举个例子 :1 3 2 4 5     x=2 这样的话会输出 5  4   2 但是stl不支持和顶的上一个元素比较,因为上一个元素一定是被pop掉的。...=stack.top;  那么当已经空的时候,还是会执行一下判断操作,这样就会导致re, 所以我们可以记录下pop之前的元素,这样就可以保证在判断的时候不会越界,而且是与pop之前的元素进行比较的 code...=h); 2.一般的do while语句都可以用while语句来实现 我们如果单纯的把do while改成while, 那么在上面的例子中会输出 5  4 所以我们还需要判断一次,把当前的顶给输出 代码

64460

Linux漏洞分析入门笔记-溢出

在IDA的安装目录的dbgsrv文件夹,选择linux_server或者linux_serverx64复制到需要调试Linux程序所在的目录下。...而根据Linux X86 32位函数调用约定,参数是压到上的。但是空间完全由我们控制了,所以控制system的函数不是一件难事情。...0x04:简单ROP构造 1.由于目标程序有数据执行保护,所以我们往的填充的数据并不能执行。...Linux系统对应用程序漏洞防护有三个: SSP(Stack-Smashing Protectot):堆栈防溢出保护,它会在每个函数的帧底部添加一个随机字节,每次函数将要返回时,都会这个随机字节进行验证...在overflow这个程序我们具有对数据写的权限,就没有对数据可执行的权限。

2K40
领券