Linux内核分析与应用2-内存寻址
本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看
留此记录,蜻蜓点水,可作抛砖引玉
2.1 内存寻址

数据连续存储和选择读取思想,是目前我们使用的几乎所有机器运行背后的灵魂
计算机体系结构中的核心问题之一,就是如何有效地进行内存寻址; 内存寻址技术,从某种程度上代表了计算机技术.
"段"的引入:
段描述了一块有限的内存区域,区域的起始位置存在专门的寄存器,也就是段寄存器中.
"保护模式"的引入:
访问内存时不能直接从段寄存器中获得段的起始地址,而需经过额外的转化或检查
"黄金时代":



Linux内核中的C和汇编语言
-
用的GNU的扩展C -
汇编语言用的是AT&T的汇编格式与Intel的汇编格式稍有差异
在C语言中,也可以嵌入汇编语言,叫做GCC嵌入式汇编
2.2 段机制
将虚地址转换为线性地址
使用readelf和objdump解析目标文件[2]

MMU: 内存管理单元,和CPU是在一起的.MMU把虚地址转化成物理地址,送给存储器.




(Intel)I386的体系结构[3]
2.3 分页机制
分页在分段之后进行,其作用是完成从线性地址到物理地址的转换
必须在保护模式下才能启动分页功能

在32位系统上一般默认为4K大小,也可以是2MB或4MB
64位系统上,可以是4KB,8KB,最大可以是256MB
分页使得每个进程可以拥有自己独立的虚拟地址空间
(更多可参考 为什么 Linux 默认页大小是 4KB[4])

两级页表:

Linux四级分页模式

I386体系结构(下)[5]
2.4 动手实践-将虚拟地址转换成物理地址

页全局目录
所有的进程都共享一个内核页表
最新的CPU已经支持五级页表
64位系统中已经不再用"高级内存"
mknod命令[6]
章节测试:
<1>.操作系统启动时,处理器处于保护模式 (错)
<2>.X86中段的描述包含基地址和界限 (错)
<3>.Intel8086的寻址范围是1MB,80386的寻址范围是 4GB (对)
<4>.分页机制是在保护模式下开启的。 (对)
<5>.在保护模式下,段的大小可以达到4GB (对)
<6>. CR3寄存器存放页目录基地址 (对)
<7>.x86的保护模式就是来保护操作系统的 (错)
<8>. 分页的原理使得每个进程可以拥有自己独立的虚拟内存空间 (对)
<9>. 分Linux之所以巧妙地绕过段机制,主要是因为将段的基址设为0,即偏移量等于线性地址 (对)
<10>. 在x86中,启用分页机制是通过启用保护允许位PE而达到的 (错)
x86 保护模式 + 分页管理机制[7]
开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44[8]
<11>. 链接以后形成的地址空间是虚拟地址空间。 (对)
<12>. 虚拟地址是程序访问存储器所使用的逻辑地址 ;线性地址是逻辑地址到物理地址变换之间的中间层;物理地址是每一个字节单元的一个唯一的存储器地址 (对)
<13>. CPU访问的是虚拟地址。(对)
<14>. 80x86的控制寄存机器主要用于分段机制 (错)
<15>. 80x86的分段机制是必选的,分页机制是可选的 (对)
但是现实情况不是的,操作系统大多都用了分页机制
<16>. 保护模式提供了四个特权级,Linux使用了其中的2个,0级对应内核态,2级对应用户态 (错)
“段被分为了4个特权级,分别为0-3级,有时候我们也叫做ring0-ring3,其中,数值越小特权级越高
核心代码和数据所在的段的特权级都比较高,一般在ring0,而用户程序所在的段的特权级较低,一般在ring3。当低特权级的任务试图在未被允许的情况下访问高特权级的段时,将会产生常规保护错误。
而处理器是如何区分所在段的特权级,进而对其进行保护的呢?这就不得不提到CPL、DPL和RPL三者了。但是在开始之前,我们需要先了解一下一致代码段和非一致代码段。
保护模式特权级概述[9]
操作系统-保护模式中的特权级[10]
<17>. 页面大小是由操作系统设计者确定的 (错)
<18>. 页面高速缓存是一种硬件机制,专门用来支持地址转换的 (对)
与程序员相关的CPU缓存知识[11]
<19>. intel的保护模式是在80386处理器中首次出现的 (错)
<20>. 页目录存放在( )中。 D
A.CR0
B.CR1
C.CR2
D.CR3
“控制寄存器(Control Register)(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性。
CR0中含有控制处理器操作模式和状态的系统控制标志;
CR1保留不用;
CR2含有导致页错误的线性地址;
CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base address Register)。
控制寄存器 CR*[12]

