国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux內(nèi)核模塊vmalloc和kmalloc系統(tǒng)調(diào)用的代碼實(shí)戰(zhàn)

這篇具有很好參考價(jià)值的文章主要介紹了Linux內(nèi)核模塊vmalloc和kmalloc系統(tǒng)調(diào)用的代碼實(shí)戰(zhàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

當(dāng)設(shè)備長(zhǎng)時(shí)間運(yùn)行后,內(nèi)存碎片化,很難找到連續(xù)的物理頁(yè)。在這種情況下,如果需要分配長(zhǎng)度超過(guò)一頁(yè)的內(nèi)存塊,可以使用不連續(xù)頁(yè)分配器,分配虛擬地址連續(xù)但是物理地址不連續(xù)的內(nèi)存塊。在 32 位系統(tǒng)中不連分配器還有一個(gè)好處:優(yōu)先從高端內(nèi)存區(qū)域分配頁(yè),保留稀缺的低端內(nèi)存區(qū)域。

二、編程接口

2.1、內(nèi)核提供的vmalloc函數(shù)接口

  • vmalloc:分配不連續(xù)的物理地址空間,但虛擬內(nèi)存地址是連續(xù)的。

  • vfree:配套,釋放 vmalloc 分配的內(nèi)存地址。

2.2、內(nèi)核提供的kmalloc函數(shù)接口

  • kmalloc:分配物理連續(xù)的內(nèi)存地址(則虛擬地址自然連續(xù),基于 slab)。

  • kfree:配套,釋放 kmalloc 分配的內(nèi)存地址。

2.3、數(shù)據(jù)結(jié)構(gòu)

struct vm_struct {
	struct vm_struct	*next;
	void			*addr;
	unsigned long		size;
	unsigned long		flags;
	struct page		**pages;
	unsigned int		nr_pages;
	phys_addr_t		phys_addr;
	const void		*caller;
};

struct vmap_area {
	unsigned long va_start;
	unsigned long va_end;

	struct rb_node rb_node;         /* address sorted rbtree */
	struct list_head list;          /* address sorted list */

	/*
	 * The following three variables can be packed, because
	 * a vmap_area object is always one of the three states:
	 *    1) in "free" tree (root is vmap_area_root)
	 *    2) in "busy" tree (root is free_vmap_area_root)
	 *    3) in purge list  (head is vmap_purge_list)
	 */
	union {
		unsigned long subtree_max_size; /* in "free" tree */
		struct vm_struct *vm;           /* in "busy" tree */
		struct llist_node purge_list;   /* in purge list */
	};
};
  • 每個(gè)虛擬內(nèi)存區(qū)域?qū)?yīng)一個(gè) vmap_area 實(shí)例;
  • 每個(gè) vmap_area 實(shí)例關(guān)聯(lián)一個(gè) vm_struct 實(shí)例;

三、vmalloc的使用示例

分配不連續(xù)的物理地址空間,但虛擬內(nèi)存地址是連續(xù)的。

  1. 定義初始化模塊和退出模塊函數(shù)。
  2. 定義一個(gè)全局變量。
  3. 在初始化模塊函數(shù)調(diào)用vmalloc函數(shù),申請(qǐng)內(nèi)存。
  4. 退出模塊調(diào)用vfree釋放內(nèi)存。
  5. 模塊初始化操作和退出函數(shù)調(diào)用module_init()和module_exit()。
  6. 其他的聲明信息,比如許可協(xié)議、作者、模塊功能描述等等。

vmtest.c

/* 頭文件和全局變量地聲明*/
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <linux/module.h>

static int __init vmalloc_InitFunc(void);
static void __exit vmalloc_ExitFunc(void);

#define MEMORY_SIZE 4096
char * pmymemory;

// 模塊初始化函數(shù)
int __init vmalloc_InitFunc(void)
{
    pmymemory = (char *)vmalloc(MEMORY_SIZE);
    if(pmymemory == NULL )
        printk("執(zhí)行:vmalloc(...)函數(shù)分配內(nèi)存失敗! \n");
    else
        printk("執(zhí)行:vmalloc(...)函數(shù)成功,地址 = 0x%lx\n", (unsigned long)pmymemory);
    return 0;
}

// 模塊退出函數(shù)
void __exit vmalloc_ExitFunc(void)
{
    if(NULL != pmymemory)
    {
        vfree(pmymemory);
        printk("調(diào)用:vfree(...)釋放內(nèi)存成功!\n");
    }

    printk("正常:內(nèi)核模塊退出成功!\n");
}

