linux内核地址mapping

news/2024/7/20 14:00:31 标签: 数据结构与算法, 内存管理, 操作系统

linux内核采用页式存储管理,虚拟地址空间划分成固定大小的页面,由MMU(memory manager unit)在运行时将virtual address mapping to (或者说是变化成)某个物理内存页面中的地址;同段式存储管理相比,页式存储管理有不少的优势

  page size 固定 const,便于管理;

  当要将一部分物理空间的内容换到磁盘上的时候,在段式内存存储管理中要将整个段都换出(通常的每个段都是很大的);而在page storage manager中则是按页进行;

  页式存储管理与段式存储管理所要求的硬件支撑不同,一种CPU既然支撑页式存储管理,就无需再支持段式存储管理了,当i386很特殊,需特别对待;

  由于i386系列的历史演变过程,它对页式存储管理的支持是在其段式存储管理已经存在 相当的时间才发展起来的,i386程序不管程序 怎么写,一律对程序中石油的地址先进行段式mapping,再进行page math mapping;既然CPU的硬件结构如此这般,Linux内核也只好服从Intel;这样的双重映射起始是毫无必要的,也使mapping 的过程变的更加的复杂,不易理解;

总结真实的段式内存管理仅需在i386上实现,对于M68k,powerpc根本则不存在段式映射这一层,但请注意,不管是神马操作系统UNIX也不例外,只要在i386上的实现,就必须至少在实现上要先经过段式内存的mapping;

linux objdump实用工具时很有用的,可以用来实现反汇编binary;

保护模式下段寄存器format;

TI(table Indicator,0=GDT-global describe table,1=LDT-local..)

RPL-Request Privilge level;

Intel的涉及意图是用内核用GDT,其它的进程用其各自的LDT,最低2位RPL(Request Privilge level)为所要求的特权级别;

内核在建立一个进程时都要将其段寄存器设置好;

linux kernel基本上不使用局部描述表LDT,LDT只是在VM86模拟中运行wine以及其他在linux上模拟运行windows软件或dos软件的程序中财使用;

RPL(Request Privileges level) 内核为0级用户(process)为3;

/*

*This contains typically 140 quadwords,depending on NR_CPUS.

*

*NOE!Make sure the gdt descriptor in head.S matchs this if you change anything.

entry(gdt-global destributed table)

.quad NULL descriptor

段式映射(segment mapping)过程中所有进程全部都共用一个GDT global descriptor table;在页式映射机制mechanism每个进程都有其自身的page directory;

指向这个目录的指针保持在每个进程的mm_struct 数据结构中,每当调度schedule一个进程进入内核运行的时候,内核都要为即将运行的进程设置好控制

寄存器control register,而MMU的硬件则总是从CR3中取得指向当前页面目录的指针;CPU在执行程序时使用的是虚地址,而MMU硬件在进行映射时所用的则是物理地址;

static inline void switch_mm(struct mm_struct *prev,struct mm_struct *next,struct task_struct *tsk,unsigned cpu)

{

  .............

  asm volatile("movl %0,%%cr3": : "r" (__pa(next->pgd)));

}

在页式映射过程中,i386 CPU需要访问内存3次;

第一次是page directory

第二次是page table

第三次测试target;

虚拟存储的的高效实现有赖于高速缓存;

除常规的页式映射,为了能在linux内核上仿真运行段式存储管理的windows或dos软件,特别的提供了2个特殊的,与段式存储管理有关的系统调用;

modify_ldt(local descriptor table)(int func,void *ptr,unsigned bytecount)

此system call可以用来改变当前进程的局部段描述表,

在free software foundation下,除了linux外还有多个项目,其中一个叫"WINE",来源于"Windows Emulation",目的是在linux上仿真运行windows软件.

struct modify_ldt_ldt_s {

  unsigned int entry_number;

  unsigned long base_addr;

  unsigned int limit;

  unsigned int seg_32bit:1;

  unsigned int contents:2;

  unsigned int read_exec_only:1;

  unsigned int limit_in_pages:1;

  unsigned int seg_not_present:1;

  unsigned int useable:1;

}

从上可以看出此段式存储管理涉及到的系统调用无疑是在内核管理机制上挖了个洞!既然一个进程可以改变它的局部段描述表,同样也可以设法侵犯到其他进程或内核的空间

,但是只要不让用户进程掌握修改page dir and page table;

vm86(struct vm86_struct *info)

此系统调用用来在linux上模拟dos软件,i386 CPU专门提供了一种寻址方式VM86,用来在保护模式下模拟运行实模式(real-mode);

目的是为采用保护模式的系统(windows,os/2)提供与real-mode software(real dos)兼容性 compatibility;

linux内核中几个重要的数据结构和函数;

form hardware angle sayin:linux内核只要能 cable for hardware准备好页面目录PGD,页面表PT以及全局段描述表GDT和局部段描述表LDT,并正确地设置有关的寄存器,就完成了内存管理机制中地址地址映射部分的准备工作;

虽然最终的目的是地址映射,但是实际上内核所需要做的管理工作却是复杂很多.

在于内存管理有关的代码中有几个数据结构是很重要的,这些数据结构及其使用构成了代码中内存管理的基本框架

页面目录PGD,中间目录PMD和页面表PT分别是由pgd_t,pmd_t以及pte_t构成 的数组,而这些表项又都是数据结构

/**

*These are used to make use of C type-checking..

*/

