一、会议室和物理内存的关系编程
和会议室同样,内存都被分红一块块儿的,都编号了号,例如3F-10就是三楼十号会议室、内存页有这样一个地址。这个地址是实实在在的地址,经过这个地址咱们就可以定位到物理内存地址数据结构
二、会产生什么问题呢?dom
3F-10打开三个相同的程序,都执行到某一步,比方说,打开三个计算机器,用户在这三个程序的界面、上分别输入十、100、1000,若是内存中的这个位置只能保存一个数,函数
那应该保存那个呢?这不就冲突了吗?spa
三、谁也不能直接访问物理地址
操作系统
每一个项目的物理地址对于进程不可见,谁也不能直接访问物理地址,操做系统会给进程分配一个虚拟地址。全部进程看到的这个地址都是同样的,里面的内存都是从0开始编号3d
四、在程序里面,指令写入的地址是虚拟地址blog
例如,位置我10M的内存区域,操做系统会提供一种机制,将不一样的进程的虚拟地址和不一样的物理地址映射起来进程
当程序要访问虚拟地址的时候,由内核的数据结构转换,转换成不一样的物理地址,这样不一样的进程运行的是时候,写入的是不一样的物理地址这样就不会冲突了内存
因而,你看待了项目组的项目计划是这样一个程序
#include <stdio.h> #include <stdlib.h> int max_length = 128; char * generate(int length){ int i; char * buffer = (char*) malloc (length+1); if (buffer == NULL) return NULL; for (i=0; i<length; i++){ buffer[i]=rand()%26+'a'; } buffer[length]='\0'; return buffer; } int main(int argc, char *argv[]) { int num; char * buffer; printf ("Input the string length : "); scanf ("%d", &num); if(num > max_length){ num = max_length; } buffer = generate(num); printf ("Random string is: %s\n",buffer); free (buffer); return 0; }
这个程序比较简单,就是根据用户输入的整数来生成字符串,最长是128,因为字符串的长度不固定、于是不能提早知道,
须要动态地分配内存,是用malloc函数,固然用完了须要释放内存,这就是要使用free函数
一、那些内存的几种方式
二、内核部分还须要分配内存
三、上面的这些地址应该用虚拟地址访问呢?仍是应该用物理地址访问呢?
真正可以使用会议室物理地址的,只有会议室管理部门,
全部其余部分的行为涉及访问会议室的,都须要通通使用虚拟地址、通通到会议室管理部门哪里转换一道,才能进行统一的控制
用户态的进程的进程使用虚拟地址,这点毫无你问,内核态的页基本都是使用虚拟地址,
一、一大片连续的内存
二、这个么大的空间都存些什么内容呀
虽然内核代码权限很大,可是可以使用的虚拟地址范围也只能在内核空间,也即内核代码访问内核数据结构,只能用30号到39号这些编程,不能用0-29号,
由于这些事被金额呈空间占用的,并且、进程有不少个、你如今在内核,可是你不知道当前指的0号是那进程的0号
在内核里面也会有内核的代码,一样有 Text Segment、Data Segment 和BSS Segment,别忘了我们讲内核启动的时候,内核代码也是 ELF 格式的。
经过这一节,你应该知道,一个内存管理系统至少应该作三件事情:
第一,虚拟内存空间的管理,每一个进程看到的是独立的、互不干扰的虚拟地址空间;
第二,物理内存的管理,物理内存地址只有内存管理模块可以使用;
第三,内存映射,须要将虚拟内存和物理内存映射、关联起来