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

【Linux 内核 内存管理】mmap 系统调用源码分析 ① ( mmap 与 mmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )

文章目录 一、mmap 与 mmap2 系统调用 二、Linux 内核中的 mmap 系统调用源码 一、mmap 与 mmap2 系统调用 ---- mmap 创建 " 内存映射 " 的 系统调用 有...2 种实现 , mmap 和 mmap2 ; 2 者区别是 : mmap 偏移单位是 " 字节 " , mmap2 偏移单位是 " 页 " , 但是在 arm 64 体系架构中 , 没有实现 mmap2..., 只实现了 mmap 系统调用 ; 二、Linux 内核中的 mmap 系统调用源码 ---- arm64 架构体系中 , 使用 mmap 系统调用 创建 " 内存映射 " , 调用 mmap 系统调用函数..., 执行如下操作 : 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移不是内存页大小的整数倍 , 返回 -EINVAL 错误 ; 如果偏移是内存页大小的整数倍 , 则调用...sys_mmap_pgoff 函数 , 继续向下执行 ; mmap 系统调用代码如下 : SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user

10.6K40

系统调用mmap的内核实现分析

也就是说,该内存段就是操作系统为mmap系统调用新分配出来的区域。 由pmap的输出可以看到,该内存段的大小是4kb,实际物理内存占用(rss)是0。 实际物理内存占用为什么是0呢?...看下mmap系统调用对应的内核源码: // arch/x86/kernel/sys_x86_64.c SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned...return addr; } 该方法先用宏PAGE_ALIGN,使len大小page对齐,在最开始的源码中,我们指定的len大小为1,page对其后为4096,即4kb,这也是为什么pmap输出的内存段大小为...其实,操作系统为进程分配的内存段都是以page为单位的。 之后,该方法又调用了get_unmapped_area来获取mmap的内存段的起始地址,这个方法就不详细看了。...由上可以看到,mmap系统调用只是为当前进程分配并初始化了一个vma实例,用来标识该进程拥有这段以vma表示的内存空间,并没有实际分配物理内存。 对此感兴趣的朋友也可以去读读相关的内核源码。 完。

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

    内核系统调用的实现和互斥机制

    有感于最近在知乎看到了两个问题,分享一下对内核系统调用的实现和互斥机制的认识。...两个问题分别是问了TCP/IP协议和epoll的实现中,内核是否使用了多线程。...但是系统调用的实现中,是不涉及多线程的概念的。操作系统本质上是对底层的资源进行管理并封装了底层的能力,对上层提供服务。...:"ir" (i), "m" (v->counter)); } 如果单核的情况下,非抢占式的则不需要这种机制,因为在执行系统调用的时候,进程调度器是不会调度其他进程执行的,这就保证了系统调用的原子性...如果在抢占式模式下并且支持在执行系统调用时被抢占,那么还是需要互斥和原子机制的,总而言之,存在竞态情况的,都需要保证共享数据的互斥访问。

    74220

    系统调用和库函数的区别

    前言 从用户的角度来看,系统调用和库函数似乎没有什么区别,它们都是以C函数的形式出现,并且两者都为应用程序提供服务。但从实现者角度来看,它们之间是有根本的区别。那么,它们之间到底有哪些不同呢?...区别 系统调用通常不可替换,而库函数通常可替换 普通的库函数调用由函数库或用户自己提供,因此库函数是可以替换的。...内核调用都返回一个整数值,而库函数并非一定如此 在内核中,整数或0表示系统调用成功结束,而负数表示一个出错条件。...POSIX 标准针对库函数而不是系统调用 判断一个系统是否与POSIX需要看它是否提供一组合适的应用程序接口,而不管其对应的函数是如何实现的。因此从移值性来讲,使用库函数的移植性较系统调用更好。...总结 系统调用与库函数有联系也有区别,但是通常情况下,会建议使用库函数,主要出于以下几个方面的考虑: 双缓冲技术 移植性 系统调用本身性能缺陷

    2.6K21

    Linux动态为内核添加新的系统调用

    本文的主题依然不是劫持系统调用,而是添加系统调用,并且是动态添加系统调用,即在不重新编译内核的前提下添加系统调用,毕竟如果可以重新编译内核的话,那实在是没有意思。...我的问题是: Linux系统中如何获取以及修改当前进程的名字??...至于说为什么系统调用号必须是逐渐递增的,请看: callq *-0x7e9b2c40(,%rax,8) 上述代码的含义是: call index * 8 + disp32_offset 这意味着内核是按照数组下标的方式索引系统调用的...text被copy到了新的页面,因此最好不要调用内核函数。...封堵模块加载的接口即可咯,反正不加载内核模块,谁也别想看到当前系统的内核被hack成了什么样子,哦,对了,把/dev/mem的mmap也堵死哦... ....不过这是下面文章的主题了。

    1.8K30

    Linux内核设计与实现(进程管理、进程调度、系统调用)

    1、虚拟处理器、虚拟内存:让进程感觉自己拥有所有 image.png 2、进程上限,cat /proc/sys/kernel/pid_max 3、进程的五种状态 image.png set_task_state...(task,state); 4、每个进程都有一个父进程 image.png 5、进程的创建:fork() exec() image.png 6、写时拷贝COW image.png 7、线程和进程的区别不大...image.png 8、孤儿进程,父进程先关掉,再设置一个父进程,如果没有,设置init image.png 9、2.6内核后进程调度算法CFS:完全公平调度算法 10、进程分为IO消耗型和处理器消耗型...image.png image.png 13、与调度相关的系统调用 image.png 14、系统调用在用户空间进程和硬件设备之间添加了一个中间层 image.png 15、中断 image.png...18、加锁 image.png 19、定时器与时间管理 20、slab?? 21、虚拟文件系统:VFS 22、IO调度 23、页高速缓存和页回写

    1.4K10

    探索操作系统:内核、启动和系统调用的奥秘

    因此,内核作为应用连接硬件设备的桥梁,应用程序只需关注与内核的交互,而不需关心硬件的细节。...现代操作系统的内核通常提供以下四个基本能力:进程和线程管理,决定CPU的使用;内存管理,决定内存的分配和回收;硬件设备管理,为进程和硬件设备提供通信能力;系统调用,作为用户程序与操作系统之间的接口。...UNIX程序是由执行特定操作或其他操作的代码组成的,并通过系统调用来提供某些服务。相比之下,Windows系统中的应用程序通常是事件驱动的。主程序会等待特定事件的发生,然后调用相应的程序进行处理。...操作系统会调用处理器来处理这些事件,更新屏幕并更新程序的内部状态。这种设计风格与UNIX系统有所不同。总的来说,系统调用可以被看作是一个办事大厅,无论你的应用程序要做什么,都必须通过系统调用来完成。...内核是操作系统的核心,负责管理进程和线程、内存、硬件设备以及提供系统调用接口。计算机启动过程中,ROM负责加载并执行BIOS程序,而RAM用于存储运行中的程序和数据。

    37510

    Linux中的主要系统调用

    Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。...有个系统调用waitpid,父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就知道子进程运行完了没有,成功与否。在操作系统中,每个进程都有自己的内存,互相之间不干扰,有独立的进程内存空间。...每个特定的系统调用对应了至少一个 Glibc 封装的库函数,比如说,系统提供的打开文件系统调用 sys_open 对应的是 Glibc 中的 open 函数。...有时候,Glibc 一个单独的 API 可能调用多个系统调用,比如说,Glibc 提供的 printf 函数就会调用如 sys_open、sys_mmap、sys_write、sys_close 等等系统调用...也有时候,多个 API 也可能只对应同一个系统调用,如 Glibc 下实现的 malloc、calloc、free 等函数用来分配和释放内存,都利用了内核的 sys_brk 的系统调用。

    3400

    库函数和系统调用的区别和联系

    1.在概念对比中,可以直观的感触到系统调用是依赖于操作系统的,由于其依赖于平台,所以系统调用的平台移植性较差。...2.而函数库,是将一些已经编写好函数进过封装,存放到函数库(静态库或动态库)中,是具有特定功能函数的集合。 通过库文件向程序员提供相关的函数,以便于调用。...对比 库函数 系统调用 移植性 平台移植性好 依赖于内核,不保证移植性 执行区域 用户空间 内核空间 开销 属于过程调用,开销小 需要中断,在用户空间和内核空间进行切换开销大 数量 库函数数量较多 系统调用较少...而系统调用是操作系统的一部分,是内核提供给用户的程序接口,运行在内核空间中,而且许多的库函数都会使用系统调用实现功能,如在linux下C中的fopen、fclose、fwrite等文件操作函数其底层就是通过...没有使用系统调用的库函数,执行效率通常比系统调用高。因为使用系统调用时,需要通过中断进行上下文的切换以及由用户态向内核态的转移。

    89120

    从内核角度分析 listen() 系统调用的 backlog 参数作用

    编写服务端程序时,需要调用 listen() 系统调用来开始监听请求连接,listen() 系统调用的原型如下: int listen(int sockfd, int backlog); 可以看到,listen...() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...其中 max_ack_backlog 字段就是用于保存最大接收连接队列的长度,至此 listen() 函数的工作就完成了,那么内核在哪里限制接收连接队列的呢?...内核限制TCP连接队列 当网卡接收到数据时,会接收到数据包并封装成 sk_buff 对象,如果接收到的数据包是一个 TCP协议 的数据包,那么内核将会把数据包提交给 tcp_v4_rcv() 函数处理。

    1.1K20

    从内核角度分析 listen() 系统调用的 backlog 参数作用

    编写服务端程序时,需要调用 listen() 系统调用来开始监听请求连接,listen() 系统调用的原型如下: int listen(int sockfd, int backlog); 可以看到,listen...() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...其中 max_ack_backlog 字段就是用于保存最大接收连接队列的长度,至此 listen() 函数的工作就完成了,那么内核在哪里限制接收连接队列的呢?...内核限制TCP连接队列 当网卡接收到数据时,会接收到数据包并封装成 sk_buff 对象,如果接收到的数据包是一个 TCP协议 的数据包,那么内核将会把数据包提交给 tcp_v4_rcv() 函数处理。

    1.3K10

    【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

    文章目录 一、闭包中调用 Groovy 脚本中的方法 二、owner 与 delegate 区别 三、闭包中调用 Groovy 对象中的方法 一、闭包中调用 Groovy 脚本中的方法 ---- 在 Groovy...fun() } closure() 执行上述 Groovy 脚本结果如下 : fun 二、owner 与 delegate 区别 ---- 在 Closure 闭包中 , 其 owner 就是创建闭包时所在的环境..., 这是无法改变的 ; 但是 Closure 闭包对象的 delegate 成员是可以修改的 ; 三、闭包中调用 Groovy 对象中的方法 ---- 在闭包中 , 可以直接调用 Groovy 脚本中定义的方法...; 但是如果想要在闭包中 , 调用实例对象的方法 , 就必须设置闭包的 delegate 成员 ; 如下代码中 , 想要在闭包中 , 调用 Test 对象的 fun 方法 , 在执行闭包之前 , 必须将...} } // 闭包中不能直接调用 Test 对象中的方法 // 此时可以通过改变闭包代理进行调用 def closure = { fun() } closure.delegate = new

    3.1K20

    【Android 逆向】Android 进程注入工具开发 ( 系统调用 | Android NDK 中的系统调用示例 )

    文章目录 一、系统调用 二、Android NDK 中的系统调用示例 一、系统调用 ---- 在 " 用户层 " , 运行的都是用户应用程序 ; 用户层 下面 是 驱动层 , 驱动层 下面是 系统层 ,...最底层是 BIOS ; 系统层 包含 系统内核 ; 层级从上到下 : 用户层 | 驱动层 | 系统层 | BIOS ; 上述 4 层之间 , 不可以直接跨越 , 应用想要读取 驱动 / 内核 的数据是不被允许的...; 整个应用进程的控制权此时就交给了 驱动层 / 系统层 , 在这些底层具体执行了哪些操作 , 应用层是不知道的 ; arm 架构的 CPU 中软中断指令是 SVC ; x86 架构的 CPU 中软中断指令是...int ; 与 软中断 相对应的是 硬中断 ; 硬中断 是由 硬件产生 ; 二、Android NDK 中的系统调用示例 ---- 系统调用相关的头文件定义在 D:\Microsoft\AndroidNDK64...\android-ndk-r16b\sysroot\usr\include\asm-generic\unistd.h 文件中 ; 在该文件中定义了所有的系统调用 ; #include <asm/bitsperlong.h

    1.6K10

    【Linux】解析 ,总结画图演示【系统调用与库函数的根本区别】

    】 1.用户缓冲区方面: 刷新: 把数据从C语言缓冲区写入操作系统 我们日常中使用最多的,就是C/C++提供的语言级别的缓冲区 而像一些系统调用,例如write()就没有使用C语言的缓冲区 2.文件缓冲区方面...: 而文件缓冲区,属于操作系统层面,存在于FILE结构体中; 无论读写都要把数据加载到文件缓冲区中 3.内核缓冲区方面 文件系统的缓冲区属于内核缓冲区的一种 我们在应用层进行数据的读写本质, 是将内核缓冲区中的数据进行来回的拷贝...三.总结画图演示【系统调用与库函数区别】: 系统调用直接到文件缓冲区一步到位 库函数还要经过用户缓冲区 四.样例模型演示 1.现象演示——引出原理 我们打印一段代码 #include 系统调用)。...write的打印不属于进程了,也就不会发生对于用户缓冲区内容的写时拷贝 我们回顾下面模型,可以看看两者区别

    14710

    什么是系统调用?

    而后者其实才是真正的准确意义上的系统调用,由内核提供的服务,姑且称之为狭义的系统调用。 系统调用的封装函数其实是glibc实现的,而真正的系统调用是内核中的实现。看到这里你可能有点凌乱了。...微内核即Microkernel(简写:μ-kernel)提出时间比单内核要晚,在学术界而言无疑是初生的朝阳。...但问题也显而易见,那就是大量的IPC,性能必然受影响。 微内核的思想其实和后来大型分布式系统中SOA、微服务的概念不谋而合。然而历史却并不相似,站在二十一世纪的第三个十年回望,Linux成功空前。...图片来自网络 系统调用与软中断 好了,我们已经大概知道了什么是用户态,什么是内核态。那么这和系统调用又有什么关系呢?...在运行软中断指令的时候,会用一个寄存器来存储具体的系统调用号,比如在Linux上read和write的系统调用号分别为0和1。 单内核与微内核上的系统调用有什么不同呢?

    1.6K30

    Camera系统 | OpenCamera在camx架构中的调用

    \camx\src\core\hal\camxhal3.cpp 于是到了真正调用的函数中, 开头没什么好说的,看上去就是assert一些必要的信息是否完整 接下来看,注释还是写得比较清楚的 568...m_ChiAppCallback进行调用,根据上一篇的初步理解,CHI模块应该是与Camx对接的,厂商自定义的代码,这里和App扯上关系不太明白是为什么,并且还是一个callback。...库,并通过dlsym映射出CHI部分的入口方法chi_hal_override_entry,并调用该方法将HAL3Module对象中的成员变量m_ChiAppCallbacks(CHIAppCallbacks...,这样CamX后续就可以通过这个成员变量调用到CHI中方法,从而保持了与CHI的通讯。”...m_ChiAppCallbacks来调用CHI中的函数了 回到ProcessCameraOpen函数中,这句调用终于理顺了 \vendor\qcom\proprietary\camx\src\core

    2.1K42

    操作系统内核之争

    3、从fork实现看宏内核和微内核的区别 两个系统的内核是通过进程的创建FORK的实现来比较,因为进程的创建涉及到系统调用,内存管理,文件管理等系统的主要方面.因此通过比较FORK的实现可以大致看到内核的差别...微内核的代表:Minix 在Minix中,操作系统的内核,内存管理,系统管理都有自己的进程表,每个部分的表包含了自己需要的域。...在Minix创建新进程的过程中,可以看到一个很大特点,就是整个系统按功能分成几个部分,各模块之间利用消息机制通信,调用其他模块的函数必须通过目标模块的守护进程调用....Minix与Linux创建新进程的过程比较可以看出二者之间的区别,Minix是建立在分模块之上的,模块之间以信息传递联系。...宏内核与微内核的区别也就在这吧,微内核是一个信息中转站,自身完成很少功能,主要是传递一个模块对另一个模块的功能请求,而宏内核则是一个大主管,把内存管理,文件管理等等一股脑全部接管。

    2.9K60

    frida反射调用对象中的方法与字段

    该篇文章主要介绍当我们碰到参数或者返回值是一个对象时,如何通过frida反射调用该对象的方法(methods)与获取该对象的字段(fields) 添加测试frida反射调用的demo app 写一个测试类...,其中包含字段(fields)int类型的count、String类型的plainText 及多个简单方法。...其中display方法参数为ParametersTest对象, 在文中,我们要hook display方法并hook它的参数ParametersTest对象反射调用ParametersTest对象的所有方法及打印...name is: " + (field.getName())); send("field value is: " + field.get(val1)); }) } 结果如下: frida反射调用类中的方法.../打印方法参数 send(val1ClassName + "." + methodName + " and args is: " + args); //调用方法

    4.4K20
    领券