`
totoxian
  • 浏览: 1104456 次
  • 性别: 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比较一下吧

分享到:
评论

相关推荐

    Script_use_for_init_Linux_Desktop__安装_Linux_Deskt_linux-init.zip

    Linux桌面系统初始化脚本是...Linux桌面系统初始化脚本是Linux系统管理中不可或缺的一部分,它使得系统配置工作变得简单、高效且标准化。随着Linux在各个领域的不断深入应用,这类脚本的作用和重要性将会越来越突出。

    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-ubuntu1604-4.2.2.tgz

    这可以通过`mongo` shell中的`use admin`和`db.runCommand()`命令完成。 8. **监控和日志**:MongoDB提供了丰富的监控工具和日志记录选项,你可以根据需求调整`mongod`启动参数来配置。 9. **备份与恢复**:...

    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"。这个...

    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 点击图

    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版本是一个重要的里程...

    Linux_BT_UART_v3.10_20170314_8821CS_BTCOEX_20170223-1111.tgz

    The default settings of RTK BT chip are H5 protocol, Flow control on, parity even and use internel 32k clock. The default baund rate is 115200. To support H5 protocal,you need to install hci_uart ...

    USE_LARGE_PAGES

    USE_LARGE_PAGES 思维导图

    linux下安装 cmake-3.27.7安装脚本 cmake-3.27.7-linux-x86-64.sh

    linux下安装cmake安装脚本: 方法如下: 1:sudo chmod +x cmake-3.27.7-linux-x86_64.sh 2:sudo sh cmake-3.27.7-linux-x86_64.sh --skip-license --prefix=/usr/local/

    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

    RTL8188C_8192C_USB_linux_v3.4.4_4749.20121105.zip

    3.1 rtl8188C_8192C_usb_linux_v3.4.3_4369.20120622.tar.gz Naming rule: rtlCHIPS_linux_vM.N.P_ssss.yyyymmdd.tar.gz where: CHIPS: supported chips M: Major version N: miNor ...

    关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释

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

Global site tag (gtag.js) - Google Analytics