国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

如何將網(wǎng)站指向404微信5000人接推廣費(fèi)用

如何將網(wǎng)站指向404,微信5000人接推廣費(fèi)用,dw制作簡(jiǎn)單網(wǎng)站模板下載地址,可以用自己電腦做網(wǎng)站服務(wù)器嗎文章目錄 一、 程序地址空間回顧1.程序地址空間各區(qū)域分布驗(yàn)證2.引入虛擬地址概念 二、進(jìn)程地址空間&#xff08;虛擬地址空間&#xff09;的管理三、虛擬地址空間的作用 一、 程序地址空間回顧 1.程序地址空間各區(qū)域分布驗(yàn)證 #include <stdio.h> #include <unistd.h…

文章目錄

  • 一、 程序地址空間回顧
    • 1.程序地址空間各區(qū)域分布驗(yàn)證
    • 2.引入虛擬地址概念
  • 二、進(jìn)程地址空間(虛擬地址空間)的管理
  • 三、虛擬地址空間的作用


一、 程序地址空間回顧

1.程序地址空間各區(qū)域分布驗(yàn)證

在這里插入圖片描述

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int g_unval;
int g_val = 100;int main(int argc, char *argv[], char *env[])
{const char *str = "helloworld";printf("code addr: %p\n", main);printf("read only string addr: %p\n", str);static int test = 10; printf("init global addr: %p\n", &g_val);printf("test static addr: %p\n", &test); printf("uninit global addr: %p\n", &g_unval);char *heap_mem = (char*)malloc(10);char *heap_mem1 = (char*)malloc(10);char *heap_mem2 = (char*)malloc(10);printf("heap addr: %p\n", heap_mem);                                                                                                                     printf("heap addr: %p\n", heap_mem1); printf("heap addr: %p\n", heap_mem2); printf("stack addr: %p\n", &heap_mem); printf("stack addr: %p\n", &heap_mem1); printf("stack addr: %p\n", &heap_mem2); printf("argv[0]: %p\n", argv[0]);printf("env[0]: %p\n", env[0]); return 0;
}

這是在linux系統(tǒng)gcc編譯器中運(yùn)行的結(jié)果,在windows系統(tǒng)下的vs等編譯器運(yùn)行可能會(huì)有不同結(jié)果(因?yàn)閣indows系統(tǒng)下編譯器會(huì)優(yōu)化代碼執(zhí)行過(guò)程,從而影響結(jié)果):

code addr: 0x40057d
read only string addr: 0x400780
init global addr: 0x60103c
test static addr: 0x601040
uninit global addr: 0x601048
heap addr: 0x63e010
heap addr: 0x63e030
heap addr: 0x63e050
stack addr: 0x7ffd840398c0
stack addr: 0x7ffd840398b8
stack addr: 0x7ffd840398b0
argv[0]: 0x7ffd8403b803
env[0]: 0x7ffd8403b80f

各區(qū)域地址劃分是符合規(guī)則的:

  • 代碼區(qū)(正文代碼):存放可執(zhí)行的代碼(如:函數(shù)體的二進(jìn)制代碼)和 只讀常量。它們的地址是最小的
  • 靜態(tài)區(qū)(初始化數(shù)據(jù) 和 未初始化數(shù)據(jù)):存放全局變量 和 靜態(tài)數(shù)據(jù)。它們的地址只比代碼區(qū)大(未初始化數(shù)據(jù) 地址高于 初始化數(shù)據(jù))
  • 堆區(qū):使用malloc、calloc、realloc等函數(shù)動(dòng)態(tài)開(kāi)辟的空間。地址高于靜態(tài)區(qū),開(kāi)辟空間時(shí)地址向上增長(zhǎng)
  • 棧區(qū):棧區(qū)主要存放運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回?cái)?shù)據(jù)、返回地址等。地址高于堆區(qū),申請(qǐng)空間時(shí)地址向下增長(zhǎng)
  • 命令行參數(shù) 和 環(huán)境變量區(qū)域:地址高于棧區(qū)

