趣談Linux操做系統學習筆記:第二十講

1、引子

一、計算兩方面的緣由

二、內存管理機制

 

2、獨享內存空間的原理

一、會議室和物理內存的關係編程

和會議室同樣,內存都被分紅一塊塊兒的,都編號了號,例如3F-10就是三樓十號會議室、內存頁有這樣一個地址。這個地址是實實在在的地址,經過這個地址咱們就可以定位到物理內存地址數據結構

二、會產生什麼問題呢?dom

3F-10打開三個相同的程序,都執行到某一步,比方說,打開三個計算機器,用戶在這三個程序的界面、上分別輸入十、100、1000,若是內存中的這個位置只能保存一個數,函數

那應該保存那個呢?這不就衝突了嗎?spa

三、誰也不能直接訪問物理地址
操作系統

每一個項目的物理地址對於進程不可見,誰也不能直接訪問物理地址,操做系統會給進程分配一個虛擬地址。全部進程看到的這個地址都是同樣的,裏面的內存都是從0開始編號3d

四、在程序裏面,指令寫入的地址是虛擬地址blog

例如,位置我10M的內存區域,操做系統會提供一種機制,將不一樣的進程的虛擬地址和不一樣的物理地址映射起來進程

當程序要訪問虛擬地址的時候,由內核的數據結構轉換,轉換成不一樣的物理地址,這樣不一樣的進程運行的是時候,寫入的是不一樣的物理地址這樣就不會衝突了內存

3、規劃地址空間

一、操做系統的內存管理,主要分爲三個方面

因而,你看待了項目組的項目計劃是這樣一個程序

#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 格式的。

 4、總結時刻

經過這一節,你應該知道,一個內存管理系統至少應該作三件事情:


第一,虛擬內存空間的管理,每一個進程看到的是獨立的、互不干擾的虛擬地址空間;

第二,物理內存的管理,物理內存地址只有內存管理模塊可以使用;

第三,內存映射,須要將虛擬內存和物理內存映射、關聯起來

相關文章
相關標籤/搜索