控制寄存器[13]
<21>. 一个32位虚拟地址被分为a、b、c三个域,其中a、b用于一个2级页表系统,c为页内偏移地址,则页面数为( )。D
A. a+b
B. a×b
C. 2a×b
D. 2a+b
<22>. 以下( )处理器不是冯诺伊曼体系(普林斯顿体系)结构 C(属于哈佛体系)
A. Intel X86
B. AMD
C. ARM
D. MIPS
<23>. 如下缩写,( )是中断描述符表 B
A. GDT
B. IDT
C. LDT
D. RPL
中断描述符表[14]
中断机制和中断描述符表、中断和异常的处理[15]
<23>. “段:偏移量”的形式描述的是( ) B
A. 物理地址
B. 虚拟地址
C. 线性地址
D. 段地址
虚拟地址转换与段分割[16]
参考资料
Linux 内核分析与应用: https://next.xuetangx.com/course/XIYOU08091001441/1516763
[2]使用readelf和objdump解析目标文件: https://www.jianshu.com/p/863b279c941e
[3](Intel)I386的体系结构: http://wwww.kerneltravel.net/journal/ii/part1.htm
[4]为什么 Linux 默认页大小是 4KB: https://draveness.me/whys-the-design-linux-default-page/
[5]I386体系结构(下): http://wwww.kerneltravel.net/journal/ii/part2.htm
[6]mknod命令: https://blog.csdn.net/a1010256340/article/details/83088870
[7]x86 保护模式 + 分页管理机制: https://www.cnblogs.com/dongguolei/p/7865381.html
[8]开启分页机制———《x86汇编语言:从实模式到保护模式》读书笔记44: https://blog.csdn.net/longintchar/article/details/52198391
[9]保护模式特权级概述: https://www.cnblogs.com/tcctw/p/11332551.html
[10]操作系统-保护模式中的特权级: https://blog.51cto.com/13475106/2462286
[11]与程序员相关的CPU缓存知识: https://coolshell.cn/articles/20793.html
[12]控制寄存器 CR*: https://www.cnblogs.com/coderCaoyu/p/3616055.html
[13]控制寄存器: https://baike.baidu.com/item/%E6%8E%A7%E5%88%B6%E5%AF%84%E5%AD%98%E5%99%A8/9335215
[14]中断描述符表: https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD%E6%8F%8F%E8%BF%B0%E7%AC%A6%E8%A1%A8
[15]中断机制和中断描述符表、中断和异常的处理: https://blog.csdn.net/jnu_simba/article/details/11722703
[16]虚拟地址转换与段分割: https://zhuanlan.zhihu.com/p/56172609
本文由 mdnice 多平台发布
相关文章:

Linux内核分析与应用2-内存寻址
本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看 留此记录,蜻蜓点水,可作抛砖引玉 2.1 内存寻址 数据连续存储和选择读取思想,是目前我们使用的几乎所有机器运行背后的灵魂 计算机体系结构中的核心问题之一,就是如…...

苍穹外卖 day12 Echats 营业台数据可视化整合
苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系…...

代码随想录算法训练营day45|70. 爬楼梯(进阶版)|322. 零钱兑换|279.完全平方数
70. 爬楼梯(进阶版) 一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢? 1阶,2阶,… m阶就是物品,楼顶就是背包。 每一阶可以重复使用&#…...

数据结构和算法(3):列表
列表是一种线性数据结构,它允许在其中存储多个元素,并且可以动态地添加或删除元素。 循秩访问 可通过重载下标操作符,实现寻秩访问 template <typename T> // assert: 0 < r < size T List<T>::operator[](Rank r) cons…...
使用playright自动下载vscode已安装插件
import os import re import subprocess import traceback from playwright.sync_api import Playwright, sync_playwright, expect# 执行CMD命令 cmd_command "code --list-extensions" # 获取已安装扩展列表 process subprocess.Popen(cmd_command, stdoutsubpr…...
单片机语言实例:2、点亮数码管的多种方法
一、共阳数码管静态显示 程序实例1: #include<reg52.h> //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义void main (void) {P10xc0; //二进制 为 1100 0000 参考数码管排列,//可以得出0对应的段点…...

C#学习 - 初识类与名称空间
类(class)& 名称空间(namespace) 类是最基础的 C# 类型,是一个数据结构,是构成程序的主体 名称空间以树型结构组织类 using System; //前面的using就是引用名称空间 //相当于C语言的 #include <..…...