最后,以一個(gè)問(wèn)題收尾,以上打印出來(lái)的所有地址都是真實(shí)對(duì)應(yīng)的物理地址嘛?
答:這些地址全都不是真實(shí)的物理地址,而是虛擬地址(解釋見(jiàn)下節(jié))

2.引入虛擬地址概念

從示例出發(fā),引出虛擬地址概念:

#include <stdio.h>    
#include <unistd.h>    
#include <stdlib.h>      int g_val = 0;    int main()    
{             pid_t id = fork();    if(id == 0)           { //child      while(1)    {           printf("child[%d], g_val: %d, &g_val: %p\n", getpid(), g_val, &g_val);    g_val++;                                                                  sleep(1);    }                }        else    { //parent    while(1)    {           printf("parent[%d], g_val: %d, &g_val: %p\n", getpid(), g_val, &g_val);    sleep(1);                                                                  }                }        return 0;    
}         

在這里插入圖片描述
同一個(gè)地址,怎么可能會(huì)查出來(lái)不同的值?
這側(cè)面證明了 用戶在語(yǔ)言層面中使用的地址根本就不是物理地址,而是虛擬地址。


虛擬地址具體是指什么?
在這里插入圖片描述
進(jìn)程的pcb(task_struct)中存放著虛擬地址空間(詳見(jiàn) “進(jìn)程地址空間的管理” )的起始地址,虛擬地址空間上的地址就是虛擬地址。
進(jìn)程的代碼和數(shù)據(jù)保存在內(nèi)存中。進(jìn)程在運(yùn)行時(shí),先找到虛擬地址,再通過(guò)頁(yè)表把虛擬地址轉(zhuǎn)換成物理地址,然后通過(guò)物理地址訪問(wèn)內(nèi)存中存放的代碼和數(shù)據(jù)。


解釋以上代碼運(yùn)行結(jié)果中的現(xiàn)象:同一個(gè)地址,查出來(lái)不同的值

我們自己寫(xiě)的可執(zhí)行程序(父進(jìn)程)運(yùn)行時(shí),使用fork函數(shù)創(chuàng)建子進(jìn)程, 創(chuàng)建出的子進(jìn)程是以父進(jìn)程為模板的,它的虛擬地址空間 和 頁(yè)表是父進(jìn)程的拷貝,它的pcb中內(nèi)容與父進(jìn)程大體相同,只修改了pid 和 ppid等少量屬性。 因?yàn)樽舆M(jìn)程的虛擬地址空間 和 頁(yè)表是父進(jìn)程的拷貝,所以頁(yè)表轉(zhuǎn)換的物理地址 指向 父進(jìn)程的代碼和數(shù)據(jù),剛創(chuàng)建出的子進(jìn)程共享父進(jìn)程的代碼 和 數(shù)據(jù)。
在這里插入圖片描述
子進(jìn)程和父進(jìn)程共享數(shù)據(jù),直到發(fā)生數(shù)據(jù)寫(xiě)入,一方要修改數(shù)據(jù)時(shí),為了維護(hù)進(jìn)程間數(shù)據(jù)的獨(dú)立性,一方修改數(shù)據(jù),不能影響另一方,該數(shù)據(jù)會(huì)進(jìn)行寫(xiě)實(shí)拷貝,對(duì)子進(jìn)程和父進(jìn)程的該數(shù)據(jù)進(jìn)行分離,這樣一方修改數(shù)據(jù)就不會(huì)影響另一方了。