/* 模塊初始化操作和退出函數(shù)調(diào)用 */
module_init(vmalloc_InitFunc);
module_exit(vmalloc_ExitFunc);

MODULE_LICENSE("GPL"); /* 描述模塊代碼接受的軟件許可協(xié)議 */
MODULE_AUTHOR("Lion Long"); /* 描述模塊的作者信息:包括作者姓名及郵箱等等 */
MODULE_DESCRIPTION(" kernel module : vmalloc/vfree"); /* 簡(jiǎn)要描述此模塊用途及功能介紹*/

Makefile

obj-m:=vmtest.o	

CURRENT_PAHT:=$(shell pwd) 
LINUX_KERNEL:=$(shell uname -r)   

LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:

	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) modules

clean:

	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) cleals

(1)make。

$ make
make -C /usr/src/linux-headers-4.15.0-142-generic    M=/home/fly/workspace/vmalloctest  modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-142-generic'
  CC [M]  /home/fly/workspace/vmalloctest/vmtest.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/fly/workspace/vmalloctest/vmtest.mod.o
  LD [M]  /home/fly/workspace/vmalloctest/vmtest.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-142-generic'

$ ls
Makefile  modules.order  Module.symvers  vmtest.c  vmtest.ko  vmtest.mod.c  vmtest.mod.o  vmtest.o

(2)插入模塊。

# insmod vmtest.ko 
# dmesg -c
[159699.561428] 執(zhí)行:vmalloc(...)函數(shù)成功,地址 = 0xffffa6aec0668000

四、kmalloc的使用示例

分配物理連續(xù)的內(nèi)存地址(則虛擬地址自然連續(xù),基于 slab)。

  1. 定義初始化模塊和退出模塊函數(shù)。
  2. 定義一個(gè)全局變量。
  3. 在初始化模塊函數(shù)調(diào)用kmalloc函數(shù),申請(qǐng)內(nèi)存。
  4. 退出模塊調(diào)用kfree釋放內(nèi)存。
  5. 模塊初始化操作和退出函數(shù)調(diào)用module_init()和module_exit()。
  6. 其他的聲明信息,比如許可協(xié)議、作者、模塊功能描述等等。

kmtest.c

/* 頭文件和全局變量地聲明*/
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>

static int __init kmalloc_InitFunc(void);
static void __exit kmalloc_ExitFunc(void);

#define MEMORY_SIZE 4096
char * pmymemory;

// 模塊初始化函數(shù)
int __init kmalloc_InitFunc(void)
{
    pmymemory = (char *)kmalloc(MEMORY_SIZE,GFP_KERNEL);
    if(pmymemory == NULL )
        printk("執(zhí)行:kmalloc(...)函數(shù)分配內(nèi)存失敗! \n");
    else
    {
        // /*輸出分配的內(nèi)存空間的起始地址*/
        printk("執(zhí)行:kmalloc(...)函數(shù)成功,地址 = 0x%lx\n", (unsigned long)pmymemory);
    }
        
    return 0;
}

// 模塊退出函數(shù)
void __exit kmalloc_ExitFunc(void)
{
    if(NULL != pmymemory)
    {
        kfree(pmymemory);
        printk("調(diào)用:kfree(...)釋放內(nèi)存成功!\n");
    }

    printk("正常:內(nèi)核模塊退出成功!\n");
}

/* 模塊初始化操作和退出函數(shù)調(diào)用 */
module_init(kmalloc_InitFunc);
module_exit(kmalloc_ExitFunc);

MODULE_LICENSE("GPL"); /* 描述模塊代碼接受的軟件許可協(xié)議 */
MODULE_AUTHOR("Lingshengedu"); /* 描述模塊的作者信息:包括作者姓名及郵箱等等 */
MODULE_DESCRIPTION(" kernel module : kmalloc/kfree"); /* 簡(jiǎn)要描述此模塊用途及功能介紹*/

Makefile

obj-m:=kmkf.o	

CURRENT_PAHT:=$(shell pwd) 
LINUX_KERNEL:=$(shell uname -r)   

LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:

	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) modules

clean:

	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) cleals

(1)make。

# make
make -C /usr/src/linux-headers-4.15.0-142-generic    M=/home/fly/workspace/kmalloctest  modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-142-generic'
  CC [M]  /home/fly/workspace/kmalloctest/kmtest.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/fly/workspace/kmalloctest/kmtest.mod.o
  LD [M]  /home/fly/workspace/kmalloctest/kmtest.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-142-generic'

# ls
kmtest.c  kmtest.ko  kmtest.mod.c  kmtest.mod.o  kmtest.o  Makefile  modules.order  Module.symvers

