linux模組 列印程序虛擬記憶體空間

2021-10-25 03:41:58 字數 1927 閱讀 1812

程序位址空間相關的知識在部落格:【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是一對一關係,而與程式檔案之間是多對...