虛擬地址空間由硬盤(pán)提供, 映射到實(shí)際內(nèi)存, 代表內(nèi)存可用的最大數(shù)據(jù)量, 實(shí)際使用以內(nèi)存實(shí)際占用量為準(zhǔn).
動(dòng)態(tài)庫(kù)存放在虛擬地址空間的共享庫(kù)段, 其位置無(wú)關(guān)(PIC)指哪里空閑加載到哪里(使用相對(duì)地址). 靜態(tài)庫(kù)每次運(yùn)行都存放在代碼段的同一位置, 使用絕對(duì)地址, 位置相關(guān).
全局變量未初始化時(shí)為0, 局部變量未初始化時(shí)為隨機(jī)值
棧向下生長(zhǎng), 堆向上增長(zhǎng).
ELF(可執(zhí)行程序部分)大體分為4段: .bss和.data分別是未初始化和已初始化的全局變量/靜態(tài)局部變量, 可讀寫(xiě), 統(tǒng)稱(chēng)為全局?jǐn)?shù)據(jù)區(qū). .rodata(只讀數(shù)據(jù)段)和.text(代碼段)一般是只讀, 該部分還包括符號(hào)段. 這四段可以被放在一個(gè)頁(yè)中, 大小4k.
使用fopen創(chuàng)建的FILE*對(duì)象結(jié)構(gòu)體中存在的文件描述符(FD)就放在PCB中.
一個(gè)進(jìn)程最多打開(kāi)1024-3個(gè)文件. 012為標(biāo)準(zhǔn)輸入輸出和錯(cuò)誤, 1號(hào)標(biāo)準(zhǔn)輸出就是作為fd輸出到屏幕上, 如write(1, buf, sizeof(buf))
. 012對(duì)應(yīng)的是同一個(gè)文件/dev/tty, 只是輸出不同. tty是虛擬終端, 由linux多用戶共享.
標(biāo)準(zhǔn)C庫(kù)函數(shù)(getc, putc)自帶一個(gè)緩沖區(qū), 每次讀滿了才執(zhí)行一次寫(xiě)操作, 其內(nèi)部調(diào)用的仍是系統(tǒng)層的read和write, 所以速度要比每個(gè)字節(jié)都調(diào)用一次系統(tǒng)的read和write要快.
用戶態(tài)進(jìn)入內(nèi)核態(tài)
通過(guò)軟中斷(產(chǎn)生0x80編程異常)的方式, 查詢中斷向量表, 然后通過(guò)system_call()函數(shù)查詢系統(tǒng)調(diào)用表. 系統(tǒng)調(diào)用函數(shù)的參數(shù)保存在寄存器中.
線程共享和獨(dú)享
線程共享進(jìn)程地址空間, 代碼段, data段, 文件描述符
線程獨(dú)享?xiàng)? 寄存器, 程序計(jì)數(shù)器, 線程的信號(hào)屏蔽字(阻塞信號(hào)集)