中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

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

如何將網(wǎng)站指向404太原百度網(wǎng)站快速優(yōu)化

如何將網(wǎng)站指向404,太原百度網(wǎng)站快速優(yōu)化,國(guó)內(nèi)出名的室內(nèi)設(shè)計(jì)公司,路由器上建網(wǎng)站文章目錄 一、 程序地址空間回顧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://www.risenshineclean.com/news/35958.html

相關(guān)文章:

  • 煙臺(tái)網(wǎng)站建設(shè)哪家好呢網(wǎng)絡(luò)顧問(wèn)
  • 手機(jī)網(wǎng)站js特效個(gè)人博客登錄入口
  • 廣州建站模板搭建西安百度競(jìng)價(jià)開(kāi)戶
  • 作風(fēng)建設(shè)網(wǎng)站海曙seo關(guān)鍵詞優(yōu)化方案
  • 東莞微網(wǎng)站建設(shè)費(fèi)用深圳seo優(yōu)化公司排名
  • 成都市建設(shè)局官網(wǎng)seo優(yōu)化方式包括
  • 邯鄲網(wǎng)站建設(shè)安聯(lián)網(wǎng)絡(luò)nb抖音推廣引流平臺(tái)
  • 網(wǎng)站開(kāi)發(fā) 招標(biāo)采購(gòu)參數(shù)愛(ài)站網(wǎng)關(guān)鍵詞
  • 網(wǎng)站怎樣做優(yōu)化調(diào)整百度公司招聘崗位
  • 國(guó)內(nèi)建網(wǎng)站知名企業(yè)網(wǎng)站制作廠家有哪些
  • 網(wǎng)站開(kāi)發(fā)運(yùn)用到的相關(guān)技術(shù)百度競(jìng)價(jià)推廣方案的制定
  • 網(wǎng)站制作公司上海微信引流推廣
  • 做好網(wǎng)站建設(shè)的重要性app優(yōu)化建議
  • 做壞事小視頻網(wǎng)站企業(yè)培訓(xùn)計(jì)劃
  • 泰安百度做網(wǎng)站的百度搜索熱度排名
  • 涼山網(wǎng)站開(kāi)發(fā)推廣計(jì)劃怎么做
  • dreamweaver教程做網(wǎng)站新浪網(wǎng)今日烏魯木齊新聞
  • 網(wǎng)站搭建 審查重慶搜索排名提升
  • 做代還的人都聚集在哪些網(wǎng)站怎么開(kāi)網(wǎng)店
  • 渭南做網(wǎng)站怎么免費(fèi)創(chuàng)建個(gè)人網(wǎng)站
  • 自己0基礎(chǔ)怎么創(chuàng)業(yè)seo搜索引擎優(yōu)化人員
  • 網(wǎng)站建設(shè) 北京優(yōu)化網(wǎng)站建設(shè)
  • 東莞做網(wǎng)站那家好網(wǎng)站優(yōu)化聯(lián)系
  • 做網(wǎng)站推廣費(fèi)用網(wǎng)絡(luò)推廣代理
  • 做網(wǎng)站需要學(xué)什么蘇州seo網(wǎng)站管理
  • 可以加外鏈的網(wǎng)站成都網(wǎng)站推廣哪家專(zhuān)業(yè)
  • 沈陽(yáng)建設(shè)網(wǎng)站騰訊廣告推廣平臺(tái)入口
  • 北京網(wǎng)站搭建服務(wù)商南寧百度推廣排名優(yōu)化
  • 跨境電商單頁(yè)網(wǎng)站的詳情頁(yè)怎么做的如何推廣自己成為網(wǎng)紅
  • 永川做網(wǎng)站萬(wàn)能導(dǎo)航網(wǎng)