当前位置: 首页 > news >正文

Linux程序地址

目录

一、定义

二、问题引出

三、虚拟地址和物理地址

(一)问题解释

(二)什么是进程地址空间

(三)为什么要有进程地址空间


一、定义

#include <stdio.h>    
#include <stdlib.h>//getenv的头文件    int un_gval;    
int init_gval=2;    
int main()    
{    printf("代码地址        :%p\n", main);    const char *str = "hello world";    printf("常量地址        :%p\n", str);    printf("已初始化数据地址:%p\n", &init_gval);    printf("未初始化数据地址:%p\n", &un_gval);                                                                                                  char *heap = (char*)malloc(100);    printf("堆区地址        :%p\n", heap);    printf("栈区地址        :%p\n", &str);    return 0;
} 

 

#include <stdio.h>    
#include <stdlib.h>//getenv的头文件        
int main()    
{    const char *str="hello world";    char *heap1 = (char*)malloc(100);    char *heap2 = (char*)malloc(100);    char *heap3 = (char*)malloc(100);    char *heap4 = (char*)malloc(100);    printf("heap1 address:%p\n", heap1);                                                                                                        printf("heap2 address:%p\n", heap2);    printf("heap3 address:%p\n", heap3);    printf("heap4 address:%p\n", heap4);    printf("Stack1 address: %p\n", &str);    printf("Stack2 address: %p\n", &heap1);//变量heap1是在main函数内部定义    printf("Stack3 address: %p\n", &heap2);    printf("Stack4 address: %p\n", &heap3);    return 0;    
} 

 

 

  • 栈整体向下增长,但是一旦全部开辟好以后,局部向上使用
  • (例如一个数组int a[10] ,&a[0]<&a[9])

二、问题引出

  • fork以后的父子进程,输出地址是一致的,但是变量内容不一样
  #include<stdio.h>#include<unistd.h>int g_val = 100;int main(){pid_t id = fork();if(id < 0){perror("fork");return 0;}else if(id == 0)//子进程{int cnt = 5;while(1){printf("child , pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(),getppid(),g_val,&g_val);sleep(1);if(cnt == 0){g_val = 200;printf("child change g_val: 100->200\n");}                                                                                                      cnt--;}}else{//父进程while(1){printf("father, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n",getpid(),getppid(),g_val,&g_val);sleep(1);}}return 0;}

 

 

 

三、虚拟地址和物理地址

(一)问题解释

  • 每一个进程运行之后,都会有一个进程地址空间的存在(在系统层面都要有自己的页表映射结构)

 

 

 

(二)什么是进程地址空间

  • 进程地址空间本质上是内存中的一种内核数据结构
  • 在Linux当中进程地址空间具体由结构体mm_struct实现 
  • 进程地址空间是一个虚拟的内存空间,可以看做是一条从 0x000000000xffffffff 的线,这条线上被划分成不同的区域。
  • 每个区域在进程地址空间中都有一定范围的地址划分。在实际运行中,这些虚拟地址会被操作系统内核映射到实际的物理内存地址
