Linux核心模組程式設計(列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID)
(1) 設計一個模組,要求列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID。
1.首先,我們開始編寫模組程式碼,這是Linux核心程式設計的核心程式碼,程式碼如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init_task.h>
// 初始化函式
static int hello_init(void)
{
struct task_struct * p;
p = NULL;
p = &init_task;
printk(KERN_ALERT"名稱\t程序號\t狀態\t優先順序\t父程序號\t");
for_each_process(p)
{
if(p->mm == NULL){ //核心執行緒的mm成員為空
printk(KERN_ALERT"%s\t%d\t%ld\t%d\n",p->comm,p->pid, p->state,p->normal_prio,p->parent->pid);
}
}
return 0;
}
// 清理函式
static void hello_exit(void)
{
printk(KERN_ALERT"goodbye!\n");
}
// 函式註冊
module_init(hello_init);
module_exit(hello_exit);
// 模組許可申明
MODULE_LICENSE("GPL");
2.標頭檔案的宣告,module.h包含了大量載入模組所需要的函式和符號的定義;init.h包含了模組初始化和清理函式的定義。如果模組載入時允許使用者傳遞引數,模組還應該包含moduleparam.h標頭檔案。
3.接下來我們需要初始化函式,task_struct 結構定義在/usr/src/linux4.4.19/include/linux/sched.h 中,所以也需要在標頭檔案加入這個庫,而這個結構也包含了我們需要使用的PID之類的值,可以直接呼叫。當然了,這兩篇文章可以更好理解這個結構:
接下來,我們需要對我們定義的結構p初始化指標,否則會產生也指標,檔案也會報錯,因此,我們需要用到init_task,並且在標頭檔案加入init_task.h庫。
4.然後,我們用for_each_process遍歷我們的每一個程序,並輸出我們需要得到的程序資訊。
5.最後是函式註冊已經模組許可宣告,這是必須加入的。
6.編譯Makefile
obj-m:=module1.o
KDIR:= /lib/modules/$(shell uname -r)/build
PWD:= $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
7.make後使用insmod加入模組
8.dmesg顯示使用情況,我的如圖所示。
(2) 設計一個帶引數的模組,其引數為某個程序的 PID 號,該模組的功能是列出該程序的家族資訊,包括父程序、兄弟程序和子程序的程式名、PID 號。
1.我的程式碼如下:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include <linux/sched.h>
#include <linux/moduleparam.h>
static pid_t pid=1;
module_param(pid,int,0644);
static int hello_init(void)
{
struct task_struct *p;
struct list_head *pp;
struct task_struct *psibling;
// 當前程序的 PID
p = pid_task(find_vpid(pid), PIDTYPE_PID);
printk("me: %d %s\n", p->pid, p->comm);
// 父程序
if(p->parent == NULL) {
printk("No Parent\n");
}
else {
printk("Parent: %d %s\n", p->parent->pid, p->parent->comm);
}
// 兄弟程序
list_for_each(pp, &p->parent->children)
{
psibling = list_entry(pp, struct task_struct, sibling);
printk("sibling %d %s \n", psibling->pid, psibling->comm);
}
// 子程序
list_for_each(pp, &p->children)
{
psibling = list_entry(pp, struct task_struct, sibling);
printk("children %d %s \n", psibling->pid, psibling->comm);
}
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"goodbye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
2.檢視當前程序的父程序
if(p->parent == NULL) {
printk("No Parent\n");
}
else {
printk("Parent: %d %s\n", p->parent->pid, p->parent->comm);
}
3.查詢當前程序的兄弟程序
list_for_each(pp, &p->parent->children)
{
psibling = list_entry(pp, struct task_struct, sibling);
printk("sibling %d %s \n", psibling->pid, psibling->comm);
}
4.查詢當前程序的子程序
list_for_each(pp, &p->children)
{
psibling = list_entry(pp, struct task_struct, sibling);
printk("children %d %s \n", psibling->pid, psibling->comm);
}
5.接下來的過程與第一個實驗基本一致,下圖是我的結果:
相關推薦
Linux核心模組程式設計(列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID)
(1) 設計一個模組,要求列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID。 1.首先,我們開始編寫模組程式碼,這是Linux核心程式設計的核心程式碼,程式碼如下: #include <linux/init.h&
設計一個模組,功能是列出系統中所有核心執行緒的程式名、PID號和程序狀態。
一、Linux的核心模組 核心模組是Linux核心向外部提供的一個插口,其全稱為動態可載入核心模組(Loadable Kernel Module,LKM),簡稱模組。Linux核心之所以提供模組機制,是因為它本身是一個單核心(monolithic kernel)。單核心的最大優點是效率高,因為所有的內容都整
Linux核心模組程式設計-proc檔案系統
什麼是proc proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊,如程序,是動態改變的,所以使用
Linux核心模組程式設計
Linux核心模組程式設計 (作者:Baron_wu 禁止轉載) 首先,建立一個核心模組並插入Linux核心中。這是實驗第一部分 首先檢視當前核心模組使用情概況:lsmod Module:模組名 Size:模組大小 Used by:這些模組在哪被使用 接下來編寫一個simple.c
linux 核心模組程式設計之LED驅動程式(六)
我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下 LED1 LED2 LED3 LED4
linux 核心模組程式設計之核心符號匯出(五)
/proc/kallsyms 記錄了核心中所有匯出的符號的名字與地址 我們需要編譯2個核心模組,然後其中一個核心模組去呼叫另一個核心模組中的函式 hello.c程式碼如下 #include <linux/module.h> #include <linux/in
linux 核心模組程式設計之模組引數(四)
通過巨集module_param指定模組引數,模組引數用於在載入模組時傳遞給模組。 module_param(name, type, perm) name是模組引數的名字 type是這個引數的型別,常見值:bool、int、charp(字串型) perm是模組
linux 核心模組程式設計之編譯多個原始檔(三)
編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE
linux 核心模組程式設計之hello word(二)
我們的目的是要編譯個hello.ko的檔案,然後安裝到核心中。 先來看下需要的程式碼,hello.c檔案如下 #include <linux/module.h> #include <linux/init.h> static int hello_init(vo
linux 核心模組程式設計之環境搭建(一)
這裡介紹些關於Tiny6410開發板核心的編譯,為後期驅動開發做前期的準備。 開發環境:64位的Ubuntu 14.01虛擬機器 目標機:友善之臂Tiny6410開發板 核心:linux-2.6.38-20110325.tar.gz 核心原始碼下載地址 htt
Linux核心模組程式設計——Hello World
一、實驗環境: 環境配置:VMware® Workstation 15 Pro、ubuntu Desktop 18.10、記憶體 2GB、處理器數量2、每個處理器核心數量1、硬碟大小30GB……還有一個就是用的咱Xidian的源(因為校內不需要流量啊,而且還很快!) 二、知識儲備
Linux核心模組程式設計系列1
1.準備工作 使用如下命令檢視自己Linux的核心版本 uname -a 結果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Lin
linux 核心模組程式設計
一個linux核心模組主要由以下幾個部分組成。 1、模組載入函式"用module_init()來指定"(必須) 當通過insmod和modprobe命令載入核心模組時,模組的載入函式會自動被核心執行,完成本模組的相關初始化工作。 linux模組載入函式一般以 __init表示宣告。典型宣告如下:: s
Linux核心模組程式設計——hello,world
檔案hello.c(放在目錄/root/lnq/modules/hello下): #include<linux/kernel.h> #include<linux/module.h
Linux核心模組程式設計與核心模組LICENSE -《詳解(第3版)》預讀
Linux核心模組簡介Linux核心的整體結構已經非常龐大,而其包含的元件也非常多。我們怎樣把需要的部分都包含在核心中呢?一種方法是把所有需要的功能都編譯到Linux核心。這會導致兩個問題,一是生成的核心會很大,二是如果我們要在現有的核心中新增或刪除功能,將不得不重新編譯核心
Linux核心模組程式設計-字元裝置驅動
裝置驅動簡介 裝置被大概的分為兩類: 字元裝置和塊裝置。 字元裝置 提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,鍵盤、串列埠、調變解調器都是典型的字元裝置。 塊裝置 應用程式可以隨機
Linux核心模組程式設計-HelloWorld
HelloWorld核心 開始斷斷續續學習核心,大概半年了,多少開始對核心有點感悟了,但是對於這個龐然大物我顯得很渺小,在枯燥的核心原始碼之中似乎沒有一點點成功的喜悅,因此我選擇學習核心模組程式設計,通過編寫一些核心模組來體驗那一點點小小的成就感吧! 什麼是
Linux核心模組程式設計指南(一)
Peter Jay Salzman Michael Burian Ori Pomerantz Copyright © 2001 Peter Jay Salzman 2007-05-18 ver 2.6.4 Linux核心模組程式設計指南是一本免費的
Linux 核心模組程式設計 Hello World 模組
Linux 核心的整體結構非常龐大,其包含的元件也非常多。怎麼樣把需要的部分包含在核心中呢? 一種是將所需要的功能都編譯到Linux 核心。但會導致兩個問題,一是生成的核心會很大,二是如要在現有的核心中新增或刪除功能,將不得不重新編譯。因此L
搜索系統中所有以.repo結尾的文件並刪除(find命令詳解及xargs命令詳解)
搜索系統 輸入 最大的 tin fin pro 多個 term 傳遞參數 find / -name *.repo | xargs rm –rf //搜索以.repo結尾的文件並刪除 find命令詳解 精細查找文件或目錄d find [ 查找範圍 ]