zoukankan      html  css  js  c++  java
  • 深入理解Linux内核-内存寻址

    1、逻辑地址怎么转换为线性地址的:

    逻辑地址 = 段选择符(16bit)+偏移量(32bit)

    段选择符又三部分组成:index(索引序号)、T1(表指示器)、RPL(request privilege level 请求者特权级)

    索引序号:指向GDT(global descriptor table 全局描述符表)或者LDT(local descriptor table 局部描述符表)中的段描述符。

    表指示器:标记指向GDT或者LDT

    RPL:分为用户态(3),或者内核态(0)

    段描述符:64bit,主要字段 Base(段的首字节的线性地址 32bit)、Limit(段的长度)、DPL(描述特权级)等

    段描述符的地址 = GDT(LDT)的地址(存放在gdtr、ldtr寄存器) + index * 8(因为一个段描述符8字节)

    逻辑地址 = 段描述符中的Base + 偏移量

    注意:1、linux 中很少使用分段,它偏向是否分页
       2、主要的4个段分别为用户代码段、用户数据段、内核代码段、内核数据段
    3、并且它们的Base值均为0,即所有到段的线性地址都从0开始
    4、即Linux下逻辑地址的便宜量与对应的线性地址的值总是一致的       

    2、线性地址怎么转换为物理地址的?

    页 :4096个字节,包含页内地址、数据

    页框:物理页,4096字节,不含页内数据

    分页:为了效率,线性地址被分成以固定长度为单位的页;页内部连续的线性地址映射到连续的物理地址;优点是内核可以对页指定存取权限,而不用对页中的所有线性地址指定

    线性地址 = Directory(目录 10bit) + Table(页表 10bit) + offset(偏移量 12bit)

    offset: 12bit的偏移量就是一个页的大小,表示连续的4096个线性地址为一页

    扩展分页:页目录(10bit)+ offset (偏移量 22bit); 去掉了中间页表,每一页的大小为4MB



  • 相关阅读:
    LeetCode --- Roman to Integer
    LeetCode --- Maximum Depth of Binary Tree
    LeetCode --- Minimum Path Sum
    Hashkell 第一篇
    LeetCode --- Partition List
    LeetCode --- Valid Palindrome
    LeetCode --- Longest Consecutive Sequence
    LeetCode --- Insertion Sort List
    数据库lib7第2, 3题(创建索引和触发器)
    LeetCode --- Reverse Integer
  • 原文地址:https://www.cnblogs.com/lipeil/p/4637494.html
Copyright © 2011-2022 走看看