欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

linux中引入模塊機(jī)制的好處是什么

本文小編為大家詳細(xì)介紹“l(fā)inux中引入模塊機(jī)制的好處是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“l(fā)inux中引入模塊機(jī)制的好處是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、川匯網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為川匯等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

linux中引入模塊機(jī)制的好處:1、應(yīng)用程序在退出時(shí),可以不管資源的釋放或者其他的清除工作,但是模塊的退出函數(shù)卻必須仔細(xì)此撤銷初始化函數(shù)所作的一切;2、該機(jī)制有助于縮短模塊的開(kāi)發(fā)周期,即注冊(cè)和卸載都很靈活方便。

Linux中引入模塊機(jī)制有什么好處?

首先,模塊是預(yù)先注冊(cè)自己以便服務(wù)于將來(lái)的某個(gè)請(qǐng)求,然后他的初始化函數(shù)就立即結(jié)束。換句話說(shuō),模塊初始化函數(shù)的任務(wù)就是為以后調(diào)用函數(shù)預(yù)先作準(zhǔn)備。

好處:

  • 1) 應(yīng)用程序在退出時(shí),可以不管資源的釋放或者其他的清除工作,但是模塊的退出函數(shù)卻必須仔細(xì)此撤銷初始化函數(shù)所作的一切。

  • 2) 該機(jī)制有助于縮短模塊的開(kāi)發(fā)周期。即:注冊(cè)和卸載都很靈活方便。

Linux模塊機(jī)制淺析

Linux允許用戶通過(guò)插入模塊,實(shí)現(xiàn)干預(yù)內(nèi)核的目的。一直以來(lái),對(duì)linux的模塊機(jī)制都不夠清晰,因此本文對(duì)內(nèi)核模塊的加載機(jī)制進(jìn)行簡(jiǎn)單地分析。

模塊的Hello World!

我們通過(guò)創(chuàng)建一個(gè)簡(jiǎn)單的模塊進(jìn)行測(cè)試。首先是源文件main.c和Makefile。

florian@florian-pc:~/module$ cat main.c

#include<linux/module.h>
#include<linux/init.h>

static int __init init(void)
{
   printk("Hi module!\n");
   return 0;
}

static void __exit exit(void)
{
   printk("Bye module!\n");
}

module_init(init);
module_exit(exit);

其中init為模塊入口函數(shù),在模塊加載時(shí)被調(diào)用執(zhí)行,exit為模塊出口函數(shù),在模塊卸載被調(diào)用執(zhí)行。

florian@florian-pc:~/module$ cat Makefile

obj-m += main.o
#generate the path
CURRENT_PATH:=$(shell pwd)
#the current kernel version number
LINUX_KERNEL:=$(shell uname -r)
#the absolute path
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#complie object
all:
   make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#clean
clean:
   make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

其中,obj-m指定了目標(biāo)文件的名稱,文件名需要和源文件名相同(擴(kuò)展名除外),以便于make自動(dòng)推導(dǎo)。

然后使用make命令編譯模塊,得到模塊文件main.ko。

florian@florian-pc:~/module$ make

make -C /usr/src/linux-headers-2.6.35-22-generic M=/home/florian/module modules
make[1]: 正在進(jìn)入目錄 `/usr/src/linux-headers-2.6.35-22-generic'
 Building modules, stage 2.
 MODPOST 1 modules
make[1]:正在離開(kāi)目錄 `/usr/src/linux-headers-2.6.35-22-generic'

使用insmod和rmmod命令對(duì)模塊進(jìn)行加載和卸載操作,并使用dmesg打印內(nèi)核日志。

florian@florian-pc:~/module$ sudo insmod main.ko;dmesg | tail -1
[31077.810049] Hi module!
florian@florian-pc:~/module$ sudo rmmod main.ko;dmesg | tail -1
[31078.960442] Bye module!

通過(guò)內(nèi)核日志信息,可以看出模塊的入口函數(shù)和出口函數(shù)都被正確調(diào)用執(zhí)行。

模塊文件

使用readelf命令查看一下模塊文件main.ko的信息。

florian@florian-pc:~/module$ readelf -h main.ko

ELF Header:
 Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
 Class:                             ELF32
 Data:                              2's complement, little endian
 Version:                           1 (current)
 OS/ABI:                            UNIX - System V
 ABI Version:                       0
 Type:                              REL (Relocatable file)
 Machine:                           Intel 80386
 Version:                           0x1
 Entry point address:               0x0
 Start of program headers:          0 (bytes into file)
 Start of section headers:          1120 (bytes into file)
 Flags:                             0x0
 Size of this header:               52 (bytes)
 Size of program headers:           0 (bytes)
 Number of program headers:         0
 Size of section headers:           40 (bytes)
 Number of section headers:         19
 Section header string table index: 16

我們發(fā)現(xiàn)main.ko的文件類型為可重定位目標(biāo)文件,這和一般的目標(biāo)文件格式?jīng)]有任何區(qū)別。我們知道,目標(biāo)文件是不能直接執(zhí)行的,它需要經(jīng)過(guò)鏈接器的地址空間分配、符號(hào)解析和重定位的過(guò)程,轉(zhuǎn)化為可執(zhí)行文件才能執(zhí)行。

那么,內(nèi)核將main.ko加載后,是否對(duì)其進(jìn)行了鏈接呢?

模塊數(shù)據(jù)結(jié)構(gòu)

首先,我們了解一下模塊的內(nèi)核數(shù)據(jù)結(jié)構(gòu)。

linux3.5.2/kernel/module.h:220

struct module
{
   ……
   /* Startup function. */
   int (*init)(void);
   ……
   /* Destruction function. */
   void (*exit)(void);
   ……
};