(2)insmod。

# insmod kmtest.ko 
# dmesg -c
[160514.302923] 執(zhí)行:kmalloc(...)函數(shù)成功,地址 = 0xffff8f54b28ac000

Linux內(nèi)核模塊vmalloc和kmalloc系統(tǒng)調(diào)用的代碼實(shí)戰(zhàn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-414731.html

到了這里,關(guān)于Linux內(nèi)核模塊vmalloc和kmalloc系統(tǒng)調(diào)用的代碼實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux 內(nèi)核源碼分析筆記】系統(tǒng)調(diào)用

    【Linux 內(nèi)核源碼分析筆記】系統(tǒng)調(diào)用

    在Linux內(nèi)核中,系統(tǒng)調(diào)用是用戶空間程序與內(nèi)核之間的接口,它允許用戶空間程序請(qǐng)求內(nèi)核執(zhí)行特權(quán)操作或訪問(wèn)受保護(hù)的內(nèi)核資源。系統(tǒng)調(diào)用提供了一種安全可控的方式,使用戶程序能夠利用內(nèi)核功能而不直接訪問(wèn)底層硬件。 系統(tǒng)調(diào)用: 通過(guò)系統(tǒng)調(diào)用,用戶程序可以請(qǐng)求內(nèi)核

    2024年02月03日
    瀏覽(30)
  • 【Linux C】Linux如何執(zhí)行一個(gè)程序(程序存儲(chǔ)空間、系統(tǒng)調(diào)用、內(nèi)核調(diào)用)

    【Linux C】Linux如何執(zhí)行一個(gè)程序(程序存儲(chǔ)空間、系統(tǒng)調(diào)用、內(nèi)核調(diào)用)

    本節(jié)說(shuō)的空間主要是指內(nèi)存空間,即程序如何分配和使用內(nèi)存。 可執(zhí)行程序,而不是源代碼。 C語(yǔ)言程序的存儲(chǔ)空間包括以下幾個(gè)主要部分: 代碼段(Text Segment): 也稱 正文段 , 代碼段是存儲(chǔ)C程序的機(jī)器代碼的區(qū)域。它包含了程序的指令集,這些指令由編譯器生成,并且

    2024年02月08日
    瀏覽(25)
  • 調(diào)試linux內(nèi)核(2): poll系統(tǒng)調(diào)用的實(shí)現(xiàn)

    調(diào)試linux內(nèi)核(2): poll系統(tǒng)調(diào)用的實(shí)現(xiàn)

    linux內(nèi)核為用戶態(tài)進(jìn)程提供了一組IO相關(guān)的系統(tǒng)調(diào)用: select/poll/epoll, 這三個(gè)系統(tǒng)調(diào)用功能類似, 在使用方法和性能等方面存在一些差異. 使用它們, 用戶態(tài)的進(jìn)程可以\\\"監(jiān)控\\\"自己感興趣的文件描述符, 當(dāng)這些文件描述符的狀態(tài)發(fā)生改變時(shí), 比如可讀或者可寫了, 內(nèi)核會(huì)通知進(jìn)程去處

    2024年02月11日
    瀏覽(18)
  • 《Linux內(nèi)核源碼分析》(2)進(jìn)程原理及系統(tǒng)調(diào)用

    《Linux內(nèi)核源碼分析》(2)進(jìn)程原理及系統(tǒng)調(diào)用

    操作系統(tǒng)的作用 :作為硬件的使用層,提供使用硬件資源的能力, 進(jìn)程的作用 :作為操作系統(tǒng)使用層,提供使用操作系統(tǒng)抽象出的資源層的能力 進(jìn)程、線程和程序的區(qū)別 :進(jìn)程指計(jì)算機(jī)中已運(yùn)行的程序。進(jìn)程本身不是基本的運(yùn)行單位,而是線程的容器。 程序本身只是指令

    2024年02月07日
    瀏覽(35)
  • 杭電操作系統(tǒng)實(shí)驗(yàn)一 --- Linux內(nèi)核編譯及添加系統(tǒng)調(diào)用(arm架構(gòu)華為云)

    杭電操作系統(tǒng)實(shí)驗(yàn)一 --- Linux內(nèi)核編譯及添加系統(tǒng)調(diào)用(arm架構(gòu)華為云)

    掌握Linux 內(nèi)核的編譯與安裝 掌握Linux 系統(tǒng)調(diào)用基本概念 設(shè)計(jì)和添加linux系統(tǒng)調(diào)用 ????????(1)修改或返回指定進(jìn)程的優(yōu)先級(jí)(nice值和prio值)(詳見教材P328)提示:可能參考的內(nèi)核函數(shù):set_user_nice(). ????????(2)改變主機(jī)名稱為自定義字符串(自選題目) ? 1、 L

    2023年04月20日
    瀏覽(25)
  • 操作系統(tǒng)實(shí)驗(yàn) 2.3系統(tǒng)調(diào)用:linux-0.11-lab “為版本0內(nèi)核增加一個(gè)系統(tǒng)調(diào)用getjiffies” 和 “在用戶程序中使用新增的系統(tǒng)調(diào)用”

    操作系統(tǒng)實(shí)驗(yàn) 2.3系統(tǒng)調(diào)用:linux-0.11-lab “為版本0內(nèi)核增加一個(gè)系統(tǒng)調(diào)用getjiffies” 和 “在用戶程序中使用新增的系統(tǒng)調(diào)用”

    打開 vscode ,在如圖所示位置打開 ~/os/linux-0.11-lab/0 文件夾 1.定義getjiffies系統(tǒng)調(diào)用 題目中給的提示:進(jìn)入到 unistd.h 文件中 閱讀代碼,可以發(fā)現(xiàn)上圖劃線處有個(gè)系統(tǒng)調(diào)用名為 getpid :返回當(dāng)前進(jìn)程號(hào)——這與我們期望實(shí)現(xiàn)的功能類似:通過(guò)系統(tǒng)調(diào)用返回jiffies值。 于是此時(shí)希望

    2023年04月08日
    瀏覽(109)
  • 【Shell 命令集合 系統(tǒng)設(shè)置 】Linux 加載和卸載內(nèi)核模塊 modprobe命令 使用指南

    【Shell 命令集合 系統(tǒng)設(shè)置 】Linux 加載和卸載內(nèi)核模塊 modprobe命令 使用指南

    Shell 命令專欄:Linux Shell 命令全解析 modprobe命令是Linux系統(tǒng)中用于加載和卸載內(nèi)核模塊的工具。內(nèi)核模塊是一種可以動(dòng)態(tài)加載到內(nèi)核中的代碼,它們可以擴(kuò)展內(nèi)核的功能,添加新的驅(qū)動(dòng)程序或功能。 modprobe命令的主要作用有以下幾個(gè)方面: 加載內(nèi)核模塊:modprobe命令可以根據(jù)

    2024年02月04日
    瀏覽(122)
  • 【Shell 命令集合 系統(tǒng)設(shè)置 】?Linux 向內(nèi)核中加載指定的模塊 insmod命令 使用指南

    【Shell 命令集合 系統(tǒng)設(shè)置 】?Linux 向內(nèi)核中加載指定的模塊 insmod命令 使用指南

    Shell 命令專欄:Linux Shell 命令全解析 insmod命令是Linux系統(tǒng)中的一個(gè)命令,用于向內(nèi)核中加載指定的模塊。它的作用是將指定的模塊文件加載到內(nèi)核中,使得系統(tǒng)可以使用該模塊提供的功能。 模塊是一種可以動(dòng)態(tài)加載到內(nèi)核中的代碼,它可以擴(kuò)展內(nèi)核的功能。在Linux系統(tǒng)中,模

    2024年02月07日
    瀏覽(28)
  • Linux 內(nèi)核線程啟動(dòng)以及內(nèi)核調(diào)用應(yīng)用層程序

    #include linux/kthread.h //內(nèi)核線程頭文件 ? static task_struct *test_task; test_task = kthread_run(thread_function, NULL, \\\"test_thread_name\\\"); if(IS_ERR(test_task)) { ? ? ? ? pr_err(\\\"test_thread_name create failn\\\"); } static int thread_function(void *arg) { ? ? char *envp[3]; ? ? char *argv[3]; ? ? int ret= 0; ? ? argv[0] = \\\"/bin/sh\\\"; ?

    2024年02月12日
    瀏覽(97)
  • Linux內(nèi)核學(xué)習(xí)(十三)—— 設(shè)備與模塊(基于Linux 2.6內(nèi)核)

    目錄 一、設(shè)備類型 二、模塊 構(gòu)建模塊 安裝模塊 載入模塊 在 Linux 以及 Unix 系統(tǒng)中,設(shè)備被分為以下三種類型: 塊設(shè)備(blkdev) :以塊為尋址單位,塊的大小隨設(shè)備的不同而變化;塊設(shè)備通常支持重定位(seeking)操作,也就是對(duì)數(shù)據(jù)的隨機(jī)訪問(wèn)。如硬盤、藍(lán)光光碟和 Flas

    2024年02月11日
    瀏覽(90)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包