查看機器上棧大小命令
ulimit -a
或者
ulimit -s
大小不固定飘诗,可以用 ulimit -s 進行調(diào)整,默認一般為 8M
棧區(qū)(stack sagment):由操作系統(tǒng)自動分配釋放 仓犬,存放函數(shù)的參數(shù)值,局部變量的值等。 如果申請的空間超過棧的剩余空間時废菱,將提示overflow。因此抖誉,能從棧獲得的空間較小殊轴。棧大小是有默認值的,如果申請的臨時變量太大的話就會超過棧大小袒炉,造成棧溢出旁理。
堆棧溢出就是不顧堆棧中分配的局部數(shù)據(jù)塊大小(在棧中分配的局部數(shù)據(jù)塊大小和局部變量的聲明的大小有關),向該數(shù)據(jù)塊寫入了過多的數(shù)據(jù)我磁,導致數(shù)據(jù)越界孽文,結果覆蓋了老的堆棧數(shù)據(jù)(包括函數(shù)的返回地址)。 或者解釋為在長字符串中嵌入一段代碼夺艰,并將過程的返回地址覆蓋為這段代碼的地址芋哭,這樣當過程返回時,程序就轉(zhuǎn)而開始執(zhí)行這段自編的代碼了.這東西很像病毒郁副。
堆(heap):一般由程序員分配釋放减牺, 若程序員不釋放,程序結束時可能由OS回收霞势,分配方式倒是類似于鏈表烹植。堆是用于存放進程運行中被動態(tài)分配的內(nèi)存段,它的大小并不固定愕贡,可動態(tài)擴張或縮減草雕。當進程調(diào)用malloc等函數(shù)分配內(nèi)存時,新分配的內(nèi)存就被動態(tài)添加到堆上(堆被擴張)固以;當利用free等函數(shù)釋放內(nèi)存時墩虹,被釋放的內(nèi)存從堆中被剔除(堆被縮減)
BSS段:存放的是未初始化的全局變量和靜態(tài)變量嘱巾。BSS是英文Block Started by Symbol的簡稱。BSS段屬于靜態(tài)內(nèi)存分配诫钓。
數(shù)據(jù)段:初始化過的數(shù)據(jù)(Data)旬昭,存放已初始化的全局變量、靜態(tài)變量(全局和局部)菌湃、常量數(shù)據(jù)问拘。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。
代碼段:存放CPU執(zhí)行的機器指令惧所,代碼區(qū)是可共享骤坐,并且是只讀的。這部分區(qū)域的大小在程序運行前就已經(jīng)確定
用戶空間就是用戶進程所在的內(nèi)存區(qū)域下愈,相對的纽绍,系統(tǒng)空間就是操作系統(tǒng)占據(jù)的內(nèi)存區(qū)域。用戶進程和系統(tǒng)進程的所有數(shù)據(jù)都在內(nèi)存中势似。
為什么要劃分用戶空間和系統(tǒng)空間呢拌夏?當然是有必要的。操作系統(tǒng)的數(shù)據(jù)都是存放于系統(tǒng)空間的履因,用戶進程的數(shù)據(jù)是存放于用戶空間的障簿。分開來存放,就讓系統(tǒng)的數(shù)據(jù)和用戶的數(shù)據(jù)互不干擾栅迄,保證系統(tǒng)的穩(wěn)定性卷谈。分開存放,管理上很方便霞篡,而更重要的是世蔗,將用戶的數(shù)據(jù)和系統(tǒng)的數(shù)據(jù)隔離開,就可以對兩部分的數(shù)據(jù)的訪問進行控制朗兵。這樣就可以確保用戶程序不能隨便操作系統(tǒng)的數(shù)據(jù)污淋,這樣防止用戶程序誤操作或者是惡意破壞系統(tǒng)。處于用戶態(tài)的程序只能訪問用戶空間余掖,而處于內(nèi)核態(tài)的程序可以訪問用戶空間和內(nèi)核空間寸爆。
Linux使用兩級保護機制:0級供內(nèi)核使用,3級供用戶程序使用盐欺,每個進程有各自的私有用戶空間(0~3G)赁豆,這個空間對系統(tǒng)中的其他進程是不可見的,最高的1GB字節(jié)虛擬內(nèi)核空間則為所有進程以及內(nèi)核所共享冗美。
用戶態(tài)切換到內(nèi)核態(tài)的3種方式
a. 系統(tǒng)調(diào)用
這是用戶態(tài)進程主動要求切換到內(nèi)核態(tài)的一種方式魔种,用戶態(tài)進程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務程序完成工作,比如fork()實際上就是執(zhí)行了一個創(chuàng)建新進程的系統(tǒng)調(diào)用粉洼。而系統(tǒng)調(diào)用的機制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實現(xiàn)节预,例如Linux的int 80h中斷叶摄。
b. 異常
當CPU在執(zhí)行運行在用戶態(tài)下的程序時,發(fā)生了某些事先不可知的異常安拟,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關程序中蛤吓,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁異常糠赦。
c. 外圍設備的中斷
當外圍設備完成用戶請求的操作后会傲,會向CPU發(fā)出相應的中斷信號,這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應的處理程序拙泽,如果先前執(zhí)行的指令是用戶態(tài)下的程序唆铐,那么這個轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤讀寫操作完成奔滑,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等。
這3種方式是系統(tǒng)在運行時由用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的最主要方式顺少,其中系統(tǒng)調(diào)用可以認為是用戶進程主動發(fā)起的朋其,異常和外圍設備中斷則是被動的。