LOWMEM,是相对于HIGHMEM而言,其实就是内核态直接映射的物理内存空间的大小,一般为896MB。

这里只是粗略地估计了一下,取1GB。

LOWMEM_PAGES代表了LOWMEM区域对应了多少内存页,1GB / 4KB = 256K,即需要256K个页表项来描述内核空间

   1: /* Number of possible pages in the lowmem region */

   2: LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT)

 

计算一下,需要多少内存页来存放LOWMEM区域对应的内存页表项,有256个页表,每个页表占1页内存,需要256页,即256 * 4KB = 1MB来存放256个页表

   1: /* Enough space to fit pagetables for the low memory linear map */

   2: MAPPING_BEYOND_END = PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT

其中,PAGE_TABLE_SIZE用来计算需要多少个页表来容纳这么多的页, 256K / 1K = 256,需要256个页表

   1: #if PTRS_PER_PMD > 1

   2: #define PAGE_TABLE_SIZE(pages) (((pages) / PTRS_PER_PMD) + PTRS_PER_PGD)

   3: #else

   4: #define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD)

   5: #endif

下面的计算与上面是相同的, INIT_MAP_SIZE也是1MB

   1: /*

   2:  * Worst-case size of the kernel mapping we need to make:

   3:  * a relocatable kernel can live anywhere in lowmem, so we need to be able

   4:  * to map all of lowmem.

   5:  */

   6: KERNEL_PAGES = LOWMEM_PAGES

   7:  

   8: INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES) * PAGE_SIZE

   9: RESERVE_BRK(pagetables, INIT_MAP_SIZE)

RESERVE_BRK的作用是在.brk区域预留1MB大小的空间,并且设置pagetables为该区域的起始位置的标号名称。

   1: /*

   2:  * Reserve space in the brk section.  The name must be unique within

   3:  * the file, and somewhat descriptive.  The size is in bytes.  Must be

   4:  * used at file scope.

   5:  *

   6:  * (This uses a temp function to wrap the asm so we can pass it the

   7:  * size parameter; otherwise we wouldn't be able to.  We can't use a

   8:  * "section" attribute on a normal variable because it always ends up

   9:  * being @progbits, which ends up allocating space in the vmlinux

  10:  * executable.)

  11:  */

  12: #define RESERVE_BRK(name,sz)                        \

  13:     static void __section(.discard.text) __used notrace        \

  14:     __brk_reservation_fn_##name##__(void) {                \

  15:         asm volatile (                        \

  16:             ".pushsection .brk_reservation,\"aw\",@nobits;" \

  17:             ".brk." #name ":"                \

  18:             " 1:.skip %c0;"                    \

  19:             " .size .brk." #name ", . - 1b;"        \

  20:             " .popsection"                    \

  21:             : : "i" (sz));                    \

  22:     }

