ByteBuffer.allocateDirect()分配的内存是在用户空间还是内核空间 5C

1、ByteBuffer.allocateDirect()到底是在用户空间还是内核空间分配内存

2、如果它是从用户空间分配内存,那么为什么后面说交互都在内核空间中发生,不需要数据的拷贝?如果它是从内核空间分配内存,为什么与c语言的malloc不一致呢?
java能直接分配、读写内核空间吗?

0

2个回答

0

肯定是用户空间,不是内核空间。内核空间需要编写驱动程序,java做不到

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
内核态空间地址直接映射到用户态空间访问
【摘要】Linux中的内核空间到用户空间的地址映射让用户层应用可以直接访问内核地址,这就是mmap方法。应用程序通过内存映射可以直接访问设备的I/O存储区或DMA缓冲。内存映射使用户空间的一段地址关联到设备内存上,程序在映射的地址范围内进行读取或者写入,实际上就是对设备的访问。
零拷贝深入剖析及用户空间与内核空间切换方式
传统I/O操作 整个过程,用户空间缓冲区只是临时存放数据的载体,不对数据操作。 追求高性能、低延迟的瓶颈比较大。 改进1:操作系统意义上的0拷贝 相比上一个,减少了用户空间和内核空间间的数据拷贝 改进2: 真正意义上的0拷贝: 实例: 需求:实现文件读取发送,有C、S,C向S发送文件,S读取,用两种(传统io和零拷贝)方式,取中位数比较性能。 https://gi...
关于linux内核空间与用户空间的理解
简介现代计算机都有两种以上的运行模式(普通模式、特权模式),linux系统只有两层:高优先级模式(特权模式),低优先级模式(普通模式)。linux系统在高优先级模式中运行系统内核代码以及与硬件密切相关的代码。低优先级运行营运程序与硬件无关部分。应用程序不能直接操控硬件或者调用内核函数,需借助一系列接口函数申请让系统调用相关代码在内核空间运行,获取代码运行权限。Created with Raphaël
数据从网卡至内核空间再至用户空间流程分析
1、流程描述 通过网线传输的模拟信号进入网卡后,会进行模数转换操作,写入网卡缓存,然后通过DMA方式写入计算机内存(内核区间),猜测有一内核线程根据TCP/IP协议栈进行拆包(对应着封包操作),最后将数据写入每个socket对应的sync/accept队列中,供应用程序使用(应用程序需要进行组包操作,对应着分包操作)。 2、参考文献 网卡(NIC) 参考百家号(晴耕雨读)的视频 TCP接受...
linux用户空间和内核空间交互的几种方式
1、编写自己的系统调用syscall 2、编写驱动程序,read,write,ioctl 3、proc文件系统 4、sys文件系统 5、内存映射mmap  
Linux内核空间与用户空间的实现
实现用户内核空间和用户空间的分离是现代操作系统的必备能力。开始接触Linux时就就困惑于内核空间和用户空间的分离是如何实现的。查阅过一些材料,但很多都只是罗列了一些概念和一些简单的关系,并不能让我对这个问题有一个清晰的理解。后来在公司前架构师的建议下开始阅读《Linux内核情景分析》这本书,这里把学到的东西做一个小小的总结,做一个备忘。        内核很多功能的实现要依赖于硬件。对于我们要讨
Linux内核源码分析—从用户空间复制数据到内核空间
Linux内核源码分析—从用户空间复制数据到内核空间 本文主要参考《深入理解Linux内核》,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数。 1、不描述内核同步、错误处理、参数合法性验证相关的内容 2、源码摘自Linux内核2.6.11.1版 3、阅读本文请结合《深入理解Linux内核》第三版相关章节 4、本文会不定时更新 1、copy_from_user
从内核到用户空间传输数据
Relay 是一种从linux内核空间到用户空间高效传输数据传输技术。适合大量数据从内核空间传到用户空间的情形。 (1)Relay 原理 用户定义的relay通道将大量数据传到用户空间。由一组和CPU对应的内核缓存区组成。内核空间用户提供可以利用relay提供的API接口来写入数据。这些数据会被自动写入当前的CPU ID对应的那个relay  buffer.从用户空间看,这是一组普通文件。 ...
mmap映射物理内存到用户空间的方法
在内核申请一片物理内存,映射到用户空间使用的方法。环境:Linux ubuntu 4.10.0-42-generic。 #include #include #include #include #include #include #include #include #include #include #include #includ
Linux 从PCB的角度谈用户空间
进程控制块PCB,实际上指的是一个结构体task_struct。下面说说这个task_struct   Task_struct有一个指向mm_struct的指针,mm_struct结构体是该进程整个用户空间的抽象。包含着装入的可执行映像信息以及进程的页目录指针。Mm_struct结构体非常有意思,在一个进程控制块里,只含有一个指向mm_struct的指针,但是一个mm_struct能够被若干个
关于内核空间或用户空间拷贝数据注意事项
关于内核空间或用户空间拷贝数据注意事项在内核空间与用户空间界面处,内核检查用户空间缓冲区的合法性显得尤其必要,Linux内核的许多安全漏洞都是因为遗忘了这一检查造成的,非法侵入者可以伪造一片内核空间的缓冲区地址传入系统调用接口,让内核对这个"指向内核空间的缓冲区"填充数据,可以从http://www.cvedetails.com网站查询Linux CVE(Common Vulnerabilities
关于进程页表和页目录是存放在内核空间,还是用户空间,低端还是高端内存的思考和验证
首先,如果内核没有配置高端内存,那么进程页表肯定就是在低端内存了,也就是全部在内核空间了。 在配置了高端内存的情况下,进程页表的pgd,pud,pmd,pte这些,应该放在内核空间的低端内存,还是高端内存,内核空间还是用户空间?由于内核通过cr3能获得全局页目录中的物理地址,由于低端内存的线性映射,内核就能据此算出页目录的虚拟地址,进而实现对页目录的读写,但是,如果所有进程的页表都存放在低端内存,
64位Linux的内核和用户地址空间
32位的Linux中,0x00000000-0xBFFFFFFFFF 这3GB是 用户空间 0xC00000000-0xFFFFFFFFFF 这1GB是 内核空间++++++++++++++++++++++++++++++++++++++++++http://en.wikipedia.org/wiki/X64x86-64 From Wi
4.9 Linux64位内核地址空间分布图
4.9 Linux64位内核地址空间分布图,各个关键宏的分布位置。
内核空间与用户空间的通信之proc(一)
内核空间与用户空间的通信 在Linux中编程,特别是涉及内核驱动时,应用层程序经常需要和内核层驱动进行数据交换,比如内核检测到某个状态需要通知应用程序,或者应用程序的某个状态发生改变需用通知内核等等。 proc简介 /proc 文件系统是一种虚拟文件系统,它可以实现linux内核空间和用户空间的通信。与普通文件不同,这里的虚拟文件的内容都是动态创建的。 如果只是控制内核中的参数而不是传输较...
内核空间与用户空间之间的接口
1. 内核空间与用户空间的相互作用 在android开发过程中,很多应用程序需要编写内核级和用户级的程序来一起完成某个任务,流程如下 (1)编写内核服务程序利用内核空间提供的权限和服务来接收,处理和缓存数据。 (2)编写用户程序与之前完成的内核服务程序交互。可以利用用户程序来配置内核服务的参数。 在andriod开发过程中,内核空间和用户空间联合完成的典型应用,Netfilter (内核服...
浅谈内存映射文件原理与DirectMemory
Linux进程的虚拟内存结构(内核空间+用户空间) Memory mapped region for shared libraries 这一块就是直接虚拟内存映射到文件,减少了文件拷贝到内核空间,再拷贝到用户空间 此图为 Linux 2.X 中的进程虚拟存储器,即进程的虚拟地址空间,如果你的机子是 32 位,那么就有  2^32 = 4G的虚拟地址空间,我们可以看到图中有一块区域: “Me...
内核空间与用户空间
内核空间与用户空间   一个计算机通常有一定大小的内存空间,如使用的计算机是4GB 的地址空间,但是 程序并不能完全使用这些地址空间,因为这些地址空间被划分为内核空间和用户空间。程 序只能使用用户空间的内存,这里所说的使用是指程序能够申请的内存空间,并不是程序 真正访问的地址空间。   内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接 硬件资源等的程序...
Linux内存空间的分配
1、Linux内存空间 a. Linux的内存空间有4G的进程地址空间,包括用户空间与内核空间。用户空间分配了3G,而内核空间分配了1G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程进行系统调用的情况下(代表用户进程在内核态执行),才能够访问到内核空间。 b.用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。而内核空间是由内核负责映射,它并不会
消息队列通信方式为什么在内核和用户空间进行四次的数据拷贝
消息队列和管道基本上都是4次拷贝,而共享内存(mmap, shmget)只有两次。4次:1,由用户空间的buf中将数据拷贝到内核中。2,内核将数据拷贝到内存中。3,内存到内核。4,内核到用户空间的buf.2次: 1,用户空间到内存。 2,内存到用户空间。消息队列和管道都是内核对象,所执行的操作也都是系统调用,而这些数据最终是要存储在内存中执行的。因此不可避免的要经过4次数据的拷贝。但是共享内存不同,
Java虚拟机1
1、计算机存储单位 从小到大依次为位Bit、字节Byte、千字节KB、兆M、千兆GB、TB,相邻单位之间都是1024倍,1024为2的10次方,即: 1Byte= 8bit 1K = 1024Byte 1M = 1024K 1G = 1024M 1T = 1024G 2、计算机存储元件 寄存器:中央处理器CPU的一部分,是计算机中读写速度最快的存储元件,但是容量很少 内...
Linux内核地址空间的内存分布及分配
虚拟地址空间0~3G用于应用层 虚拟地址空间3~4G用于内核层 内核又将3~4G的虚拟地址空间,划分为如下几个部分:
Binder框架 -- 用户空间和驱动的交互
Binder框架 – 用户空间和驱动的交互MediaPlayerServic 启动的过程中,代码可以简化为: sp sm = new BpServiceManager(BpBinder(0)); sm->addService(String16(“media.player”), new MediaPlayerService()); 针对上面的两步,看下用户态程序和内核驱动是怎么交互的。Parcel在用
linux内核与用户空间的九种通信机制
目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs。其中模块参数与sysfs、procfs、debugfs、relayfs是基于文件系统的通信机制,用于内核空间向用户控件输出信息;sysctl、系统调用是由用户空间发起的通信机制;Netlink是...
堆外内存
堆外内存定义   创建Java.nio.DirectByteBuffer时分配的内存。 堆外内存优缺点   优点: 提升了IO效率(避免了数据从用户态向内核态的拷贝);减少了GC次数(节约了大量的堆内内存)。   缺点:分配和回收堆外内存比分配和回收堆内存耗时;(解决方案:通过对象池避免频繁地创建和销毁堆外内存) 为什么堆外内存能够提升IO效率?   堆内内存由JVM管理,...
内核空间和用户空间
【内核空间和用户空间】:  我们通常将运行模式称作内核空间和用户空间。模块运行在所谓的内核空间里,而应用程序运行在所谓的用户空间里。每一个模式都有自己的内存映射,即自己的地址空间。 两种操作模式在操作系统中的不同:  实际上操作系统的作用是为应用程序提供一个对计算机硬件的一致视图,必须负责程序的独立操作以及保护资源不受非法访问,而这个的完成必须依赖于CPU能够保护系统软件不受应用
Java直接内存是在用户空间还是内核空间
[size=14px]在《深入理解在Java虚拟机》中讲到JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,[b]它可以使用Native函数库直接分配堆外内存[/b][size=16px][/size],然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,[size=16px]因为避免了在Java堆和Native堆中来回复制数据[/size][b][/b]。[/size]rn[color=#FF0000][size=18px][b]那Java中native堆是在用户空间还是内核空间?如果是在用户空间,是不是还存在数据从内核空间到用户空间(native堆)的数据拷贝?各位大神解释一下![/b][/size][/color]
对linux内核、用户空间、内核态、用户态的理解
首先,linux系统有内核和用户空间之分 基本上可以理解成用户空间就是我们平常运行着的一个个的进程,而内核不是进程,内核是进程的管理者,同时有操作硬件的能力。 内核还运行着一些内核线程(内核无内核进程的概念,内核线程主要做一些类似定时将页写回硬盘的操作,是守护线程) 用户空间的程序想要操作硬件设备,就必须使用内核态来运行进程,要通过系统调用来从用户态陷入到内核态,然后进行系统调用操作硬件设备
操作系统的内存与空间
物理内存与虚拟内存 内存是计算机每部的一些存储器,用于保存cpu运算的中间数据和计算结果。 所谓物理内存就是RAM(Random Access Memory随机存储器),具有高速存取、读写时间相等,如计算机内存,在计算机中还有一种结构叫做寄存器,可以用于存储计算单元执行指令(如浮点、整数的运算)的中间结果。寄存机的大小决定了一次计算可使用的最大数值。 连接处理器和RAM或者处理器和寄存器的是...
ioctl之用户空间与内核的通信
内核部分代码 在include\uapi\linux\sockios.h文件内增加如下消息定义 #define SIOCGIFBRCM 0x8984 /* */ #define SIOCSIFBRCM 0x8985 /* */   在net\socket.c文件内增加 static DEFINE_MUTEX(brcm_ioctl_mutex); static int (*br
JBOSS:让应用局域网访问的方法总结
当把JBOSS作为WEB server的时候,有的时候需要让应用在局域网中让别人也可以访问,默认情况下JBOSS 局域网不能访问,本机也无法通过局域网IP访问 原因: JBOSS 4.2以上版本服务启动如果不加任何参数的话,只监听127.0.0.1,就是说只能用127.0.0.1或者localhost访问,用本机的对外地址 访问不了,同一网络内别的机子没法访问. 解决方法
linux 内核空间
原创: http://www.imet.me/post/2018/09-19_linux_kernal_basic/ 关于linux内核 用户态和内核态,有啥区别 ? 虚拟地址空间怎么划分的 ? 用户空间 vs 内核空间 用户空间和内核空间的划分: 下图展示了用户空间和内核空间的划分: user space: 应用程序和C库运行在用户空间 kernal space: 而核心内核和设备驱动程...
Linux用户空间与内核空间数据传递的几点理解和总结
Linux用户空间与内核空间数据传递的几点理解和总结  原文:http://www.docin.com/p-219290338.html 这篇文章 解决了 我对  copy_from_user(void*to, const void __user *from, unsigned long n)的一个疑惑: to 是指向内核空间的地址, from 是指向用户空间的地址, 执行是在
Linux 内核空间地址映射 高端内存 总结
内核空间映射到物理内存是从最低地址0x00000000开始,如下图所示 假设内核地址空间的简单线性地址转换关系为:物理地址 = 虚拟地址–  0xC0000000,内核虚拟地址空间对应的物理内存范围0x00000000~0x40000000,只有1G,显然不合理。 内核地址空间划分3部分:ZONE_DMA(16M)、ZONE_NORMAL(16~896M)和ZO
linux驱动程序开发-第五节:用户空间与内核空间数据交换
  资料链接:   ============================================================================================ 1. 驱动设计 #include <linux/init.h> #include <linux/kernel.h> #include <lin...
Linux内核和用户空间数据交换的几种方法
内核启动参数(单向):定义一个分析参数的函数,用_setup注册到内核中模块参数与sysfs(双向)sysctl(双向)系统调用(双向)Netlink(双向):简单高效,广播特性procfs(双向):一般用于少量的数据信息seq_file(单向)Debugfs(双向):内核开发者调试使用,仅用于简单类型的变量处理Relayfs(双向):复杂,但功能强大  ...
用户空间的虚拟地址如何转换得到实际的物理地址
思路: 进程号是一个进程在用户空间的唯一标示,所以,根据pid可以从内核中得到一个进程的所有信息, 另外就是知道虚拟地址就可以通过内核物理地址映射到虚拟地址的逆运算就可以还原他的实际物理地址 以上便是虚拟地址转换成所对应的实际物理地址的思路。 大致的代码编写流程: 首先根据pid我们可以得到这个进程的task_struct,进而通过task_struct得到mm,通过mm得到pgd。
内核和用户空间的消息传递-异步通知 (1)
背景: 当内核空间的驱动收发数据需要通知用户空间时,有以下几种方法: 1.异步通知机制:/* 异步信号处理函数 */ signal(SIGIO, logic_PCMHandler); /* 设置驱动绑定对应的异步通知发生器 */ encoder_index = m31_GetEncodeIndex(); logic_SetDeviceIndex(encoder_
c++几种内存的分配
一、启动一个进程时,系统会分配4G的虚拟内存,1G的内核空间+3G的用户空间,如图:在用户空间的数据段中,又分为常量区和静态存储区,在静态存储区中又分为初始化区和未初始化区,如图:线程是在用户空间的栈中分配如图:二、文件IO的内存是由文件描述符表+文件表项+i节点构成如图:三、系统的虚拟内存和物理内存之间的地址映射是通过内存管理单元去完成的如图:...
内核的几种内存分配与线性映射方式
1. 内核中获取内存的几种方式       a) 通过伙伴算法分配大片物理内存(分配 【物理页框】)    alloc_pages(gfp_mask, order): 获得连续的页框,返回页描述符地址,是其他类型内存分配的基础。    __get_free_pages(gfp_mask, order): 获得连续的页框,返回页框对应的线性地址。线性地址与物理地址是内核直接映射方式。不能用