比如:上述代碼中,子進(jìn)程剛創(chuàng)建出來(lái)的時(shí)候共享父進(jìn)程的數(shù)據(jù),子進(jìn)程共享父進(jìn)程的g_val變量,當(dāng)子進(jìn)程對(duì)g_val變量進(jìn)行修改的時(shí)候,為了維護(hù)進(jìn)程間數(shù)據(jù)的獨(dú)立性,要對(duì)子進(jìn)程和父進(jìn)程的該數(shù)據(jù)進(jìn)行分離,也就是對(duì)該數(shù)據(jù)進(jìn)行寫(xiě)實(shí)拷貝,具體步驟就是 在內(nèi)存開(kāi)辟一個(gè)新空間,然后把該內(nèi)容拷貝到新空間,最后將子進(jìn)程頁(yè)表中對(duì)應(yīng)的物理地址修改成新空間的地址。 子進(jìn)程的g_val變量 和 父進(jìn)程的g_val變量分離,子進(jìn)程對(duì)拷貝到新空間的g_val變量修改不會(huì)影響父進(jìn)程的g_val變量。
在這里插入圖片描述
需注意的是,寫(xiě)實(shí)拷貝的整個(gè)過(guò)程中,都不會(huì)對(duì)虛擬地址進(jìn)行修改,修改的是虛擬地址對(duì)應(yīng)的物理地址。 這就是同一個(gè)地址(虛擬地址),能查出來(lái)不同的值的原因:
子進(jìn)程的頁(yè)表是父進(jìn)程的拷貝,子進(jìn)程 和 父進(jìn)程的g_val變量的虛擬地址是一樣的。子進(jìn)程修改g_val時(shí),發(fā)生寫(xiě)實(shí)拷貝(修改的是虛擬地址對(duì)應(yīng)的物理地址),這時(shí)子進(jìn)程和父進(jìn)程的g_val變量的 虛擬地址仍然是一樣的,但它們的虛擬地址對(duì)應(yīng)的物理地址是不同的,所以同一個(gè)地址(虛擬地址),能查出來(lái)不同的值(數(shù)據(jù)存在物理地址對(duì)應(yīng)的空間中)

二、進(jìn)程地址空間(虛擬地址空間)的管理

理解虛擬地址空間:

在這里插入圖片描述
大富翁有很多的私生子,這些私生子彼此都不知道對(duì)方的存在。大富翁有十個(gè)億的資產(chǎn),他和每一個(gè)私生子都說(shuō):“我有10個(gè)億的資產(chǎn),等我去世之后,就由你繼承這些資產(chǎn)”。大富翁給每一個(gè)私生子畫(huà)大餅,于是每一個(gè)私生子都認(rèn)為自己以后能獨(dú)自擁有這10個(gè)億的資產(chǎn)。
大富翁平時(shí)對(duì)每一個(gè)私生子的要錢(qián)申請(qǐng)基本有求必應(yīng),當(dāng)然這些請(qǐng)求得在合理范圍,比如一次要個(gè)幾千、幾萬(wàn)、 甚至幾十萬(wàn)之類(lèi)。如果私生子的要錢(qián)請(qǐng)求過(guò)于高,比如一次要幾千萬(wàn)、一億、十億之類(lèi),大富翁會(huì)直接數(shù)落他一頓:“我還沒(méi)死呢,你就想掏空我的財(cái)產(chǎn)”,然后駁回他的請(qǐng)求。

在linux系統(tǒng)下,其實(shí)大富翁就相當(dāng)于操作系統(tǒng)(進(jìn)行內(nèi)存管理),私生子就相當(dāng)于進(jìn)程,操作系統(tǒng)給每一個(gè)進(jìn)程畫(huà)的大餅就叫虛擬地址空間(虛擬地址空間的地址編號(hào) 是和 內(nèi)存的物理地址編號(hào)一樣多的),相當(dāng)于操作系統(tǒng)跟每一個(gè)進(jìn)程都說(shuō):“你獨(dú)自享有整個(gè)內(nèi)存空間(其實(shí)是給每一個(gè)進(jìn)程配一個(gè)虛擬地址空間來(lái)哄騙它們)”。實(shí)際上,進(jìn)程運(yùn)行過(guò)程中,每一次申請(qǐng)內(nèi)存空間都不能過(guò)多,否則空間申請(qǐng)不會(huì)成功;每一個(gè)進(jìn)程的代碼和數(shù)據(jù)其實(shí)都只占據(jù)了內(nèi)存空間中的一小部分。