#if CONFIG_X86_PAE physical address extension;

typedef struct {unsigned long pte_low,pte_high;} pte_t--指的是也表 ;

typedef struct {unsigned long long pmd;} pmd_t;

typedef struct {unsigned long long pgd;} pgd_t;

#define pte_val(x) ((x).pte_low | ((unsigned long long)|(x).pte_high << 32 ))

#else

 


http://www.niftyadmin.cn/n/1503928.html

相关文章

rancher k8s 使用 iscsi 存储

本文永久链接: https://www.xtplayer.cn/rancher/rancher-k8s-use-iscsi-storage/iSCSI 命名约定iSCSI 使用一种特殊、唯一的名称来标识 iSCSI 节点(目标或启动器)。此名称类似于与光纤通道设备相关联的全球名称 (WWN)&#xff0c;可作为一种通用的节点识别方式使用。iSCSI 名称…

python中星号变量的几种特殊用法

python中星号变量的几种特殊用法 不知道大家知不知道在Python中&#xff0c;星号除了用于乘法数值运算和幂运算外&#xff0c;还有一种特殊的用法"在变量前添加单个星号或两个星号"&#xff0c;实现多参数的传入或变量的拆解&#xff0c;本文将详细介绍"星号参数…

Jenkins中使用GitLab的配置

1. 概述 在Jenkins中从GitLab上拉取代码进行打包或测试。 2. 安装 Jenkins和GitLab默认已经安装好&#xff0c;安装过程此处不再赘述。 在Jenkins上安装Git和Gitlab插件&#xff0c;如下图&#xff1a; 3. 配置 3.1. 系统配置 Jenkins连接gitlab需要配置access token&#xff0…

K8S 节点初始化

本文永久链接: https://www.xtplayer.cn/rancher/node-init/自动清理节点将节点添加到集群时后&#xff0c;会创建容器、虚拟网络接口等资源和证书、配置文件。从集群中正常删除节点时(如果处于 Active 状态)&#xff0c;将自动清除这些资源&#xff0c;并且只需重新启动节点即…

matlab各向异性扩散滤波

主要是用来平滑图像的&#xff0c;克服了高斯模糊的缺陷&#xff0c;各向异性扩散在平滑图像时是保留图像边缘的&#xff08;和双边滤波很像&#xff09;。 通常我们有将图像看作矩阵的&#xff0c;看作图的&#xff0c;看作随机过程的&#xff0c;记得过去还有看作力场的。 这…

JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)...

1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中&#xff1a;输入将内存的数写入到外设中&#xff1a;输出。字符流的由来&#xff1a;其实就是&#xff1a;字节流读取文字字节数据后&#xff0c;不直接操作而是先查指定的编码表。获取对应的…

Centos7更改屏幕显示率

第一种&#xff0c;在虚拟机中安装VMwareTools,之后在虚拟机菜单栏"查看"这一项选择立即适应窗口。 第二种&#xff0c;修改/boot/grub2/grub.cfg配置文件&#xff0c;在终端输入su&#xff0c;输入密码&#xff0c; 执行以下指令&#xff1a; cd /boot/grub2 vi .…

rancher16 通过 webhook 自动升级服务

本文永久链接: https://www.xtplayer.cn/rancher/rancher16-webhook-auto-update/概述前面的文章我们有讲述了如何通过 Rancher-webhook 实现 Service/Host 的弹性伸缩。今天我们再来演示一下如何通过 Rancher-webhook 对接三方的 CI 系统&#xff0c;实现微服务镜像的自动构建…