Python爬取电影信息:Ajax介绍、爬取案例实战 + MongoDB存储
Ajax介绍 Ajax(Asynchronous JavaScript and XML)是一种用于在Web应用程序中实现异步通信的技术。它允许在不刷新整个网页的情况下,通过在后台与服务器进行数据交换,实时更新网页的一部分。Ajax的主要特点包括: 异步通…...

JavaScript的面向对象
一、认识对象 1.概述 对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。 什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合…...

MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具
MybatisPlus 快速入门 常见注解 配置_软工菜鸡的博客-CSDN博客 2.核心功能 刚才的案例中都是以id为条件的简单CRUD,一些复杂条件的SQL语句就要用到一些更高级的功能了。 2.1.条件构造器 除了新增以外,修改、删除、查询的SQL语句都需要指定where条件。因此…...

TSN时间敏感网络
目录 时间敏感网络介绍 子协议介绍 时间同步 IEEE802.1AS 调度和流量整形 IEEE802.1Q IEEE802.1Qbv IEEE802.1cr IEEE802.1Qbu IEEE802.1Qch IEEE802.1Qav IEEE802.1Qcc 纠错机制与安全 IEEE802.1Qci IEEE802.1CB IEEE802.1Qca 参考 时间敏感网络介绍 TSN(Tim…...
【2023年数学建模国赛】C题解题思路
第一问 要求分析分析蔬菜各品类及单品销售量的分布规律及相互关系。该问题可以拆分成三个角度进行剖析。 1)各种类蔬菜的销售量分布、蔬菜种类与销售量之间的关系;2)各种类蔬菜的销售量的月份分布、各种类蔬菜销售量与月份之间的相关关系&a…...

5分钟 将“.py”文件转为“.pyd”文件
代码: from distutils.core import setup from distutils.extension import Extension from Cython.Build import cythonize import osfile_list os.listdir("./") extensions [] for file in file_list:if file.endswith(".py") and file !…...
python 入门到精通(一)
文章目录 1.使用pycharm进行第一个程序的编写2.python基础语法篇2.1 常用的值类型2.2 注释2.3 变量2.4 数据类型2.5 数据类型转换2.6 什么是标识符2.7 运算符2.8 字符串扩展2.8.1 字符串拼接2.8.2 字符串格式化2.8.3 格式化的精度控制2.8.4 字符串格式化 - 快速写法2.8.5 字符串…...
AJAX (Asynchronous JavaScript And XML)异步的JavaScript 和 XML
1、概念 Asynchronous JavaScript And XML 异步的JavaScript 和 XML异步和同步:客户端和服务器端相互通信的基础上 同步:客户端必须等待服务端的响应。在等待的期间客户端不能做其他操作。异步:客户端不需要等待服务器端的响应。在服务器…...

华为云云耀云服务器L实例评测|安装Java8环境 配置环境变量 spring项目部署 【!】存在问题未解决
目录 引出安装JDK8环境查看是否有默认jar上传Linux版本的jar包解压压缩包配置环境变量 上传jar包以及运行问题上传Jar包运行控制台开放端口访问失败—见问题记录关闭Jar的方式1.进程kill -92.ctrl c退出 问题记录:【!】未解决各种方式查看端口情况联系工程师最后排查…...

安卓多渠道打包(五)360加固walle多渠道打包
背景: 1、360加固宝,签名收費了,脚本上传加固也针对特定帐号才可实现。 内容 本文将会分享安卓项目中,使用360加固,再用walle签名,产出多渠道加固包的全流程。 环境 win10 jdk11 as2022 gradle7.5 最…...

Jmeter 实现 mqtt 协议压力测试
1. 下载jmeter,解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例,下载地址: https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压: unzip apache-jmeter-5.4.3.zip 2. 下载m…...

蓝桥杯官网练习题(凑算式)
类似填空题: ①算式900: https://blog.csdn.net/s44Sc21/article/details/132746513?spm1001.2014.3001.5501https://blog.csdn.net/s44Sc21/article/details/132746513?spm1001.2014.3001.5501 ②九宫幻方③七星填数④幻方填空:https:/…...

机器学习实战-系列教程5:手撕线性回归4之非线性回归(项目实战、原理解读、源码解读)
🌈🌈🌈机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 手撕线性回归1之线性回归类的实现 手撕线性回归2之单特征线性回归 手撕线性回归3之多特征线性回归 手撕线性回归4之非线性回归 1…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...