系统调用

零拷贝 zero-copy 原理

点点圈 提交于 2019-12-10 13:11:18
引言 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操作系统有效进行数据传输操作的能力。 零拷贝( zero-copy )技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理 I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要 CPU 数据拷贝操作。 什么是零拷贝? 零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。 零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。而且,零拷贝技术减少了用户应用程序地址空间和操作系统内核地址空间之间因为上下文切换而带来的开销

linux socket编程系统调用栈

ぃ、小莉子 提交于 2019-12-10 12:55:40
目录 一、网络协议参考模型简介 二、SOCKET概述 三、SOCKET基本数据结构 1、TCP通信编程 2、服务器端实例代码 3、客户端实例代码 4、头文件socketwrapper.h 5、程序实现功能 6、探究socket系统调用 @(linux socket编程实现原理) 一、网络协议参考模型简介 国际标准组织(ISO)制定了OSI模型。这个模型把网络通信的工作分为7层,从上至下为应用层、表示层、会话层、 传输层、网络层、数据链路层、物理层。 而TCP/IP协议将OSI的7层模型简化为4层,从上至下分别为应用层、传输层、网络互连层(网际层)、网络接口层。 TCP/IP协议实际是一个协议族,为网际数据通信提供不同层次的通路。 TCP协议处于传输层,实现了从一个应用程序到另一个应用程序的数据传递。应用程序通过目的IP地址和端口号 来区分接收数据的不同应用程序。 二、SOCKET概述 socket接口是TCP/IP网络的API,它定义了许多函数或例程,程序员可以使用它来开发TCP/IP网络上的应用程序, 要学习Internet上的TCP/IP网络编程,必须理解socket接口。socket接口设计者最先将接口放在UNIX操作系统中。 如果了解UNIX系统的输入输出的话,就很容易理解socket了。网络的socket数据传输是一种特殊的I/O,socket 也是一种文件描述符。 三

关于32位和64位linux的系统调用

主宰稳场 提交于 2019-12-09 22:39:56
32位和64位的syscall原理都是一样 只有传参和调用存在差异,以下一起说,做个对比 32位系统调用使用 " int 80h " 64位系统调用使用 " syscall " (汇编代码就是syscall 直接ROPgadget--only查找即可) 32的系统调用号与64位的不大一样 使用的时候最好百度一下 比如 32位 #define __NR_execve 11 64位 #define __NR_execve 59 32位的系统调用号放在eax 传参依次是 EBX、ECX、EDX、ESI、EDI、EBP 64位的系统调用号放在rax 传参依次是 RDI、RSI、RDX、R10、R8、R9 (和64位函数传参一样) 一个64位的题目 backdoor Weekly 1 Challenge 2 题目说的很清楚了 构造ROP chain 没有/bin/sh字眼 只能自己gets 到bss区域 然后调用execve (想过使用shellcode 但是没找到合适的可执行地址) from pwn import * # io=process('./chall') elf=ELF('./chall') io=remote('hack.bckdr.in',15102) # context(os='linux', arch='amd64', log_level='debug') #

Java与线程

烂漫一生 提交于 2019-12-09 13:28:46
  线程是比进程更轻量级的调度执行单位,线程的引入可以把一个进程的资源分配和执行调度分开,各个线程可以共享进程资源,又可以独立调度。   每个已经执行start()方法且还未结束的java.lang.Thread类的实例就代表了一个线程。 1.线程的实现(三种): 使用内核线程实现、使用用户线程实现、使用用户线程加轻量级进程混合实现    1)使用内核线程实现(一对一线程模型): 内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接使用内核线程,而是去使用它的一种高级接口——轻量级进程,即线程;只有先支持内核线程,才能有轻量级进程。但轻量级进程具有它的局限性:首先,由于是基于内核线程实现的,所以各种线程操作都需要进行系统调用,而系统调用代价较高,需要在用户态和内核态之间来回切换。轻量级进程要消耗一定的内核资源,因此一个系统支持的轻量级进程的数量是有限的。    2)使用用户线程实现(一对多线程模型): 从广义上,一个线程只要不是内核线程,就可以认为是用户线程。从狭义上,用户线程是指完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户台中完成,不需要内核的帮助。使用用户线程的优势在于不需要系统内核支援