導航:首頁 > 操作系統 > linux設置堆棧

linux設置堆棧

發布時間:2022-09-10 12:33:16

linux下的系統調用為什麼不能使用用戶態堆棧

您好,很高興為您解答。 1.進程的堆棧 內核在創建進程的時候,在創建task_struct的同事,會為進程創建相應的堆棧。每個進程會有兩個棧,一個用戶棧,存在於用戶空間,一個內核棧,存在於內核空間。當進程在用戶空間運行時,cpu堆棧指針寄存器里...
里...

㈡ linux 設置堆棧大小 為無限制

你好。

執行命令ulimit -a,查看棧大小的限制。

通過使用 ulimit -s 數字 進行設置。

㈢ 進程內核棧,用戶棧及 Linux 進程棧和線程棧的區別

1.進程的堆棧
內核在創建進程的時候,在創建task_struct的同事,會為進程創建相應的堆棧。每個進程會有兩個棧,一個用戶棧,存在於用戶空間,一個內核棧,存 在於內核空間。當進程在用戶空間運行時,cpu堆棧指針寄存器裡面的內容是用戶堆棧地址,使用用戶棧;當進程在內核空間時,cpu堆棧指針寄存器裡面的內 容是內核棧空間地址,使用內核棧。
2.進程用戶棧和內核棧的切換
當進程因為中斷或者系統調用而陷入內核態之行時,進程所使用的堆棧也要從用戶棧轉到內核棧。
進程陷入內核態後,先把用戶態堆棧的地址保存在內核棧之中,然後設置堆棧指針寄存器的內容為內核棧的地址,這樣就完成了用戶棧向內核棧的轉換;當進程從內 核態恢復到用戶態之行時,在內核態之行的最後將保存在內核棧裡面的用戶棧的地址恢復到堆棧指針寄存器即可。這樣就實現了內核棧和用戶棧的互轉。
那麼,我們知道從內核轉到用戶態時用戶棧的地址是在陷入內核的時候保存在內核棧裡面的,但是在陷入內核的時候,我們是如何知道內核棧的地址的呢?
關鍵在進程從用戶態轉到內核態的時候,進程的內核棧總是空的。這是因為,當進程在用戶態運行時,使用的是用戶棧,當進程陷入到內核態時,內 核棧保存進程在內核態運行的相關信心,但是一旦進程返回到用戶態後,內核棧中保存的信息無效,會全部恢復,因此每次進程從用戶態陷入內核的時候得到的內核 棧都是空的(為什麼?)。所以在進程陷入內核的時候,直接把內核棧的棧頂地址給堆棧指針寄存器就可以了。
3.內核棧的實現
內核棧在kernel-2.4和kernel-2.6裡面的實現方式是不一樣的。
在kernel-2.4內核裡面,內核棧的實現是:
Union task_union {
Struct task_struct task;
Unsigned long stack[INIT_STACK_SIZE/sizeof(long)];
};
其中,INIT_STACK_SIZE的大小隻能是8K。

㈣ Linux c++ 如何自定義程序的堆棧大小

函數是C語言的基本構件,是所有程序活動的舞台。函數的一般形式是:type-specifierfunction_name(parameterlist)parameterdeclarations{bodyofthefunction}具體參考:

㈤ linux棧設置太大有沒有什麼壞處

電腦硬體有內存,針對不同的軟體,將內存分為不同的層次,linux將內存分為棧和堆,至於進程與線程的區別,進程是一個完成的程序在運行時載入到內存中,而線程是包含在進程中的,一個進程中是有一個或者多個線程的。進程棧存儲進程,線程棧存儲線程。

㈥ Redhat Linux中怎樣自動設置線程堆棧大小

不是可以直接用線程屬性進行設置嗎?

我寫了一個小程序。如下:

#include <pthread.h>
#include <limits.h>#define Thread_NUM 5void *MultiThread_soap_serve(){ sleep(5); printf("new pthread!!\n");}//PTHREAD_STACK_MIN 經過計算是16K。//64*16K = 1M,線程堆棧應該是夠用的。#define MICHAEL_SET_PTHREAD_STACK_SIZE 64int main(){ pthread_attr_t attr; pthread_attr_init(&attr); size_t stacksize = MICHAEL_SET_PTHREAD_STACK_SIZE*PTHREAD_STACK_MIN; //stacksize =PTHREAD_STACK_MIN; //stackaddr=(void*)malloc((N+1)*PTHREAD_STACK_MIN); //pthread_attr_getstack(&attr,&statckattr,&stacksize); //pthread_attr_setstack(&attr,stackaddr,); pthread_attr_setstacksize(&attr,stacksize); int iThreadNum = 0; pthread_t PSoapThread[Thread_NUM]; for ( ; iThreadNum < Thread_NUM ; iThreadNum++ ) { pthread_create(&PSoapThread[iThreadNum],&attr,MultiThread_soap_serve,(void *)NULL); } pthread_attr_destroy(&attr); while(1) { sleep(10); printf("main!!\n"); }}

