延吉网站建设多少钱商丘房产网
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:03
当前位置: 首页 > news >正文
延吉网站建设多少钱,商丘房产网,新人做外贸哪个平台好做,零基础家装设计师自学系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理#xff08;一#xff09; 深入理解Linux虚拟内存管理#xff08;二#xff09; 深入理解Linux虚拟内存管理#xff08;三#xff09; 深入理…
系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理一 深入理解Linux虚拟内存管理二 深入理解Linux虚拟内存管理三 深入理解Linux虚拟内存管理四 深入理解Linux虚拟内存管理五 深入理解Linux虚拟内存管理六 深入理解Linux虚拟内存管理七 深入理解Linux虚拟内存管理八 文章目录 系列文章目录一、进程内存描述符1、 进程内存描述符1初始化一个描述符2复制一个描述符acopy_mmbmm_init① ⇒ pgd_alloc② ⇒ kmem_cache_free 3分配一个描述符aallocate_mmbmm_alloc 4销毁一个描述符ammputbmmdropcmmdrop 2、创建内存区域1创建一个内存区域ado_mmapbdo_mmap_pgoff 2插入一个内存区域ainsert_vm_structbfind_vma_preparecvma_linkdvma_linkevma_link_listfvma_link_rbgvma_link_file 3合并相邻区域avma_mergebcan_vma_merge 4重映射并移动一个内存区域asys_mremapbdo_mremapcmove_vmadmake_pages_presenteget_user_pagesfmove_page_tablesgmove_one_pagehget_one_pteialloc_one_ptejcopy_one_pte 5删除内存区域ado_munmapbunmap_fixup 6删除所有的内存区域aexit_mmapbclear_page_tablescfree_one_pgddfree_one_pmd 3、查找内存区域1查找已映射内存区域afind_vmabfind_vma_prevcfind_vma_intersection 2查找空闲内存区域aget_unmapped_areabarch_get_unmapped_area 4、对内存区域上锁和解锁1对内存区域上锁asys_mlockbsys_mlockallcdo_mlockallddo_mlock 2对区域解锁asys_munlockbsys_munlockall 3上锁/解锁后修整区域amlock_fixupbulock_fixup_allcmlock_fixup_startdmlock_fixup_endemlock_fixup_middle 5、缺页中断1x86 缺页中断处理程序ado_page_fault 2扩展栈aexpand_stack 3独立体系结构的页面中断处理程序ahanle_mm_faultbhandle_pte_fault 4请求分配ado_no_pagebdo_anonymous_page 5请求分页ado_swap_pagebcan_share_swap_pagecexclusive_swap_page 6写时复制COW 页面ado_wp_page 6、页面相关的磁盘 I/O1一般文件读ageneric_file_readbdo_generic_file_readcgeneric_file_readahead 2一般文件 mmapageneric_file_mmap 3一般文件截断avmtruncatebvmtruncate_listczap_page_rangedzap_pmd_rangeezap_pte_rangeftruncate_inode_pagesgtruncate_list_pageshtruncate_complete_pageido_flushpagejtruncate_partial_page 4从页面高速缓存中读入页面afilemap_nopagebage_cache_read 5为 nopage() 进行预读文件anopage_sequential_readaheadbread_cluster_nonblocking 6交换相关的预读aswapin_readaheadbvalid_swaphandles 符号 一、进程内存描述符
1、 进程内存描述符
1初始化一个描述符 传送门 4.3.2 初始化一个描述符 系统中的 mm_struct 开始称为 init_mm 它在编译时由宏 INIT_MM() 静态初始化。
// include/linux/sched.h
#define INIT_MM(name)
{ \mm_rb: RB_ROOT, \pgd: swapper_pg_dir, \mm_users: ATOMIC_INIT(2), \mm_count: ATOMIC_INIT(1), \mmap_sem: RWSEM_INITIALIZER(name.mmap_sem), \page_table_lock: SPIN_LOCK_UNLOCKED, \mmlist: LIST_HEAD_INIT(name.mmlist),
}// arch/i386/kernel/init_task.c
struct mm_struct init_mm INIT_MM(init_mm);新 mm_struct 在建立以后是它们父 mm_struct 的备份并且它们由 copy_mm() 以 init_mm() 初始化的字段来复制。
2复制一个描述符
acopy_mm 这个函数为给定的进程复制一份 mm_struct 。它仅在创建一个新进程后且需要它自己的 mm_struct 时由 do_fork() 调用。
// kernel/fork.c
// 这一块重置没有被子 mm_struct 继承的字段并找到一个复制源 mm 的字段。
// 这些参数是为克隆而传入的标志位和那些复制 mm_struct 的进程。
static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
{struct mm_struct * mm, oldmm;int retval;// 初始化与内存管理相关的task_struct字段。tsk-min_flt tsk-maj_flt 0;tsk-cmin_flt tsk-cmaj_flt 0;tsk-nswap tsk-cnswap 0;tsk-mm NULL;tsk-active_mm NULL;/** Are we cloning a kernel thread?** We need to steal a active VM for that../// 借用当前运行进程的mm来复制。 oldmm current-mm;// 一个没有mm的内核线程所以它可以立即返回。if (!oldmm)return 0;// 如果设置了 CLONE_VM 标志位子进程将与父进程共享mm。像 pthreads 这// 样的用户需要这样做。mm_users 字段加1, 以使mm不会过早销毁。// good_mm 标记设置 tsk-mm 和 tsk-active_mm, 并返回成功if (clone_flags CLONE_VM) {atomic_inc(oldmm-mm_users);mm oldmm;goto good_mm;}retval -ENOMEM;// 分配新的mm。mm allocate_mm();if (!mm)goto fail_nomem;/* Copy the current MM stuff.. */// 复制父mm, 并利用mm_init()来初始化特定进程的mm字段。memcpy(mm, oldmm, sizeof(mm));if (!mm_init(mm))goto fail_nomem;// 为那些无法自动管理其MMU的体系结构初始化MMU上下文。if (init_new_context(tsk,mm))goto free_pt;// 调用dup_mmap(),它负责复制所有VMA父进程用到的区域。down_write(oldmm-mmap_sem);retval dup_mmap(mm);up_write(oldmm-mmap_sem);// 一旦成功dup_mmap() 返回 0。如果失败标记 free_pt 将调用 mmput() 。它将// mm 的使用计数减 1if (retval)goto free_pt;/** child gets a private LDT (if there was an LDT in the parent)/// 基于父进程为新进程复制LDT。 copy_segments(tsk, mm);good_mm:// 设置新mmactive_mm 并返回成功。tsk-mm mm;tsk-active_mm mm;return 0;free_pt:mmput(mm);
fail_nomem:return retval;
}bmm_init 这个函数初始化特定进程的 mm 字段。
// kernel/fork.c
#define free_mm(mm) (kmem_cache_free(mm_cachep, (mm)))static struct mm_struct * mm_init(struct mm_struct * mm)
{// 设置用户数为l。atomic_set(mm-mm_users, 1);// 设置mm的引用计数为1。atomic_set(mm-mm_count, 1);// 初始化保护VMA链表的信号量。init_rwsem(mm-mmap_sem);// 初始化保护写访问的自旋锁。mm-page_table_lock SPIN_LOCK_UNLOCKED;// 为该结构分配新的PGD。mm-pgd pgd_alloc(mm);mm-def_flags 0;if (mm-pgd)return mm;free_mm(mm);return NULL;
}① ⇒ pgd_alloc pgd_alloc 函数
② ⇒ kmem_cache_free kmem_cache_free 函数
3分配一个描述符 提供了两个函数来分配一个 mm_struct。虽然有点容易混淆但它们实际上都是一样的。allocate_mm() 将从 slab 分配器中分配一个 mm_struct 。 mm_alloc() 将分配结构然后调用 mm_init() 来初始化。
aallocate_mm // kernel/fork.c
#define allocate_mm() (kmem_cache_alloc(mm_cachep, SLAB_KERNEL))
// 从slab分配器分配一个mm_struct。bmm_alloc // kernel/fork.c
/** Allocate and initialize an mm_struct.*/
struct mm_struct * mm_alloc(void)
{struct mm_struct * mm;// 从slab分配器分配一个mm_struct。mm allocate_mm();if (mm) {// 将结构的所有字段归0。memset(mm, 0, sizeof(mm));// 进行基本的初始化。 return mm_init(mm);}return NULL;
}4销毁一个描述符 mm 的一个新用户利用如下调用将使用计数加1 atomic_inc( mm-mm_users ); 利用 mmput() 将使用计数减 1。如果 mm_users 计数减到 0将调用 exit_mmap() 将所有的已映射区域删除而且所有的页表也将会销毁因为已经没有任何使用用户空间部分的使用者。mm_count 计数由 mmdrop() 减 1因为页表和 VMA 的使用者都记为一个 mm_struct 使用者。在 mm_count 减到 0 时mm_struct 将会被销毁。
ammput // kernel/fork.c
/** Decrement the use count and release all resources for an mm./
void mmput(struct mm_struct *mm)
{if (atomic_dec_and_lock(mm-mm_users, mmlist_lock)) {extern struct mm_struct *swap_mm;if (swap_mm mm)swap_mm list_entry(mm-mmlist.next, struct mm_struct, mmlist);list_del(mm-mmlist);mmlist_nr–;spin_unlock(mmlist_lock);exit_mmap(mm);mmdrop(mm);}
}bmmdrop cmmdrop 2、创建内存区域
1创建一个内存区域
ado_mmap bdo_mmap_pgoff 2插入一个内存区域
ainsert_vm_struct bfind_vma_prepare cvma_link dvma_link evma_link_list fvma_link_rb g__vma_link_file 3合并相邻区域
avma_merge bcan_vma_merge 4重映射并移动一个内存区域
asys_mremap bdo_mremap cmove_vma dmake_pages_present eget_user_pages fmove_page_tables gmove_one_page hget_one_pte ialloc_one_pte jcopy_one_pte 5删除内存区域
ado_munmap bunmap_fixup 6删除所有的内存区域
aexit_mmap bclear_page_tables cfree_one_pgd dfree_one_pmd 3、查找内存区域
1查找已映射内存区域
afind_vma bfind_vma_prev cfind_vma_intersection 2查找空闲内存区域
aget_unmapped_area barch_get_unmapped_area 4、对内存区域上锁和解锁
1对内存区域上锁
asys_mlock bsys_mlockall cdo_mlockall ddo_mlock 2对区域解锁
asys_munlock bsys_munlockall 3上锁/解锁后修整区域
amlock_fixup bulock_fixup_all cmlock_fixup_start dmlock_fixup_end emlock_fixup_middle 5、缺页中断
1x86 缺页中断处理程序
ado_page_fault 2扩展栈
aexpand_stack 3独立体系结构的页面中断处理程序
ahanle_mm_fault bhandle_pte_fault 4请求分配
ado_no_page bdo_anonymous_page 5请求分页
ado_swap_page bcan_share_swap_page cexclusive_swap_page 6写时复制COW 页面
ado_wp_page 6、页面相关的磁盘 I/O
1一般文件读
ageneric_file_read bdo_generic_file_read cgeneric_file_readahead 2一般文件 mmap
ageneric_file_mmap 3一般文件截断
avmtruncate bvmtruncate_list czap_page_range dzap_pmd_range ezap_pte_range ftruncate_inode_pages gtruncate_list_pages htruncate_complete_page ido_flushpage jtruncate_partial_page 4从页面高速缓存中读入页面
afilemap_nopage bage_cache_read 5为 nopage() 进行预读文件
anopage_sequential_readahead bread_cluster_nonblocking 6交换相关的预读
aswapin_readahead bvalid_swaphandles 符号 ⇐ ⇒ ⇔ ⇆ ⇒ ⟺ ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿ ⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑿⒀⒁⒂⒃⒄⒅⒆⒇ ➊➋➌➍➎➏➐➑➒➓⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴ ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ 123 y x 2 z 3 y x^2 z_3 yx2z3 y x 2 z 3 a b b a y x^2 z_3 \frac {a}{b} \sqrt[a]{b} yx2z3baab y x 2 z 3 (1) y x^2 z^3 \tag{1} yx2z3(1)
- 上一篇: 延边网站建设公司wordpress 多语言版本
- 下一篇: 延吉网站开发公司软件开发系统设计
相关文章
-
延边网站建设公司wordpress 多语言版本
延边网站建设公司wordpress 多语言版本
- 技术栈
- 2026年03月21日
-
延安网站建设费用教做黏土手工的网站
延安网站建设费用教做黏土手工的网站
- 技术栈
- 2026年03月21日
-
延安免费做网站重庆招标信息网
延安免费做网站重庆招标信息网
- 技术栈
- 2026年03月21日
-
延吉网站开发公司软件开发系统设计
延吉网站开发公司软件开发系统设计
- 技术栈
- 2026年03月21日
-
延平网站建设wzjseotradekey外贸平台官网
延平网站建设wzjseotradekey外贸平台官网
- 技术栈
- 2026年03月21日
-
严什么的烟 网站建设上海网站制作与推广
严什么的烟 网站建设上海网站制作与推广
- 技术栈
- 2026年03月21日
