首先看一个问题: 
Linux has both find_vma_prev and find_vma routines. find_vma_prev returns both the current and previous VMAs. Therefore, find_vma could be written as a simple layer routine over find_vma_prev that discards the pointer to the previous VMA. Give one reason why Linux goes to the trouble of providing two separate full-blown routines. 
那么问题的答案是什么呢?如果按照应用程序的编程观点,能封装的就封装,能重用的尽可能重用,linux内核的设计就是一种糟糕的设计,根本不符合应用程 序的设计原则,其实要明白内核的设计和应用的设计在原则上是根本不同的,比如应用程序能利用丰富的异常处理机制,几乎每个编程语言都有这样的机制,最著名的莫过于try-catch块了,但是到了内核一切都要小心翼翼,为何对内核这样苛刻呢?原因有:1.内核根本就不是让用户用的;2.内核在原则上不能占 用太多的资源;3.内核的开发者默认都是非常有实力的;4.内核的作用是非常不灵活的,它存在的意义就那么几点:内存管理;进程管理;文件管理;...管 理。从这几点原因来看内核根本不能被娇惯,反过来说应用程序却是被内核娇生惯养的,内核要帮忙处理应用程序自己处理不了的错误(谁能帮内核处理呢?难道硬件吗?),应用程序的开发者鱼龙混杂,比如我就是一个菜鸟,另外应用程序的内容十分丰富,逻辑有的十分复杂,各个应用之间的差别非常之大(比如cpu消耗 型和io消耗型,大型人工智能程序和web服务器。内核呢?windows和linux包括unix的机制并没有多大不同,都是向上提供那么几种服务,向 下与硬件接口,只是实现不同罢了)。因此不要用应用程序的原则来要求内核。 
既然知道了内核和应用的原则差别,那么开始的问题就比较好回答了,内核在非必要情况下绝对不会提供冗余函数,具体的冗余由用户应用程序来设置和重组,库函数经常这么干。这是为什么呢?用户程序强调维护,因此它过分强调接口,程序员只需要和接口打交道,这样我们编码的人就会更多的关注应用逻辑而不必关注接口 的实现,毕竟应用程序的卖点就是它的应用逻辑;但是内核就不同了,它就是一个二传手,可以说是一个代理,向上为用户展示了一个多道程序设计的机器,内部包含多个虚拟机器,并且管理着这多么台虚拟机,向下与硬件接口,将应用程序的要求转交给硬件,并代理硬件向应用程序传送结果,内核也就是这么多事情。举个例 子,我们都去过饭店,为我们服务的就是服务员,如果说哪家饭店的服务员比顾客多的话,那么多半是对这家饭店的侮辱,顾客应该比服务员多,而服务员的任务就是向上为顾客服务,向下与厨师接口,仅此而已。操作系统内核就是服务员,而应用程序就是顾客,厨师就是硬件,这个例子还算清晰。只要有个冗余,那么就要占 用一定的资源,好的内核根本不会也不允许其本身占用过多的资源,因此只要在内核中出现的函数就是必要的,非必要的冗余函数一定会被砍掉,因此问题中的 find_vma和find_vma_prev绝对是两个必要的函数,其功能是不同的,它们是不冗余的,下面就看一下它们: 
struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)

{

本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274040

从find_vma和find_vma_prev看内核相关推荐

  1. 从猫蛇之战三看内核戏CPU

    庐山归来,终于有些空闲,见缝插针,今天赶紧把没有写完的"猫蛇之战"补齐. 如果没有读过前两篇或者想复习一下的,请点击: 从猫蛇之战看内核戏CPU 从猫蛇之战再看内核戏CPU 先说明 ...

  2. 从猫蛇之战再看内核戏CPU

    连续写了几天的代码,有些疲倦,吃过晚饭,换个工作方式,继续和大家聊猫蛇之战. 蛇不仅丑陋,而且可能伤人害命,是邪恶的象征.猫与蛇战,代表着讨伐奸邪,是正义之战.猫与蛇战,技艺娴熟,举重若轻,叫人拍手叫 ...

  3. android 关于adb以及截屏,录屏 ,关机 ,重启,查看进程 ,看内核,查看应用使用的内存信息

    adb shell ps 查看当前手机所有运行的进程状态 F:\MyApplication2>adb shell ps USER PID PPID VSIZE RSS WCHAN PC NAME ...

  4. linux vma,内存管理 – Linux内核API find_vma

    find_vma函数功能描述:find_vma( )函数根据一个属于某个进程的虚拟地址,找到其所属的进程虚拟区间,并返回相应的vma_area_struct结构体指针. find_vma文件包含 #i ...

  5. 用VSCODE看linux内核代码

    前言 使用VSCODE在看内核代码时一定会出现如下几种情况: 跳转等半天 跳转出现错误 跳转时出现N多定义 目录结构繁杂,找文件困难等等 通过settings.json屏蔽的方式 该方式比较方便,但是 ...

  6. 看菲菲详解如何快速获取linux命令帮助

    man 命令手册         man commond 打开命令的使用手册,既然是手册都应该存放文档的地方,一般都是压缩文件         用man打开某个文件时通常会有以下几部分: NAME A ...

  7. linux 内核链表遍历宏 list_for_each_entry list_for_each_entry_safe

    看内核代码都会发现,内核链表的操作常用的二个宏list_for_each_entry和list_for_each_entry_safe 循序渐进,先从最底层的函数container_of 函数说起,其 ...

  8. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  9. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

最新文章

  1. MR-CNN网络结构
  2. 将浮点数限制为两位小数
  3. java maven centos7 yum安装
  4. [转] Ghost自动安装
  5. GPU Gems1 - 24 高质量的过滤
  6. python通讯录综合_Python通讯录作业
  7. 在Linux中的子进程是什么,什么父进程的东西在Linux中新创建的子进程中共享
  8. Spring-Logback-动态修改日志级别
  9. 代码文档生成工具-Doxygen生成CHM和RTF图文教程
  10. pycharm 调试教程
  11. 一个简单的Python自动投票
  12. 内存模型以及分区,需要详细到每个区放什么
  13. 常用软件版本查看Windows下
  14. java电影购票系统_Java Swing实现电影购票系统项目
  15. Nebula Graph 在企查查的应用
  16. 前端CSS样式去除body默认边距和a标签下划线去除和高亮显示问题
  17. OpenStack 2014 用户调查解析——中国部署规模仅次于美国
  18. 主机安全防护五大难点攻克
  19. C4DS22下载 Cinema4D S22下载安装教程
  20. 如何在ppt中剔除图片的背景精美ppt模板下载

热门文章

  1. Spring Boot 实现通用 Auth 认证的 4 种方式
  2. 面了一个 32 岁的程序员,一看就是“卷”出来的
  3. Java日志体系权威总结
  4. GET 和 POST请求的本质区别是什么?原来我一直理解错了
  5. 腾讯推出高性能 RPC 开发框架
  6. 初入职场的我怎么就成了个打杂的,我是这样破局的 No.146
  7. NLP入门必知必会(一):Word Vectors
  8. 2021谷歌学术指标出炉:CVPR总榜第4,仅次于Science,ECCV超过ICCV......
  9. 他24岁,4篇Nature在手,也会关心学不懂C语言怎么办
  10. 神经网络为何非激活函数不可?