struct mm_struct {struct vm_area_struct * mmap;		/* list of VMAs */struct rb_root mm_rb;struct vm_area_struct * mmap_cache;	/* last find_vma result */unsigned long (*get_unmapped_area) (struct file *filp,unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags);void (*unmap_area) (struct vm_area_struct *area);unsigned long mmap_base;		/* base of mmap area */unsigned long free_area_cache;		/* first hole */pgd_t * pgd;atomic_t mm_users;			/* How many users with user space? */atomic_t mm_count;			/* How many references to "struct mm_struct" (users count as 1) */int map_count;				/* number of VMAs */struct rw_semaphore mmap_sem;spinlock_t page_table_lock;		/* Protects page tables, mm->rss, mm->anon_rss */struct list_head mmlist;		/* List of maybe swapped mm's.  These are globally strung* together off init_mm.mmlist, and are protected* by mmlist_lock*/unsigned long start_code, end_code, start_data, end_data;unsigned long start_brk, brk, start_stack;unsigned long arg_start, arg_end, env_start, env_end;unsigned long rss, anon_rss, total_vm, locked_vm, shared_vm;unsigned long exec_vm, stack_vm, reserved_vm, def_flags, nr_ptes;unsigned long saved_auxv[42]; /* for /proc/PID/auxv */unsigned dumpable:1;cpumask_t cpu_vm_mask;/* Architecture-specific MM context */mm_context_t context;/* Token based thrashing protection. */unsigned long swap_token_time;char recent_pagein;/* coredumping support */int core_waiters;struct completion *core_startup_done, core_done;/* aio bits */rwlock_t		ioctx_list_lock;struct kioctx		*ioctx_list;struct kioctx		default_kioctx;unsigned long hiwater_rss;	/* High-water RSS usage */unsigned long hiwater_vm;	/* High-water virtual memory usage */
};

页表中的其他字段:

 

 

(三)为什么要有进程地址空间

  • 进程以统一的视角看待内存,所以任意一个进程,可以通过地址空间+页表将乱序的内存数据,变成有序
  • 存在虚拟地址空间,可以有效的进行进程访问内存的安全检查
  • 将进程管理和内存管理进行解耦(互不干扰)
  • 通过页表,让进程映射到不同物理内存上,从而实现进程的独立性

相关文章:

Linux程序地址

目录 一、定义 二、问题引出 三、虚拟地址和物理地址 &#xff08;一&#xff09;问题解释 &#xff08;二&#xff09;什么是进程地址空间 &#xff08;三&#xff09;为什么要有进程地址空间 一、定义 #include <stdio.h> #include <stdlib.h>//geten…...

