`
totoxian
  • 浏览: 1062653 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

linux下的use_mm比NT的KeAttachProcess高效的原因

 
阅读更多

在linux中可以实现进程挂靠,通过use_mm函数可以将当前进程(或线程,linux不区分)的地址空间设置为特定的mm_struct,先不管函 数的形态是否一致,它和windows的KeAttachProcess的作用是一样的,它同样要切换硬件上下文,但是别的方面设置却非常简单。这一切有 一个终极原因和一个辅助原因两个原因:1.linux的全局页目录不和进程挂钩,而是和地址空间挂钩(pgd在mm_struct里而没有在 task_struct里);2.很好的缺页中断处理机制。

这样,我们只需要把要挂靠的进程的mm_struct设置到当前进程的task_struct的mm里面就是了,这样在实际访问时会从mm_struct 里面得到页全局目录,从而访问叶面或处理缺页,而缺页处理也是首先得到当前进程的mm_struct结构从而可以得到pgd,这个设计简直太好了,妙!

不光这里受惠,在进程切换的时候可以首先查看两个task_struct的mm_struct是否一致,一致的话就是线程切换,不切换cr3硬件环境,不同时再切换。

linux这么好的 数据结构设计使得很多操作同时受惠,一脉相承。所以说linux的进程实现既轻量又高效!

static void use_mm(struct mm_struct *mm)

{

struct mm_struct *active_mm;

struct task_struct *tsk = current;

task_lock(tsk);

tsk->flags |= PF_BORROWED_MM;

active_mm = tsk->active_mm;

atomic_inc(&mm->mm_count);

tsk->mm = mm;

tsk->active_mm = mm;

/*

* Note that on UML this *requires* PF_BORROWED_MM to be set, otherwise

* it won't work. Update it accordingly if you change it here

*/

activate_mm(active_mm, mm);

task_unlock(tsk);

mmdrop(active_mm);

}

static void unuse_mm(struct mm_struct *mm)

{

struct task_struct *tsk = current;

task_lock(tsk);

tsk->flags &= ~PF_BORROWED_MM;

tsk->mm = NULL;

/* active_mm is still 'mm' */

enter_lazy_tlb(mm, tsk);

task_unlock(tsk);

}

不过如果你实在看不出这到底比windows好在哪,我就没有办法了,好好感受!这代码多么简洁,如果你还是不明白,那么和KeAttachProcess比较一下吧

分享到:
评论

相关推荐

    C语言头文件 USE_ANSI

    C语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSIC语言头文件 USE_ANSI...

    mongodb-linux-x86_64-3.4.10.tgz

    为了能在任意目录下运行MongoDB,你需要将其可执行文件路径添加到系统的PATH环境变量中。在`.bashrc`或`.bash_profile`文件中添加以下行: ``` export PATH=$PATH:/path/to/mongodb-linux-x86_64-3.4.10/bin ``` ...

    mongodb-linux-x86_64-2.2.6.tgz

    总结来说,MongoDB 2.2.6版在Linux x86_64平台上提供了高效、可靠的数据存储解决方案。了解并掌握MongoDB的安装、运行、管理和维护技巧,能够帮助开发者充分利用其特性,构建高性能的应用程序。

    use_mysql.rar_mysql linux

    总的来说,"use_mysql.rar_mysql linux"提供了一个实用的起点,让开发者了解如何在Linux环境下使用C语言与MySQL数据库进行通信。通过研究源代码、阅读学习笔记,并结合实际运行,初学者可以快速掌握MySQL编程的基础...

    mongodb-linux-x86_64-rhel62-3.4.14.tgz

    它的设计目标是提供高可用性、可扩展性和灵活性,使得数据存储和处理变得简单高效。 在您提供的信息中,我们看到的是 MongoDB 的一个Linux 64位版本的安装包——"mongodb-linux-x86_64-rhel62-3.4.14.tgz"。这个...

    mongodb-linux-x86_64-rhel70-3.6.4.tgz

    这个名为"mongodb-linux-x86_64-rhel70-3.6.4.tgz"的压缩包是专门为运行在Linux Red Hat Enterprise Linux 7.0 (RHEL 7.0)操作系统上的64位架构设计的MongoDB版本,具体为3.6.4版。MongoDB的3.6版本是一个重要的里程...

    VS错误提示:To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

    Severity Code Description ... To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 解决方案:更改预处理定义 右击项目名,选择Properties 在c/c++下选择Preprocessor 点击图

    USE_LARGE_PAGES

    USE_LARGE_PAGES 思维导图

    use_ZedBoard_build_Linux.rar_zedboard

    利用ZedBoard从零开始构建Linux环境详细步骤

    Use_CxImage.rar_Use_CxImage_cximage

    【标题】"Use_CxImage.rar_Use_CxImage_cximage" 提供的是关于在Visual Studio 2005环境下编译和使用CxImage库的详细教程。CxImage是一个强大的C++类库,用于处理图像文件,如读取、显示、编辑和保存多种格式的图片...

    linux_c_connect_mysql.rar_c mysql linux_connect_linux mysql_my

    例如,使用`mysql_query()`发送SQL语句,然后调用`mysql_store_result()`或`mysql_use_result()`来处理结果集。以下是如何执行一个简单的SELECT查询: ```cpp MYSQL_RES* res; MYSQL_ROW row; if (mysql_query...

    linux_mysql.rar_c mysql linux_linux mysql_linux mysql_linux m

    5. 游标操作:对于大型数据集,可以使用游标(cursor)进行逐行处理,这需要使用mysql_use_result()和mysql_fetch_row()配合。 在"www.pudn.com.txt"这个文件中,可能包含了更多关于Linux MySQL使用和C接口的具体...

    Tegra_Linux_Driver_Package_Documents_R23.2

    This TAR file provides a reference volume containing several documents for this release. Those include a Development Guide ... Follow the steps below to successfully extract and use this documentation.

    New_audio_tuning_tool_use_guide v2.1.pdf

    MTK平台 音频调试工具使用指南 New_audio_tuning_tool_use_guide v2.1.pdf

    linux内核 do_fork 函数源代码浅析

    __MOD_INC_USE_COUNT(p->binfmt->module); // 可执行文件 binfmt 结构共享计数 +1 p->did_exec = 0; // 进程未执行 p->swappable = 0; // 进程不可换出 p->state = TASK_UNINTERRUPTIBLE; // 设置进程状态为不...

    DataBase_Use_C.zip_c语言 数据库_database_database_use_c_小型数据库_数据库系统

    标题中的"DataBase_Use_C.zip"表明这是一个关于使用C语言实现数据库系统的压缩文件。这个小型数据库系统是一个很好的学习资源,适合对C语言编程和数据库管理感兴趣的人。在描述中提到,它是一个用C语言实现的实例,...

    MYSQL.zip_C MYSQL_c++ mysql_linux mysql_linux c mysql_linux mys

    在Linux环境下,MySQL数据库是广泛使用的开源关系型数据库管理系统,其高效、稳定和灵活的特点使其在各类项目中占据重要地位。对于开发人员来说,掌握如何在Linux系统中使用C或C++语言与MySQL进行交互是必备技能。在...

    关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释

    STM32 MDK中USE_STDPERIPH_DRIVER问题的解释 在使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题,这是因为USE_STDPERIPH_DRIVER的问题没有被正确地解决。这个问题的解决方法是,在“Target Options”...

    Linux_vi_use.rar_vi

    **Linux Vi 编辑器详解** 在Linux操作系统中,Vi(Visual Editor)是不可或缺的文本编辑器之一,尤其对于系统管理员来说,它是必备的工具。Vi编辑器以其高效、强大的功能而闻名,虽然初学者可能会觉得其界面和操作...

    Linux-use-skills.rar_linux_linux Use怎么用

    在Linux世界中,掌握一些...通过阅读"Linux-use-skills.txt",你将找到更具体的指导和实例,加深对这些概念的理解。记住,Linux是一个开放的世界,它的强大在于你对它的掌握程度。祝你在Linux的学习旅程中一切顺利!

Global site tag (gtag.js) - Google Analytics