模塊數(shù)據(jù)結(jié)構(gòu)的init和exit函數(shù)指針記錄了我們定義的模塊入口函數(shù)和出口函數(shù)。

模塊加載

模塊加載由內(nèi)核的系統(tǒng)調(diào)用init_module完成。

linux3.5.2/kernel/module.c:3009

/* This is where the real work happens */
SYSCALL_DEFINE3(init_module, void __user *, umod,
      unsigned long, len, const char __user *, uargs)
{
   struct module *mod;
   int ret = 0;
   ……
   /* Do all the hard work */
   mod = load_module(umod, len, uargs);//模塊加載
   ……
   /* Start the module */
   if (mod->init != NULL)
      ret = do_one_initcall(mod->init);//模塊init函數(shù)調(diào)用
   ……
   return 0;
}

系統(tǒng)調(diào)用init_module由SYSCALL_DEFINE3(init_module...)實(shí)現(xiàn),其中有兩個(gè)關(guān)鍵的函數(shù)調(diào)用。load_module用于模塊加載,do_one_initcall用于回調(diào)模塊的init函數(shù)。

函數(shù)load_module的實(shí)現(xiàn)為。

linux3.5.2/kernel/module.c:2864

/* Allocate and load the module: note that size of section 0 is always
  zero, and we rely on this for optional sections. */
static struct module *load_module(void __user *umod,
               unsigned long len,
               const char __user *uargs)
{
   struct load_info info = { NULL, };
   struct module *mod;
   long err;
   ……
   /* Copy in the blobs from userspace, check they are vaguely sane. */
   err = copy_and_check(&info, umod, len, uargs);//拷貝到內(nèi)核
   if (err)
      return ERR_PTR(err);
   /* Figure out module layout, and allocate all the memory. */
   mod = layout_and_allocate(&info);//地址空間分配
   if (IS_ERR(mod)) {
      err = PTR_ERR(mod);
      goto free_copy;
   }
   ……
   /* Fix up syms, so that st_value is a pointer to location. */
   err = simplify_symbols(mod, &info);//符號(hào)解析
   if (err < 0)
      goto free_modinfo;
   err = apply_relocations(mod, &info);//重定位
   if (err < 0)
      goto free_modinfo;
   ……
}

函數(shù)load_module內(nèi)有四個(gè)關(guān)鍵的函數(shù)調(diào)用。copy_and_check將模塊從用戶空間拷貝到內(nèi)核空間,layout_and_allocate為模塊進(jìn)行地址空間分配,simplify_symbols為模塊進(jìn)行符號(hào)解析,apply_relocations為模塊進(jìn)行重定位。

由此可見(jiàn),模塊加載時(shí),內(nèi)核為模塊文件main.ko進(jìn)行了鏈接的過(guò)程!

至于函數(shù)do_one_initcall的實(shí)現(xiàn)就比較簡(jiǎn)單了。

linux3.5.2/kernel/init.c:673

int __init_or_module do_one_initcall(initcall_t fn)
{
   int count = preempt_count();
   int ret;
   if (initcall_debug)
      ret = do_one_initcall_debug(fn);
   else
      ret = fn();//調(diào)用init module
   ……
   return ret;
}

即調(diào)用了模塊的入口函數(shù)init。

模塊卸載

模塊卸載由內(nèi)核的系統(tǒng)調(diào)用delete_module完成。

linux3.5.2/kernel/module.c:768

SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
       unsigned int, flags)
{
   struct module *mod;
   char name[MODULE_NAME_LEN];
   int ret, forced = 0;
   ……
   /* Final destruction now no one is using it. */
   if (mod->exit != NULL)
      mod->exit();//調(diào)用exit module
   ……
   free_module(mod);//卸載模塊
   ……
}

通過(guò)回調(diào)exit完成模塊的出口函數(shù)功能,最后調(diào)用free_module將模塊卸載。

讀到這里,這篇“l(fā)inux中引入模塊機(jī)制的好處是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:linux中引入模塊機(jī)制的好處是什么
標(biāo)題路徑:http://aaarwkj.com/article6/jjpcog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航微信小程序、網(wǎng)站維護(hù)品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
亚洲午夜精品美女写真| 麻豆影片在线免费观看| 一本久久综合亚洲鲁鲁五月天| 高清中文一区二区三区| 人妻av天堂综合一区| 亚洲欧美精品一中文字幕| 超碰91人人在线青青草| 饥渴少妇高潮特殊按摩| 蜜臀一二区免费在线视频| 熟妇女人妻丰满少妇中文| 高清欧美一区二区三区日本| 国产探花猛操性感美女| 亚洲欧洲日本在线天堂| 亚洲一区二区中文字幕av| av在线免费观看青青草原| 国产三级国产精品国产国在线观看| 91日本精品一区二区| 天天干夜夜操操操操| 亚州无吗一区二区三区| 未满十八在线观看网址| 日本成熟亚洲中文字幕的| 日韩在线视频不卡播放| 国产精品免费观看在线国产| 97视频在线视频免费| 亚洲av日韩综合一区尤物| av人妻熟女少妇蒂亚| 成人免费视频国产免费| av中文字幕熟妇人妻少妇| 国产三级在线观看视频| 香蕉网性欧美在线视频| 最近中文字幕免费手机版| 夫妻性生活视频在线免费看| 欧美内射专区精品一区| 蜜臀国产综合久久第一页| 亚洲成人av网址大全| 色婷婷综合中文久久一本| 欧美视频综合一级91| 久久av少妇亚洲精品| 人妖系列中文字幕欧美系列| 色噜噜男人的天堂av| 亚洲精品主播一区二区三区|