华为OD k 对元素最小值(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

解决Unity打包时,Android SDK 报错问题

报错内容应该包括类似如下信息&#xff1a; CommandInvokationFailure: Failed to update Android SDK package list. java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtim…...

基于nodejs+vue 校园通勤车系统

但是管理好校园通勤车可视化又面临很多麻烦需要解决, 信息化已经成为主流,开发一个校园通勤车可视化系统小程序一方面的可能会更合乎时宜,困扰管理层的许多问题当中,校园通勤车 管理也是不敢忽视的一块。另一方面来说也可以提高在校园通勤车可视化管理方面的效率给相关管理人员…...

【JavaEE】Java多线程编程案例 -- 多线程篇(3)

Java多线程编程案例 1. 单例模式1.1 代码的简单实现1.2 懒汉模式的线程安全代码 2. 阻塞队列2.1 阻塞队列的概念2.2 使用库中的BlockingDeque2.3 模拟实现阻塞队列2.4 生产者消费者模型 3. 定时器3.1 概念3.2 使用库的定时器 - Timer类3.3 模拟实现定时器 4. 线程池4.1 概念4.2…...

axios发送常见请求方式以及拦截器的封装

一&#xff0c;常见请求 //1.get--传递paramsaxios.get("/test",{params:{}})//2.post--传递paramsaxios.post("/test",{},{params:{}}) //3.post--传递bodyaxios.post("/test",{name:""}) 二&#xff0c;封装请求拦截器 import ax…...

Apollo中的身份验证与授权:保护你的数据

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

斜率优化dp

f i min ⁡ ( a j − j i ) f_i\min(a_j - j \times i) fi​min(aj​−ji) 考虑变成点对 ( j , a j ) (j,a_j) (j,aj​)&#xff0c;则 f i Y j − X j i f_iY_j-X_ji fi​Yj​−Xj​i 令 i k , f i b ik, f_ib ik,fi​b&#xff0c;得 b Y j − X j k bY_j-X_jk b…...

华为OD 打印任务排序(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

最新Ai写作创作系统源码+Ai绘画系统源码+搭建部署教程+支持GPT4.0+支持Prompt预设应用+思维导图生成

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…...

FPGA【紫光语法】

寄存器数据类型&#xff1a; reg 默认为 1 bit wide&#xff0c;如果超过 1 bit&#xff0c;则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit&#xff0c;不允许有 range declarationtime 默认位宽为 64 bit&#xff0c;不允许有 range declarat…...

运维监控Zabbix部署

目录 运维监控Zabbix部署 1. 简介 2. 安装 ​编辑 2.1 安装前准备 - Mysql 2.2 安装Zabbix Server 和 Zabbix Agent 2.2.1 安装Zabbix yum库 2.2.2 安装Zabbix Server、前端、Agent 2.2.3 初始化Mysql数据库 2.2.4 为Zabbix Server配置数据库 2.2.5 配置Zab…...

vue与react,angular的区别

Vue.js 作为一个优秀的前端框架&#xff0c;方便前端开发者快速开发应用的前端&#xff0c;在实际项目中使用得比较普遍。 当然 Vue.js 也不是实际项目中唯一的前端框架&#xff0c;比较优秀的前端框架还有 React、AngularJS 和 Angular等。接下来就介绍一下 Vue.js 同这3个框架…...

水质分析仪MQTT应用案例

水质分析仪MQTT应用案例 一、公司介绍 某仪器股份有限公司&#xff0c;集研发&#xff0c;生产&#xff0c;销售于一体的水质分析仪器公司。产品主要包括PH/ORP分析仪&#xff0c;电导度分析仪&#xff0c;溶氧分析仪&#xff0c;离子浓度分析仪&#xff0c;浊度分析仪及重金…...

网络代理技术的护航与网络安全

在数字化时代&#xff0c;网络代理技术日益重要&#xff0c;不仅可维护网络安全&#xff0c;还能促进数据获取。本文深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫、HTTP协议中的应用&#xff0c;助您深刻了解这些技术。 1. Socks5代理&#xff1a;网络安全与多协议支持…...

大模型LLM相关面试题整理-PEFT

Prefix/Prompt-Tuning&#xff1a;在模型的输入或隐层添加 个额外可训练的前缀 tokens&#xff08;这些前缀是连续的伪 tokens&#xff0c;不对应真实的 tokens&#xff09;&#xff0c;只训练这些前缀参数&#xff1b; Adapter-Tuning&#xff1a;将较小的神经网络层或模块插入…...

65_Pandas显示设置(小数位数、有效数字、最大行/列数等)

65_Pandas显示设置&#xff08;小数位数、有效数字、最大行/列数等&#xff09; 本文介绍了使用 print() 函数显示 pandas.DataFrame、pandas.Series 等时如何更改设置&#xff08;小数点后位数、有效数字、最大行/列数等&#xff09;。 有关如何检查、更改和重置设置值的详细…...

一个失败架构升级案例

架构师的核心能力-抽象能力 在做架构升级的时候&#xff0c; 升级开始&#xff1a; 升级过程&#xff1a; 结束&#xff1a; 虽然升级完了能很好的满足未来的需求&#xff0c;但是在升级的过程中一个需求可能要同时在新老链路里同时实现&#xff0c;风险和工作量加倍。 架构…...

VM虚拟机运行的Ubuntu连入同一局域网,并实现双机方法

环境&#xff1a; Windows 10 VMware Workstation Pro 16 Ubuntu 20.4 在虚拟机设置桥接模式 确保虚拟机处于关闭状态&#xff0c;在Vm中设置&#xff1a; 编辑->虚拟网络编辑器 如果你以前设置过&#xff0c;可以重置之。 重置之后&#xff0c;添加桥接模式&#xff1a; …...

MySQL启动错误总结

centos7中出现mysql启动失败排查方法&#xff1a;首先找到/var/log/mysqd.log 第一种启动失败&#xff1a; 查看包含最后几行包含error的行&#xff1b; [ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock.[ERROR] Unable to setup unix socket lock file.[ERROR] …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...