Linux的初始页表的更多相关文章

  1. Linux kernel 内存 - 页表映射(SHIFT,SIZE,MASK)和转换(32位,64位)

    0. Intro 如下是在32位下的情况,32位下,只有三级页表:PGD,PMD,PTE 在64位情况下,会有四级页表:PGD,PUD,PMD,PTE 但是原理基本上是一样的,本文主要是想记录一下页表 ...

  2. Linux系统初始流程

    一.0S(内核的功能):平台类软件(通用软件) 进程管理:进程调度器(scheduler)维持一个任务结构(task_struct) 内存管理:如何使用线性地址空间,如何分段,如何分页,如何避免内存( ...

  3. linux --- 1.初始linux

    一.计算机简单认识 1.服务器的硬件 ①输入单元:键盘,鼠标,读卡器,触摸屏,手写板 ②主机部分:主板,cpu,显卡,内存条,硬盘,网卡,声卡,电池,散热器 ③输出单元:显示器,打印机 2.内存,cp ...

  4. Linux 分区初始化为物理卷,把物理卷加入卷组

    用到的命令有 1.pvcreate (physical volume create) 2.vgcreate (volume group create) 例子1:创建物理卷 pvcreate /dev/ ...

  5. Linux知识--初始linux

    从今天开始陆续分享Linux的知识 因为服务器基本是Linux的 所以Linux不学明白  Shell命令不熟  会让你的办事效率大打折扣. 一.Linux文件系统 Linux文件系统是从Unix结构 ...

  6. Linux 服务器初始配置步骤

    1.IP配置 vim /etc/sysconfig/network-scripts/ifcfg- BOOTPROTO=dhcp 改成 static ONBOOT=no 改成 yes 添加 IPADDR ...

  7. Linux - root初始密码设置

    Ubuntu刚安装后,不能在terminal中运行su命令,因为root没有默认密码,需要手动设定. 以安装ubuntu时输入的用户名登陆,该用户在admin组中,有权限给root设定密码. 给roo ...

  8. Linux系统初始配置标准化

    Inux系统标准化 配置环境:4台Centos7.6版本的虚拟机,刚刚最小化安装完成,未作任何操作,分别是node1.node2.node3.node4 本文打算利用ansible工具对这四台虚拟机进 ...

  9. linux内存管理解析1----linux物理,线性内存布局及页表的初始化

    主要议题: 1分页,分段模式及实模式 2Linux分页 3linux内存线性地址空间布局及物理内存空间布局 4linux页表初始化及代码解析 1.1.1内存寻址和保护模式 在X86平台上,内存控制单元 ...

随机推荐

  1. ROS录制主题和放

    1.按照指定名称录制指定主题, 如录制主题为line_markers,名称为line_extraction的bag包. rosbag record -O line_extraction.bag /li ...

  2. 《一头扎进》系列之Python+Selenium框架实战篇7 - 年底升职加薪,年终奖全靠它!Merry Christmas

    1. 简介 截止到上一篇文章为止,框架基本完全搭建完成.那么今天我们要做什么呢????聪明如你的小伙伴或者是童鞋一定已经猜到了,都测试完了,当然是要生成一份高端大气上档次的测试报告了.没错的,今天宏哥 ...

  3. jquery实现的ajax

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEnco ...

  4. 用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目

    目录 目录 前文列表 重构目录结构 重构代码 使用蓝图后的路由过程 总结 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World ...

  5. c# networkcomms 3.0实现模拟登陆总结 转载https://www.cnblogs.com/zuochanzi/p/7039636.html

    最近项目需要做一个客户查询状态系统,当前上位机缺少服务功能,于是找到了networkcomms 开源框架,作为项目使用. 最新版networkcomms 下载地址:https://github.com ...

  6. jquery 找到指定父级指定子集

    其中 closest() : jquery 1.3 新增 从元素本身开始,逐级向上级元素匹配,并返回最先匹配的元素. 其中 find() : 搜索所有与指定表达式匹配的元素.这个函数是找出正在处理的元 ...

  7. Ubuntu下实现Nginx+Tomcat实现负载均衡

    先说一下为什么写这个文章,在性能测试过程中,我们可能会关注很多指标,比如CPU.IO.网络.磁盘等,通过这些指标大致可以判断哪个环节遇到了性能瓶颈,但是当这些指标无法判断出性能瓶颈时,我们可能就需要对 ...

  8. 避开PCB假八层结构的温柔陷阱---浅谈六层板的叠层

    https://blog.csdn.net/qijitao/article/details/51505611 作者:王辉东   一博科技高速先生团队队员 在<PCB的筋骨皮>一文中,我们提 ...

  9. C. Ancient Berland Circus(三点确定最小多边形)

    题目链接:https://codeforces.com/problemset/problem/1/C 题意:对于一个正多边形,只给出了其中三点的坐标,求这个多边形可能的最小面积,给出的三个点一定能够组 ...

  10. Java并发编程教程

    Java是一种多线程编程语言,我们可以使用Java来开发多线程程序. 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU ...