第六学 linux内核——内存寻址——简介

网易公开课《Linux内核分析》学习心得-Linux内核学习总结 杨怡泽 原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000博客作业目录列表·第一周-通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 ·第二周-mykernel实验的实践和分析 ·第三周-跟踪分析Linux内核的启动过程 ·第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用 阅读详情

        操作系统首先是一组软件,这是大家必须首先要搞清的问题。那么这是什么样的一组软件呢?它是沟通用户和硬件的一组软件。那么作为操作系统的设计者,它能不能只关心软件的实现呢,由操作系统作为用户和硬件的媒介这点来说,显然不行。于是我们说,操作系统是一组充分挖掘了硬件设计机制的软件,即我们依赖一个体系结构来设计我们的操作系统。这样就有了一个问题,若我们整个操作系统都依赖某一体系结构来设计的话,它的硬件潜能却是能发挥到最大,但这毫无疑问带来了操作系统的可移植性的降低,甚至根本不可移植。因而作为操作系统的设计者,我们必须清楚的在硬件相关的代码和硬件无关的代码之间划清界限,这事关你的操作系统的可移植性。linux以强大的可移植性著称,所以在这点上做得相当好(linux整个内核代码在usr/src下,其硬件相关的代码就在该目录下的arch目录下,在这个目录下你能找到linux支持的各种体系结构硬件部分的代码)。

        作为操作系统软件的实现者,我们不大关心这个体系结构的运算节点是怎么运作的,我们更多的关心我们的代码怎么放在内存中执行,即内存寻址问题。所以我们着重讨论内存寻址问题,这里以x86体系结构为例。

        第一个问题:为什么会存在内存寻址问题?

        设我们只有一个4G大小的内存,没有任何寻址机制,那么作为程序员,我们必须清楚的知道自己的每一条指令对应的内存单元,这对程序员来说是很辛苦的事。8086引入了一个非常重要的概念——段。8086用一个段寄存器来实现了一个简单的地址映射机制,用户编程可以不在基于内存的物理地址,而直接基于这个段中存放的虚拟地址,8086用一个简单的加法器实现了逻辑地址到物理地址的映射,即段寄存器值左移四位和程序的逻辑地址相加(8086是20位寻址空间,段寄存器是16位)。x86体系结构其地址总线和数据总线都是32位的,但由于要保证向下兼容(系列机的商业模式导致的)所以段寄存器仍然是16位的,但16位寄存器无法存储32位地址作为基址,所以它的地址映射做得比较复杂。那我们回顾一下问题:为什么会存在内存寻址问题?一个很给力的答案:就是为了解放程序员,可以让我们做到硬件无关的编程。

        第二个问题:x86的寄存器

        学过汇编的童鞋都知道,我们若想用汇编编程,必须知道的就是该结构的寄存器相关知识。作为操作系统的设计,因为它硬件相关,所以也必须知道这点,而且在linux内核源码中就有用嵌入式汇编完成的一些功能。

        x86结构有8个32位的通用寄存器,并且向下兼容,也就是我们可以访问到它的半字和字节部分的值。具体可以看相关的文档,下面我们讲内存寻址有关的寄存器。

        x86结构有6个16位的段寄存器,上边说过,由于它不能存放32位的基地址,所以其地址映射机制做得相当复杂。既然不能存32位基址,那它存啥?存的是一个叫选择符的东西,而这个选择符中存着一段程序的基址。具体的段机制我们以后再讲,这里只是大概描述一下。

        指令指针寄存器存放的是下一条指令的偏移量,这个偏移量是相对于目前正在运行的代码段寄存器而言的,偏移量通过段寄存器的映射基址,就能确定它在内存中的物理地址。

        下面介绍四个分页机制相关的寄存器,先提醒一下,这些寄存器是相当重要的。

        x86有4个32位的用于分页控制的寄存器:CR0, CR1, CR2, CR3。

        CR0中包含了6个预定义标志,这里只介绍内核中用到的0位和31位。31位用于分页允许,为1时表示开启分页机制,为0时表示不用分页机制,这时只用段机制实现地址映射。第0位是保护允许位, 为1时启动保护模式。

        CR1目前没用。

        CR2是缺页线性地址寄存器,保存最后一次出现缺页的全32位线性地址。

        CR3就非常重要了。它就相当于段寄存器,不过它是32位的,它实现了分页机制中逻辑地址到物理地址的映射。分页机制中再细细介绍。

        第三个问题:逻辑地址、线性地址、物理地址

        逻辑地址即程序员的编程空间所用的地址,之所以说它是逻辑地址是因为段寄存器的存在,我们程序员编程几乎不用管任何地址,只是在加载程序的时候会把每条指令的偏移量拿去用段寄存器做映射,从而存到内存中(若无分页机制存在的话)。

        线性地址是指一段连续的,不分段的,范围从0到4GB的地址空间,一个线性地址就是线性地址空间中的一个绝对地址。

        物理地址就是我们的内存的实际地址。

        把逻辑地址映射到物理地址是通过一个硬件单元实现的,8086里边是一个简单的加法器,而x86里边把它替换成了一个比较复杂的电路,叫MMU(内存管理单元):它包含两个部件,一个分段部件,完成逻辑地址到线性地址的转换;一个分页部件,完成线性地址到物理地址的映射。

实测有效!YOLOv8融合EMA注意力机制后,在无人机航拍目标检测中的性能提升对比 本文详细介绍了YOLOv8融合EMA注意力机制在无人机航拍目标检测中的性能提升效果。通过多尺度特征融合和通道-空间双重注意力机制,EMA模块显著提升了小目标检测的准确率,mAP@0.5平均提升4.2%,同时保持推理速度基本不变。文章还提供了模型定制、训练技巧和实际部署优化的全流程指南。 阅读详情

相关推荐

逆向工程的艺术:如何绕过PDD的长连接机制实现高效抓包

本文深入解析了如何通过逆向工程技术绕过拼多多(PDD)的长连接机制实现高效抓包。详细介绍了动态调试方案、关键函数Hook技巧及流量解密重组方法,帮助开发者在非Root环境下捕获并解析PDD的加密数据。结合Python工具链,实现稳定数据采集,适用于电商数据分析和反爬策略研究。

weixin_29058331的博客 674

内核概念-内核

1.R3和R0  用户模式和内核模式 当我们开始一个应用层的程序,操作系统惠威改程序分配一个一个私有的虚拟地址空间和私有句柄表。因为地址空间是私有的,所以一个应用程序不能改变其他的应用程序的数据,每个应用程序都是独立的,当一个应用程序crash了,这个崩溃也仅限于这个程序,其他程序不会受影响。 在内核中运行的代码共享一个虚拟地址空间,这意味着内核驱动并不是与操作系统和其他驱动是相互独立的,当

wlssing 1548

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 206

什么是基地址.段地址???主要用处是什么?

其实这个问题是从内存的寻址来说, 一般程序要找到内存所存储的数据或者下一个指令,都要通过段地址+偏移地址的形式来确定所需要的东西所在内存的位置,以便读取。 首先要说,这种模式工作在DOS 16位模式 也称为实模式,跟它相对应的是windows 32位的保护模式。。区别在于能寻找的空间大小不同。实模式只能寻找1M的空间,而保护模式能寻找4G。 再回来说,一个程序由数据段,代码段,堆栈段,附加段四个主要段组成。(即一个程序被运行后,所占据内存就是给这个四个段使用) 而你说的基地址其实就是每个段的起始...

全粘工程师 1万+

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1670

手把手教你用RoboTwin训练RDT模型:从环境配置到实战微调(避坑指南)

本文提供了一份详尽的避坑指南,手把手教你如何在RoboTwin开源仿真环境中,从零开始配置环境、采集数据并完成RDT视觉语言动作模型的实战微调。文章涵盖了环境搭建、数据流水线构建、模型配置与训练等关键步骤,旨在帮助研究者和开发者高效利用仿真数据,低成本探索具身智能应用。

weixin_29094979的博客 132

获取linux内核基址,Linux内核漏洞利用技术:覆写modprobe_path

0x00 前言如果大家阅读过我此前发表的Linux内核漏洞利用的相关文章,可能会知道我们最近一直在学习这块内容。在过去的几周里,我的团队参加了DiceCTF和UnionCTF比赛,其中都包括了Linux内核PWN题目。凭借我有限的知识,在比赛过程中没有解出这类题目。但是通过阅读其他优秀CTF团队和成员的文章,我发现他们很多人都在使用一种相似的技术,这样一来在使用Payload时就完全不需要经历调用...

weixin_42498347的博客 416

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 392

Linux内核之浅谈内存寻址

我们知道计算机是由硬件和软件组成,硬件主要包括运算器、控制器、存储器、输入设备和输出设备,软件主要是操作系统和用户应用软件,其中操作系统是联系硬件和软件的桥梁。文本主要分享运算器关于内存寻址的重点内容,从内存寻址的硬件机制重点和内核代码动手实践两部分来分享,欢迎交流。

金荣的个人技术博客 1628

药物对接仿真软件:HADDOCK_(9).结果分析方法

HADDOCK是一种强大的药物对接仿真工具,通过对生成的输出文件进行详细的分析,我们可以验证仿真结果的可靠性,并为进一步优化药物设计提供依据。常见的分析方法包括解读输出文件、使用可视化工具进行结构分析、评估对接模型的稳定性和准确性等。通过这些步骤,我们可以更全面地了解受体和配体的结合模式,从而提高药物设计的成功率。

kkchenjj的博客 1008

终于搞定!Cloudflare Tunnel 报错 Error 1033,一次完整修复记录

最近遇到了 Cloudflare Tunnel Error 1033 报错的问题,本文记录了完整的排查和解决方案💡

XiaoqiangClub的博客 1766

linux内存寻址解析 (一)

1.内存地址 1.逻辑地址:每一个逻辑地址都有一个段和偏移量组成。 2.线性地址:也叫虚拟地址,是一个32位无符号整数,可以用来表示高达4GB的地址,值得范围从0x00000000到0xffffffff。 3.物理地址:用于内存芯片级内存单元寻址 内存控制单元(MMU)将逻辑地址转化成线性地址,再转化成物理地址。 2.硬件中的分段 1.段选择符(段寄存器 )

华的专栏 2735

[QMT和ptrade量化交易小白入门]-125、菜场大妈加上四大现金行业指数风控,最大回撤从22%减少了一半

群里面有人建议,在菜场大妈策略的基础上,加入申万的行业指数(银行,钢铁,有色,煤炭)测算其宽度,当这四大行业其中有一个高就会清仓(用来控制回撤)。这背后的逻辑是,在存量资金博弈的市场环境中,资金总量相对固定,当银行、钢铁、有色、煤炭等大市值周期行业因基本面改善(如涨价、政策催化)或避险需求而走强时,会吸引大量资金涌入,导致其他板块(尤其是小市值股票)面临流动性虹吸。经过回测,对比上一个版本发现确实是可以降低一半的回撤,最大回撤从22.3%降到了11.4%,而且有很多时间是空仓等待。

木头大左的博客 241

Linux内核从原理到代码详解|Linux内核视频教程

Linux内核从原理到代码详解 链接: http://pan.baidu.com/s/1sj0Szj3 密码: ywyv 网盘失效的话,请加QQ: 3113533060 课程内容: 第一周 1. 初识Linux内核 1.1 认识操作系统 1.2 开放源代码的UNIX/Linux操作系统 1.3 Linux内核 1.4 Linux内核源代码 1.5 Lin

linuxdashi的专栏 6027

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

内存寻址

内存寻址 1.冯诺依曼结构和哈佛结构 **哈佛结构:**程序指令和数据存储分开存储的存储器结构。 **冯诺依曼结构:**数据和代码放在一起。 2.X86内存寻址的不同时期 **逻辑地址:**通过段地址和偏移地址来表示的存储单元的地址称为逻辑地址,记为:段地址:偏移地址。 线性地址:线性地址也就是虚拟地址,linux用户进程使用的地址就是这个虚拟地址。 **物理地址:**用来寻址物理存储芯片的地址,通常也就是处理器的物理地址总线所寻址的地址空间。 **逻辑地址、线性地址和物理地址之间的转换关系:**分段机

qq_39790702的博客 479

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux内核--第六篇博客--内核内存布局和堆管理

一、内核内存布局 64位Linux一般使用48位来表示虚拟地址空间,42位表示物理地址,通过命令:cat /proc/cpuinfo。 ARM64架构处理器采用48位物理寻址机制,最大可寻找256TB的物理地址空间。对于 目前应用完全足够,不需要扩展到64位的物理寻址。虚拟地址也同样最大支持48位寻址,所以在处理器架构设计上,把虚拟地址空间划分为两个空间,每个空间最大支持256TB,linux内核 在大多数体系结构上都把两个地址划分为:用户空间和内核空间。 用户空间:0x0000_...