虛擬地址空間的實(shí)質(zhì):

虛擬地址空間本質(zhì)其實(shí)就是一個(gè)結(jié)構(gòu)體(不夠全面,后面補(bǔ)充虛擬地址空間本質(zhì)):struct mm_struct

進(jìn)程pcb(task_struct)中存放了指向 struct mm_struct 的指針

struct task_struct
{ ...struct mm_struct *mm; //對(duì)于普通的??進(jìn)程來(lái)說(shuō)該字段指向他的虛擬地址空間的??空間部分...
}
struct mm_struct
{...struct vm_area_struct *mmap; // 指向虛擬區(qū)間(VMA)鏈的開(kāi)頭...// 代碼段、數(shù)據(jù)段、堆棧段、參數(shù)段及環(huán)境段的起始和結(jié)束地址。	unsigned long start_code, end_code, start_data, end_data;unsigned long start_brk, brk, start_stack, end_stack;unsigned long arg_start, arg_end, env_start, env_end;
}

虛擬地址空間中劃分了很多分區(qū),要想描述虛擬地址空間,就得描述出其中的每一個(gè)分區(qū),struct mm_struct 就采取了記錄每一個(gè)分區(qū)的起始和結(jié)束地址的方式 來(lái)劃分出虛擬地址空間中的各個(gè)分區(qū) 如下:
在這里插入圖片描述
但實(shí)際上,只使用 struct mm_struct 是無(wú)法全面描述虛擬地址空間的。
注意到 struct mm_struct 中的struct vm_area_struct *mmap 指針變量還未被使用,要想全面描述虛擬地址空間,還得把這個(gè)指針變量使用起來(lái)。

先介紹一下 struct vm_area_struct :

struct vm_area_struct 
{unsigned long vm_start; // 虛擬內(nèi)存區(qū)域的起始unsigned long vm_end; // 虛擬內(nèi)存區(qū)域的結(jié)束struct vm_area_struct *vm_next, *vm_prev; // 前后指針struct mm_struct *vm_mm; // 回指所屬的 mm_structpgprot_t vm_page_prot; // 所屬分區(qū)的權(quán)限...
}

linux內(nèi)核使用 vm_area_struct 結(jié)構(gòu)來(lái)表示?個(gè)獨(dú)立的虛擬內(nèi)存區(qū)域(VMA)。由于虛擬地址空間不同分區(qū)的虛擬內(nèi)存區(qū)域功能和內(nèi)部機(jī)制都不同,因此?個(gè)進(jìn)程要使用多個(gè)vm_area_struct結(jié)構(gòu)來(lái)分別表示不同類(lèi)型的虛擬內(nèi)存區(qū)域。使用雙鏈表管理多個(gè)vm_area_struct結(jié)構(gòu)(描述一個(gè)進(jìn)程不同類(lèi)型的虛擬內(nèi)存區(qū)域),struct mm_struct中的mmap指針指向這個(gè)雙鏈表結(jié)構(gòu):在這里插入圖片描述

所以最終結(jié)論是:虛擬地址空間 = struct mm_struct + 內(nèi)核數(shù)據(jù)結(jié)構(gòu)(由 struct vm_area_struct 組成的雙鏈表)

struct mm_struct 描述了虛擬地址空間的整理情況(虛擬地址空間各個(gè)區(qū)域的劃分),由 struct vm_area_struct 組成的雙鏈表 描述了 虛擬地址空間各個(gè)區(qū)域的詳細(xì)信息(功能和內(nèi)部機(jī)制),它們共同構(gòu)建了虛擬地址空間。

