虚拟地址空间 实验(一)

简介: 虚拟地址空间 实验(一)

实验分为两个操作系统WindowsLinux

在windows操作系统下实现的操作,我使用的是devc++编辑器

1.先创建一个文件夹用来存放运行的代码,如图所示为我所创建的文件路径。

2.在dev中新建项目,编写代码,保存到步骤1中的路径下。

代码如下所示

#include <stdio.h>
#include <stdlib.h>
 
 
int X = 42;           // 已初始化的全局变量
int Y;              // 未初始化的全局变量
int global_variable = 34;   // 声明一个全局变量,它位于代码段中
 
void print_stack_addresses() {
    int a = 10;
    int b = 20;
    printf("栈中变量a的地址      : %p\n", &a);
    printf("栈中变量b的地址      : %p\n", &b);
}
  
 
int main() {
     
    int local_variable;     // 声明一个局部变量
    float x = 12;    // 已初始化的局部变量;
  float y = 21;   //未初始化的局部变量;
  
  int* heap_variable = (int*)malloc(sizeof(int));   // 动态分配内存,位于堆段 
  
    
    printf("已初始化(全局)数据段的地址:%p\n", &X);    // 打印已初始化数据段的地址
    
    printf("未初始化(全局)数据段的地址:%p\n", &Y);     // 打印未初始化数据段的地址
    
    printf("已初始化(局部)数据段的地址:%p\n", &x);    // 打印已初始化数据段的地址
    
    printf("未初始化(局部)数据段的地址:%p\n", &y);    // 打印未初始化数据段的地址
    
    printf("已初始化(全局)代码段的地址:%p\n", &global_variable);    // 打印代码段中的全局变量地址
    
    printf("未初始化(局部)代码段的地址:%p\n", &local_variable);   // 打印代码段中局部变量的地址
    
    printf("堆段变量的地址     :%p\n", heap_variable);   // 打印堆段变量的地址
   
  print_stack_addresses();
  
  FILE* file_pointer;
    char* filename = "test.txt"; // 文件名
 
    // 打开文件
    file_pointer = fopen(filename, "r");
    if (file_pointer == NULL) {
        perror("无法打开文件");
        return 1;
    }
 
    // 获取文件内存地址
    printf("文件 \"%s\" 的内存地址是:%p\n", filename, (void*)file_pointer);
 
    // 关闭文件
    fclose(file_pointer);
 
   
    return 0;
}
 

3.运行结果如图

在Linux操作系统下,使用编辑器gedit,使用编译器gcc

4.先cd到home目录下,接着创建一个名为test的文件夹,然后cd到test文件夹,使用cat >test.txt,创建一个文本,使用vim test.txt编辑文本,随便输入内容,按esc再按“:”输入wq退出。接着在test文件下使用命令gedit test.c,在编辑器中输入C语言代码,保存并退出。然后gcc test.c。最后./a.out  看到了运行结果

5.test.c文件的代码和Windows下的一样

#include <stdio.h>
#include <stdlib.h>
 
 
int X = 42;           // 已初始化的全局变量
int Y;              // 未初始化的全局变量
int global_variable = 34;   // 声明一个全局变量,它位于代码段中
 
void print_stack_addresses() {
    int a = 10;
    int b = 20;
    printf("栈中变量a的地址      : %p\n", &a);
    printf("栈中变量b的地址      : %p\n", &b);
}
  
 
int main() {
     
    int local_variable;     // 声明一个局部变量
    float x = 12;    // 已初始化的局部变量;
  float y = 21;   //未初始化的局部变量;
  
  int* heap_variable = (int*)malloc(sizeof(int));   // 动态分配内存,位于堆段 
  
    
    printf("已初始化(全局)数据段的地址:%p\n", &X);    // 打印已初始化数据段的地址
    
    printf("未初始化(全局)数据段的地址:%p\n", &Y);     // 打印未初始化数据段的地址
    
    printf("已初始化(局部)数据段的地址:%p\n", &x);    // 打印已初始化数据段的地址
    
    printf("未初始化(局部)数据段的地址:%p\n", &y);    // 打印未初始化数据段的地址
    
    printf("已初始化(全局)代码段的地址:%p\n", &global_variable);    // 打印代码段中的全局变量地址
    
    printf("未初始化(局部)代码段的地址:%p\n", &local_variable);   // 打印代码段中局部变量的地址
    
    printf("堆段变量的地址     :%p\n", heap_variable);   // 打印堆段变量的地址
   
  print_stack_addresses();
  
  FILE* file_pointer;
    char* filename = "test.txt"; // 文件名
 
    // 打开文件
    file_pointer = fopen(filename, "r");
    if (file_pointer == NULL) {
        perror("无法打开文件");
        return 1;
    }
 
    // 获取文件内存地址
    printf("文件 \"%s\" 的内存地址是:%p\n", filename, (void*)file_pointer);
 
    // 关闭文件
    fclose(file_pointer);
 
   
    return 0;
}
 
相关文章
|
8月前
|
缓存
内存学习(三):物理地址空间
内存学习(三):物理地址空间
248 0
|
8月前
|
存储 Linux 编译器
进程的虚拟地址空间
进程的虚拟地址空间
|
存储 Linux
虚拟地址空间
虚拟地址空间
94 0
|
Linux 编译器 C++
【看表情包学Linux】进程地址空间 | 区域和页表 | 虚拟地址空间 | 初识写时拷贝
【看表情包学Linux】进程地址空间 | 区域和页表 | 虚拟地址空间 | 初识写时拷贝
132 0
|
8月前
|
存储 缓存 Unix
内存学习(一):物理地址空间内存概述
内存学习(一):物理地址空间内存概述
104 0
|
8月前
|
缓存 算法 Linux
Linux内存管理宏观篇(六)物理内存:分配小内存块
Linux内存管理宏观篇(六)物理内存:分配小内存块
119 1
|
8月前
|
搜索推荐 Linux
内存学习(二):物理地址空间虚拟地址空间布局
内存学习(二):物理地址空间虚拟地址空间布局
417 0
|
存储 缓存 算法
指令空间
指令空间(Instruction Space)是计算机系统中用于存储和执行指令的区域。指令空间包括处理器内部的寄存器、指令缓存(Instruction Cache)以及内存中的代码段(Code Segment)等。指令空间的作用是接收、存储和处理来自外部设备或程序的指令,从而实现计算机系统的功能。
101 4
|
Linux 定位技术 虚拟化
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
61 0
|
存储 编译器 虚拟化
学习系统编程No.5【虚拟地址空间】
北京时间:2023/2/22,离补考期末考试还有5天,不慌,刚午觉睡醒,闹钟2点20,拖到2点50,是近以来,唯一一次有一种睡不醒的感觉,但是现在却没有精神,因为听了一首歌(当然洗脸更重要),天后孙燕姿的《直来直往》,三天170遍,上头,感兴趣的小伙伴可以去尝试一下哦!上篇博客我们学习了系统中环境变量等知识,现在我们接着系统环境变量的知识,来学习一下进程地址空间的相关知识