程序位址空間相關的知識在部落格:【linux】程序位址空間 ,核心模組的相關介紹與基本操作在:【linux】核心模組的插入與刪除,建議看完基礎知識再來學習列印程序位址空間。
#include
#include
#include
int a;
int b=0;
int c=2;
static
int d;
static
int e=0;
static
int f=4;
const
int g=5;
static
char h=6;
intmain
(void
)
該程式有未初始化或初值為0的全域性變數和靜態區域性變數(對應bss段),已初始化且初值非0的全域性變數和靜態區域性變數(對應資料段),區域性變數(對應棧區),malloc()函式生成的空間(堆動態分配)等。
執行程式結果:
該程式主要將**中的各種資料的存放位址、程序的pid進行了列印
程式執行先不要關閉,保持這個介面,開啟另乙個終端
編寫核心模組:print_vma.c
#include
#include
#include
#include
#include
static pid_t pid;
//向模組傳遞引數,檔案的許可權為0644
module_param
(pid,
int,
0644);
intprint_vma
(void
)up_read
(&mm->mmap_sem)
;return0;
}static
int __init print_vma_init
(void
)static
void __exit print_vma_exit
(void
)module_init
(print_vma_init)
;module_exit
(print_vma_exit)
;module_license
("gpl"
);
makefile檔案:
obj-m:=print_vma.o #產生print_vma模組的目標檔案
#目標檔案 檔案 要與模組名字相同
current_path:=$(shell pwd) #模組所在的當前路徑
linux_kernel:=$(shell uname -r) #linux核心**的當前版本
linux_kernel_path:=/usr/src/linux-headers-$(linux_kernel)
all:
make -c $(linux_kernel_path) m=$(current_path) modules #編譯模組
#[tab] 核心的路徑 當前目錄編譯完放哪 表明編譯的核心模組
clean:
make -c $(linux_kernel_path) m=$(current_path) clean #清理模組
插入模組:
檢視列印資訊:
Linux程序虛擬記憶體簡介
使用者態和核心態 程序在執行時一般存在兩種狀態 使用者態 核心態。使用者態是指程序在執行使用者 核心態時指程序在執行核心 所以在linux中每個程序都存在兩個棧分別使用者使用者態和核心態的執行。使用者空間和核心空間 在32位系統中linux程序的虛擬記憶體為4gb,linux核心將這4g位元組的空間...
Linux程序的虛擬記憶體
使用者程序的虛擬位址空間是linux的乙個重要的抽象 它為每個執行程序提供了同樣的系統檢視,這使得多個程序可以同時執行,而不會干擾到其他程序記憶體中的內容。每個應用程式都有自己的線性位址空間,與所有其他應用程式隔開。各程序虛擬位址空間起始於0,延伸到task sieze 1,其上是核心位址空間。使用...
程序虛擬記憶體模型
以32位的作業系統為例,32位的作業系統每個程序對應的虛擬記憶體為4g 232 其中核心區1g,使用者區3g 程序控制塊pcb 1.pcb是程序存在的資料結構,系統通過pcb的存在而感知程序的存在 2.系統通過pcb對程序進行排程和管理 3.程序 pcb 與pid是一對一關係,而與程式檔案之間是多對...