linux内核相关视频解析:

linux内核文件系统具体实现与内核裁剪,含30道linux内核面试题
5个方面分析linux内核架构,让你对内核不再陌生

一、程序加载过程

我们程序是从磁盘中编码的,代码执行的时候,首先加载至内存中,然后到寄存器中(寄存器是存放各种给cpu计算用的地址、数据用的),最后至CPU;

二、内存映射

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的,进程就可以很方便地访问内存,也就是我们常说的虚拟内存虚拟内存。
根据地址范围的不同,我们分为32位和64位,一般我们见的比较多的就是32位操作系统,这里就都介绍一下;
虚拟内存被分为用户空间和内核空间两部分;这两个其实在权限上就有一定的区分了;当我们的进程在用户态的时候,只能访问用户空间;只有进入内核态,才能访问内核空间;
我们看一下32位地址和64位地址空间的分布:

这里会有一种错觉,我们每个进程都占有了这么多的空间,那么多个进程怎么办?事实上并没有那么多的空间,其实这个本质是就是一种“自欺欺人”的做法,每个进程都以为自己占据了全部的地址空间;其实只有在实际使用虚拟内存的时候,才会分配物理内存;
用户空间是每个进程私有的;内核空间是每个进程共享的,不与任何用户进程共享;
通过内存映射将虚拟内存地址映射到物理内存地址,对实际使用虚拟内存并分配的物理内存进行管理;

作用就是:只会将某一进程此刻需要的内存大小映射到物理内存,其它暂时不需要的内容交换到硬盘存储即可。当进程需要使用在硬盘中的内容或者需要动态申请内存时,操作系统会利用缺页操作,触发一次内存映射,将另外的物理内存映射进虚拟内存,供程序使用,这样对于进程而言,则认为内存总是够用的。
各个进程均拥有3G虚拟内存,那么操作系统是如何做到各进程所使用的实际物理内存不会互相占用呢?实际上,各个进程均有自己的内存映射表。任意一个时刻,在一个CPU上只有一个进程在运行。所以对于此CPU来讲,在这一时刻,整个系统只存在一个4GB的虚拟地址空间,这个虚拟地址空间是面向此进程的。当进程发生切换的时候,虚拟地址空间也随着切换。由此可以看出,每个进程都有自己的虚拟地址空间,只有此进程运行的时候,其虚拟地址空间才被运行它的CPU所知。在其它时刻,其虚拟地址空间对于CPU来说,是不可知的。所以尽管每个进程都可以有4
GB的虚拟地址空间,但在CPU眼中,只有一个虚拟地址空间存在。虚拟地址空间的变化,随着进程切换而变化。

内存映射原理:

虚拟内存映射到物理内存地址,内核为每一个进程维护了一张表,记录了他们对应的映射关系;
而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
Linux采用了四级页表来管理内存页,多级页表就是把内存分成区块来管理,将原来的映射关系改成区块索引和区块内的偏移。由于虚拟内存空间通常只用了很少一部分,那么,多级页表就只保存这些使用中的区块,这样就可以大大地减少页表的项数。

【文章福利】需要C/C++ Linux服务器架构师学习资料加群812855908(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等)

三、虚拟内存空间分布

虚拟地址空间0~3G用于用户层 虚拟地址空间3~4G用于内核层
这个图可能是我们见过最到的了

地址空间保存的数据:
栈:保存局部变量、函数形参、自动变量。数据具有先进先出、后进后出的特 点;
堆:保存由malloc、ralloc、calloc分配空间的变量。
BSS段:保存未初始化或初始化为0的全局变量和静态局部变量。
data段(数据段):保存初始化不为0的全局变量或者static修饰的变量。
代码段:保存代码、可执行代码、字符串字面值、只读变量;

详解linux虚拟内存原理相关推荐

  1. 详解Linux运维工程师打怪升级篇

    详解 Linux 运维工程师打怪升级篇 积累经验篇 做运维也快4年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师 是从一个呆逼进化为苦逼再成长为牛逼 ...

  2. linux下sort命令使用详解---linux将文本文件内容加以排序命令

    转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...

  3. 详解Linux内核之双向循环链表 By邪恶八进制

    [转载]详解Linux内核之双向循环链表 详解Linux内核之双向循环链表 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 摘要:      本文详解了内核中面向对象的list ...

  4. 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

    @TOC初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程 [1]什么是windows API Windows API 中文翻译过来就是windows应用程序接口(Applica ...

  5. 多维度详解redis以及原理实现,结构与应用分析

    6个方面了解redis应用及其实现原理 1.redis数据存储概述 2.string结构以及应用 3.list结构以及应用 4.hash结构以及应用 5.set结构以及应用 6.zset结构以及应用 ...

  6. 详解linux下auto工具制作Makefile源码包(制作篇)

    2019独角兽企业重金招聘Python工程师标准>>> 详解linux下auto工具制作Makefile源码包(制作篇) 水木杨 一.     概述 为了更好的制作configure ...

  7. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  8. linux 服务器拦截http请求,详解Linux屏蔽浏览器上http请求警报的方法

    众所周知,在Linux系统中浏览器的页面上是不允许出现http请求的,如果出现了http请求就会发生错误,并且Linux系统会向用户发出警报.下面,U大侠小编就给大家详解Linux屏蔽浏览器上http ...

  9. linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)

    linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...

最新文章

  1. linux 重启udev服务,Linux 7.x 中 UDEV 生效的方法
  2. 经典C语言程序100例之二一
  3. freebsd mysql.so,MySQL_配置FreeBSD的网关和网络服务,出现如下提示时就可以开始网 - phpStudy...
  4. 【转】Dynamics 365中的应用程序介绍
  5. server_u文件服务器已停止,Serv-U停止服务怎么解决
  6. Matlab符号数学(Symbolic Math with MATLAB)MATLAB解方程
  7. 梦想与现实之间的距离
  8. 就地链表反转_数据结构与算法系列之链表操作全集(二)(GO)
  9. 关于哈希表,你该了解这些!
  10. STM32F0xx_TIM基本延时配置详细过程
  11. infortrend ESDS RAID6故障后的数据恢复方案
  12. CentOS 下安装配置mongodb
  13. 使用阿里云code和git管理项目
  14. 马哥linux脚本,马哥linux shell笔记
  15. 开博第一篇,为什么要开通博客,开通博客的申请理由
  16. MIUI11Android系统耗电,小米MIUI系统升级11,网友表示很费电,学习这个省电方法够你用三天!...
  17. PR剪辑-电子相册学习笔记
  18. c++中x的y次方怎么求
  19. 指南-Luat二次开发教程指南-功能开发教程-功耗管理
  20. java将占位符替换成指定字符串的函数

热门文章

  1. eclipse 各个版本号的含义和下载
  2. 2018大公司面试分享(百度,京东,搜狗,小米等)
  3. k8s集群节点无法创建pod解决:错误提示(Docker error : “/sys/fs/cgroup/memory/xxxx“ “no space left on device“)
  4. HDU4870 Rating(高斯消元)
  5. Linux下的无盘 Win98
  6. 如何使用React Image Lightbox
  7. NVD视频解码器SDK使用、大华视频解码器SDK使用
  8. V4L2框架-v4l2 device
  9. 微信早教小程序源码开发设计方案
  10. 按采购单收货反冲后找不到采购单