huohunri2013的专栏 555

关于Linux内核,推荐的8本书籍

推荐几本高质量的Linux内核的书籍。 第一本,《Linux内核设计与实现》,基于Linux 2.6内核介绍了Linux内核的设计与实现,涵盖了从核心内核系统的应用到内核设计与实现等各方面内容,主要内容包括:进程管理、调度、时间管理和定时器、系统调用接口、内存寻址、内存管理、页缓存、VFS、内核同步、可移植性、调试技术等。此外,本书还讨论了Linux 2.6颇具特色的内容,包括CFS调度程序、抢...

wzq2009的专栏 5218

Linux内核学习计划

前一阵儿开始学习Linux内核,开始之后逐渐发现这是一个庞大的计划,需要极大恒心。因此开通这个博客,记录学习笔记,督促自己坚持下去。学习资料主要来源于两本书:《深入理解Linux内核》、《Linux内核源代码情景分析》,以第一本为主。还参考了一些其他资料,在具体遇到时再一一标注。

li_boxue的博客 878

深入理解linux内核

目录 目录 操作系统(os) 必须完成的目标 多用户系统 特点 用户和组 进程 进程和程序:几个进程能并发执行同一个程序,同一个进程能顺序的执行几个程序。 单处理系统 内核体系结构 模块优点 文件系统 文件 硬链接和软连接 限制 软连接(符号链接) 文件类型 文件描述符 索引节点(inode) 访问权限和文件模式 文件操作的系统调用 进程/内核模式 激...

Yu的博客 6772

内存寻址系列讲座-拨开云雾初见端倪

  关于内存寻址,内容庞杂,我们分六讲对其进行初步讲解http://www.kerneltravel.net/007.htm:       第一讲:简述x86寻址演变       第二讲:IA32寄存器简介       第三讲:IA32内存寻址机制       第四讲:段机制及Linux的实现       第五讲:分页机制及Linux中的初步表示

陈莉君的专栏 964

深入理解Linux内核

Linux内核学习笔记

qq_41975735的博客 2585

第六、七章 嵌入式Linux开发

嵌入式Linux

wjrzm2001的博客 3536

程序员必备的技能-深入理解 Linux 内核拆解

Linux与其他类Unix内核的比较硬件的依赖性Linux版本操作系统基本概念Unix文件系统概述Unix内核概述。

最是书香能致远,腹有诗书气自华 1032

经典书籍翻译——深入理解Linux内核8

Overview of the Book To make life easier, Chapter 1, Introduction, presents a general picture of what is inside a Unix kernel and how Linux competes against other well-known Unix systems. The heart of any Unix kernel is memory management. Chapter 2, Memory

m0_37546257的博客 197

《Linux内核设计与实现》学习笔记

《Linux内核设计与实现》学习笔记第三章 进程管理第四章 进程调度第五章 系统调用第六章 内核数据结构第七章 中断和中断处理第十章 内核同步方法第11章 定时器和时间管理第12章 内存管理第13章 虚拟文件系统第14章 块I/O层第15章 进程地址空间第16章 页高速缓存和页写回第16章 其它 第三章 进程管理 1、内核线程和普通的进程相比,没有独立的地址空间; 2、进程退出,而未被wait时,占用内核栈、thread_info结构和task_struct结构 第四章 进程调度 1、CFS公平调度器,将任

xin_hen的博客 641

隐形的内核后门:无模块Linux内核植入技术详解

在聊具体技术之前,我们先搞清楚核心概念——所谓“无Linux内核模块植入后门”,本质上是一种绕开常规内核模块加载流程的恶意技术,和传统内核后门有着本质区别。 传统的Linux内核后门,大多会打包成.ko格式的内核模块文件,通过`insmod`、`modprobe`等系统命令加载到内核中运行。这种方式的痕迹很明显,会在`/proc/modules`(内核模块列表)、`/sys/module/`(模块文件目录)中留下清晰记录,很容易被安全工具检测到。 而无模块内核植入后门,完全抛弃了.ko模块载体,直接将恶

chen1415886044的博客 1028
上一篇: 第五学 linux内核中最基本的数据组织方式——list.h分析(3)
下一篇: QT学习:Qt中应用程序图标的修改
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值