㈦ linux程序設計:堆和棧的區別

一、預備知識—程序的內存分配
一個由C/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其
操作方式類似於數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回
收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的
全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另
一塊區域。 - 程序結束後由系統釋放。
4、文字常量區 —常量字元串就是放在這里的。 程序結束後由系統釋放
5、程序代碼區—存放函數體的二進制代碼。

二、例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456/0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456"); 123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"
優化成一個地方。
}

二、堆和棧的理論知識
2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變數 int b; 系統自動在棧中為b開辟空

heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = new char[10];
但是注意p1、p2本身是在棧中的。

2.2
申請後系統的響應
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢
出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,
會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表
中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的
首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。
另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部
分重新放入空閑鏈表中。

2.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意
思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有
的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將
提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲
的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小
受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

2.4申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是
直接在進程的地址空間中保留一塊內存,雖然用起來最不方便。但是速度快,也最靈活。

2.5堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可
執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧
的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地
址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容由程序員安排。

2.6存取效率的比較

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在棧上的數組比指針所指向的字元串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字元串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到
edx中,再根據edx讀取字元,顯然慢了。

2.7小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就 走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自 由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由

㈧ 怎麼解決 LINUX 堆棧溢出內存的問題

一般是由於數組指針訪問越界;
或者是野指針造成
解決的辦法:可以將代碼按功能段,一段一段測試,
//測試一塊代碼時,先注釋掉其它代碼

找出錯誤出現的地方,修正
如果,因為程序里使用的堆棧大小大於默認的造成出錯
需要修改默認的堆棧大小的值

㈨ 如何設置堆棧不可執行和ASLR

2.Select System & Maintenance 3.Click System 4.Click Advanced System Settings 5.Click the Advanced tab 6.Click Performance Settings Default is enabled.System option:ASLR is enabled by default. I don』t find the way to disable it.站群廈門seo。 But,站群廈門seo公司。 it can only run well based on enabling DEP/ NX.Microsoft's Windows Vista (released January 2007), Windows Server 2008,站群廈門seo招聘。 Windows 7,站群廈門seo顧問。 and Windows Server 2008 R2 have ASLR enabled by default, 站群友情鏈接。 although only for those executables and dynamic link libraries specifically linked to be ASLR-enabled.如何設置堆棧不可施行和A淘寶客如何推廣SLR。[7] This did not include Internet Explorer 7 on Windows Vista prior to Service Pack 1; ASLR and DEP are both disabled for application compatibility purposes.jimmyleeee的專欄。,站群頻道。Process (Link) Option: -Wl,-z,noexecstack or -Wa,--noexecstackSystem option: /proc/sys/kernel/exec-shieldCompiler Option: /proc/sys/kernel/randomize_va_space,站群軟體。Orsysctl -w kernel.randomize_va_space=NEWVALUELinux has enabled a weak[6] form of ASLR by default since kernel version 2.6.NET。12 (released June 2005).如何。1) 堆棧檢測維持設置:OSCompiler flagWindows/GSLinux-fstack-protector-all -fstack-protector randomize_va_space 的可能值如下:ValueDescription0ASLR is disabled1All supported formsof ASLR are enabled, except heap randomization,不可。2All supported formsof ASLR are enabled.exec-shield的取值如下:ValueDescription0Exec-shield (includingrandomized VM mapping) is disabled for all binaries, marked or not,施行。1Exec-shield is enabled forall marked binaries (default),a。2Exec-shield is enabled forall binaries, regardless of marking (to be used for testing purposes ONLY),淘寶。在linux偽原創下,還有一個execstack 的命令可能設置庫可能可執行文件的堆棧執行維持標志。

閱讀全文

與linux設置堆棧相關的資料

熱點內容
c語言編譯之後如何運行 瀏覽:564
mfc多線程編程視頻 瀏覽:408
c編譯的中文怎麼寫 瀏覽:91
單片機連接蜂鳴器電路 瀏覽:844
程序員買房前後對比照 瀏覽:988
cmdjava中文亂碼 瀏覽:947
窗口app哪個好 瀏覽:731
xzforandroid 瀏覽:577
程序員那麼可愛歌曲完整版 瀏覽:906
為什麼購買pdf 瀏覽:45
操作系統代碼編譯 瀏覽:483
程序員東北大學 瀏覽:426
編譯忽略空字元 瀏覽:117
多店鋪阿里雲伺服器教程 瀏覽:378
單片機求初值 瀏覽:420
安卓機如何在電腦備份圖片 瀏覽:925
ca證書加密機價格 瀏覽:798
天乾地支年份演算法 瀏覽:797
程序員打造的視頻 瀏覽:7
java和php通信 瀏覽:681