三、虛擬地址空間的作用

  1. 增加了虛擬地址空間,虛擬地址就必須通過(guò)頁(yè)表轉(zhuǎn)換成物理地址才能去訪存,在地址轉(zhuǎn)換過(guò)程中進(jìn)行安全審核(比如:地址、權(quán)限檢查),變相保護(hù)了物理內(nèi)存的安全

假如代碼中使用的地址都是物理地址,那么如果進(jìn)程A的代碼中錯(cuò)誤的使用了一個(gè)野指針,而這個(gè)野指針又指向另一個(gè)進(jìn)程的數(shù)據(jù),對(duì)野指針指向的數(shù)據(jù)進(jìn)行修改。這樣會(huì)出大問(wèn)題,本來(lái)只是你一個(gè)進(jìn)程出問(wèn)題,又影響到其它進(jìn)程,這不符合進(jìn)程間的獨(dú)立性原則。
所以用戶在代碼中使用的地址絕對(duì)不可以是物理地址,而是要使用虛擬地址,在頁(yè)表進(jìn)行虛擬地址向物理地址的轉(zhuǎn)換過(guò)程中對(duì)這些不在頁(yè)表中的野指針地址進(jìn)行警告報(bào)錯(cuò)處理。
在這里插入圖片描述

實(shí)際上,頁(yè)表還有一列權(quán)限欄:

在這里插入圖片描述
(1)char * str = “hello world”;
// "hello world"是字符串常量,保存在代碼區(qū)(代碼區(qū)的權(quán)限是只讀),str指向該字符串常量起始地址

*str = ‘c’;
// 執(zhí)行這句代碼會(huì)報(bào)錯(cuò),而且報(bào)的是運(yùn)行時(shí)出錯(cuò)。解釋:運(yùn)行到這句代碼時(shí),要進(jìn)行訪存修改數(shù)據(jù),虛擬地址 向 物理地址轉(zhuǎn)換的過(guò)程中發(fā)現(xiàn)該地址對(duì)應(yīng)的權(quán)限是只讀,而此時(shí)要進(jìn)行的操作是寫(xiě)操作,沒(méi)有寫(xiě)權(quán)限,頁(yè)表阻止這次地址轉(zhuǎn)換,并進(jìn)行報(bào)錯(cuò)處理。

(2)const char * str = “hello world”;
// 如果定義字符串常量時(shí)加了const修飾;再進(jìn)行 *str = ‘c’ 操作時(shí),編譯器就會(huì)報(bào)編譯時(shí)出錯(cuò)。解釋:用const修飾,是告訴編譯器這是不能修改的數(shù)據(jù),編譯器知道這個(gè)信息后,就會(huì)對(duì)這個(gè)數(shù)據(jù)的寫(xiě)入操作進(jìn)行語(yǔ)法檢查,編譯器就能發(fā)現(xiàn) *str = ‘c’ 操作的語(yǔ)法錯(cuò)誤,語(yǔ)法檢查是編譯過(guò)程做的事,所以報(bào)的是編譯時(shí)出錯(cuò)。

  1. 進(jìn)程看待自己的代碼和數(shù)據(jù),全部都是"有序看待",這得益于虛擬地址空間的有序性

可執(zhí)行程序執(zhí)行時(shí),它的代碼和數(shù)據(jù)理論上可以加載到內(nèi)存上的任意位置,這也就意味著實(shí)際上可執(zhí)行程序的代碼和數(shù)據(jù)在內(nèi)存上的排布是隨機(jī)的、無(wú)序的。

但其實(shí)有了虛擬地址空間之后,進(jìn)程運(yùn)行時(shí),根本就不需要關(guān)心它的代碼和數(shù)據(jù)到底存放在內(nèi)存中的哪一個(gè)位置,進(jìn)程只需要和虛擬地址空間打交道就行,而虛擬地址空間的排版是非常有規(guī)律的,代碼地址存在代碼區(qū),局部變量地址存在棧區(qū),動(dòng)態(tài)開(kāi)辟空間的地址存在堆區(qū),得到這些虛擬地址后,后續(xù)操作由操作系統(tǒng)自動(dòng)完成:頁(yè)表將虛擬地址轉(zhuǎn)換成物理地址,再進(jìn)行訪存。


http://aloenet.com.cn/news/30126.html

相關(guān)文章:

  • 網(wǎng)站如何做促銷(xiāo)活動(dòng)推廣引流話術(shù)
  • 山東網(wǎng)站建設(shè)公司武漢做seo公司
  • 網(wǎng)站建設(shè)歸工商局管還是工信局管查關(guān)鍵詞排名軟件
  • 代做網(wǎng)站排名谷歌優(yōu)化推廣
  • 網(wǎng)站建設(shè)哪家最專(zhuān)業(yè)長(zhǎng)沙網(wǎng)絡(luò)營(yíng)銷(xiāo)學(xué)校
  • 定制開(kāi)發(fā)app到底要多少錢(qián)百度搜索引擎優(yōu)化指南最新版
  • 南海網(wǎng)站建設(shè)公司蘇州網(wǎng)站優(yōu)化排名推廣
  • 怎么查看網(wǎng)站收錄東營(yíng)seo
  • 哪個(gè)新聞網(wǎng)站好友情鏈接是啥意思
  • 做美工一般要收藏哪些網(wǎng)站友情鏈接軟件
  • wordpress tag 收錄肇慶seo按天收費(fèi)
  • 衡水企業(yè)做網(wǎng)站多少錢(qián)使用百度地圖導(dǎo)航收費(fèi)嗎
  • 長(zhǎng)沙銘萬(wàn)做網(wǎng)站上海網(wǎng)站快速排名優(yōu)化
  • 服裝廠網(wǎng)站模板營(yíng)銷(xiāo)策劃公司名稱(chēng)
  • 網(wǎng)站公安備案多久審核app推廣兼職是詐騙嗎
  • 廣州互聯(lián)網(wǎng)項(xiàng)目工作室seo外包公司怎么樣
  • h5網(wǎng)站建設(shè)的具體內(nèi)容企業(yè)營(yíng)銷(xiāo)網(wǎng)站
  • 上海網(wǎng)站建設(shè)管理推廣的渠道和方法有哪些
  • 鄭州建設(shè)企業(yè)網(wǎng)站百度一下 你就知道官方
  • ??谄髽I(yè)網(wǎng)站建設(shè)愛(ài)站網(wǎng)關(guān)鍵詞挖掘查詢工具
  • p2p網(wǎng)站開(kāi)發(fā)的多少錢(qián)一個(gè)產(chǎn)品的網(wǎng)絡(luò)營(yíng)銷(xiāo)方案
  • 大氣集團(tuán)網(wǎng)站源碼科學(xué)新概念seo外鏈平臺(tái)
  • 網(wǎng)站建設(shè)圖文百度網(wǎng)頁(yè)網(wǎng)址
  • 做網(wǎng)站購(gòu)買(mǎi)服務(wù)器國(guó)外常用的seo站長(zhǎng)工具
  • 企業(yè)網(wǎng)站建設(shè) 西寧公司網(wǎng)站域名續(xù)費(fèi)一年多少錢(qián)
  • 外貿(mào)免費(fèi)開(kāi)發(fā)網(wǎng)站建設(shè)網(wǎng)絡(luò)廣告營(yíng)銷(xiāo)方案策劃內(nèi)容
  • 佛山建站專(zhuān)寧波抖音seo搜索優(yōu)化軟件
  • 日文設(shè)計(jì)網(wǎng)站自動(dòng)點(diǎn)擊器下載
  • 海南??诰W(wǎng)站開(kāi)發(fā)公司怎么進(jìn)行網(wǎng)站推廣
  • 響應(yīng)式布局網(wǎng)頁(yè)seo入門(mén)教程視頻