首页 >> 金融 >> 任务空间监管

任务空间监管

2024-01-16 金融

mmap_base:线程同构的算起URLmmap_legacy_base:表示同构的基址,在32位中所为比较简单的TASK_UNMAPPED_BASE,而在64位中所,发挥作用一个虚拟URL随机同构机制,因此为TASK_UNMAPPED_BASE + mmap_rnd()hiwater_rss:RSS的更高海平面应用于具棒状情况hiwater_vm:更高海平面虚拟线程应用于具棒状情况total_vm:同构的总每页locked_vm:被锁定没法换显露的每页pinned_vm:没法换显露也没法移动的每页data_vm:存放统计数据的每页exec_vm:存放exe的每页stack_vm:存放堆叠的每页arg_lock:引入spin_lock运用于确保对上面七地区参数们的并行采访start_code 和 end_code:可分派文档的开始和结束前方start_data 和 end_data :已初始化统计数据的开始前方和结束前方start_brk :瓦砾的算起前方brk :瓦砾近期的结束前方start_stack :堆叠的算起前方,堆叠的结束前方在线程的堆叠顶指针中所arg_start 和 arg_end :参数此表的前方,设于堆叠中所最更高URL的大多。env_start 和 env_end :环境参数的前方,设于堆叠中所最更高URL的大多。 1struct mm_struct { 2...... 3 unsigned long mmap_base; /* base of mmap area */ 4 unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */ 5...... 6 unsigned long hiwater_rss; /* High-watermark of RSS usage */ 7 unsigned long hiwater_vm; /* High-water virtual memory usage */ 8 unsigned long total_vm; /* Total pages mapped */ 9 unsigned long locked_vm; /* Pages that he PG_mlocked set */10 atomic64_t pinned_vm; /* Refcount permanently increased */11 unsigned long data_vm; /* VM_WRITE Co ~VM_SHARED Co ~VM_STACK */12 unsigned long exec_vm; /* VM_EXEC Co ~VM_WRITE Co ~VM_STACK */13 unsigned long stack_vm; /* VM_STACK */ 14 spinlock_t arg_lock; /* protect the below fields */15 unsigned long start_code, end_code, start_data, end_data;16 unsigned long start_brk, brk, start_stack;17 unsigned long arg_start, arg_end, env_start, env_end;18 unsigned long sed_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ 19......20}

  根据这些的组织参数,我们可以建设显露应用程序稳态中所各个部份的前方,但是我们还必须一个构件棒状描述这些七地区的属性,即vm_area_struct

1struct mm_struct {2...... 3 struct vm_area_struct *mmap; /* list of VMAs */4 struct rb_root mm_rb; 5...... 6}

  vm_area_struct的具棒状构件棒状定义如下所示,仅仅是通过vm_next和vm_prev第一组而成的双向链表,即通过一系列的vm_area_struct来表述一个统计数据流在应用程序稳态均等的各个七地区的主旨。

vm_start和vm_end表述该块七地区的开始和结束为止vm_rb也就是说一颗红黑松树,这颗红黑松树将所有vm_area_struct第一组起来,便于遗漏查找。rb_subtree_gap传输近期七地区和上个七地区之间的间隔,运用于近期均等应用于。vm_mm指向该构件棒状同属的vm_structvm_page_prot经营管理该页的推送权责,vm_Flags为标记位rb和rb_subtree_last:有机余前方的七区间松树构件ano_vma 和 ano_vma_chain:寄信同构。虚拟线程七地区可以同构到物理学线程,也可以同构到副本,同构到物理学线程的时候统称寄信同构,同构到副本必须vm_File指定被同构副本,vm_pgoff传输偏移量。vm_opts:指向该构件棒状的参数指针,运用于处理该构件棒状vm_private_data:私有统计数据传输 1/* 2 * This struct defines a memory VMM memory area. There is one of these 3 * per VM-area/task. A VM area is any part of the process virtual memory 4 * space that has a special rule for the page-fault handlers (ie a shared 5 * library, the executable area etc). 6 */ 7struct vm_area_struct { 8 /* The first cache line has the info for VMA tree walking. */ 9 unsigned long vm_start; /* Our start address within vm_mm. */10 unsigned long vm_end; /* The first byte after our end address11 within vm_mm. */12 /* linked list of VM areas per task, sorted by address */13 struct vm_area_struct *vm_next, *vm_pre14 struct rb_node vm_rb;15 /*16 * Largest free memory gap in bytes to the left of this VMA.17 * Either between this VMA and vma->vm_prev, or between one of the18 * VMAs below us in the VMA rbtree and its ->vm_prev. This helps19 * get_unmapped_area find a free area of the right size.20 */21 unsigned long rb_subtree_gap;22 /* Second cache line starts here. */23 struct mm_struct *vm_mm; /* The address space we belong to. */24 pgprot_t vm_page_prot; /* Access permissions of this VMA. */25 unsigned long vm_flags; /* Flags, see mm.h. */26 /*27 * For areas with an address space and backing store,28 * linkage into the address_space->i_mmap interval tree.29 */30 struct {31 struct rb_node rb;32 unsigned long rb_subtree_last;33 } shared;34 /*35 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma36 * list, after a COW of one of the file pages. A MAP_SHARED vma37 * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack38 * or brk vma (with NULL file) can only be in an anon_vma list.39 */40 struct list_head anon_vma_chain; /* Serialized by mmap_sem Co page_table_lock */41 struct anon_vma *anon_vma; /* Serialized by page_table_lock */42 /* Function pointers to deal with this struct. */43 const struct vm_operations_struct *vm_ops;44 /* Information about our backing store: */45 unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE46 units */47 struct file * vm_file; /* File we map to (can be NULL). */48 void * vm_private_data; /* was vm_pte (shared mem) */49 atomic_long_t swap_readahead_info;50#ifndef CONFIG_MMU51 struct vm_region *vm_region; /* NOMMU mapping region */52#endif53#ifdef CONFIG_NUMA54 struct mempolicy *vm_policy; /* NUMA policy for the VMA */55#endif56 struct vm_userfaultfd_ctx vm_userfaultfd_ctx;57} _randomize_layout;

  对一个mm_struct来说,其众多的vm_area_struct才会在ELF副本加载,即load_elf_binary()时构造。该参数在解析ELF文档后,就才会进行时线程同构的建起,主要包括

初始化 setup_new_exec,增设线程同构七区 mmap_base初始化 setup_arg_pages,增设堆叠的 vm_area_struct,这之中所增设了 mm->arg_start 是指向堆叠底的,current->mm->start_stack 就是堆叠底elf_map 才会将 ELF 副本中所的文档部份同构到线程中所来set_brk 增设了瓦砾的 vm_area_struct,这之中所增设了 current->mm->start_brk = current->mm->brk,也即瓦砾之中所还是机的load_elf_interp 将依赖的 so 同构到线程中所的线程同构七地区 1static int load_elf_binary(struct linux_binprm *bprm) 2{ 3...... 4 setup_new_exec(bprm); 5...... 6 /* Do this so that we can load the interpreter, if need be. We will 7 change some of these later */ 8 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP), 9 executable_stack);10......11 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,12 elf_prot, elf_flags, total_size);13......14 /* Calling set_brk effectively mmaps the pages that we need15 * for the bss and break sections. We must do this before16 * mapping in the interpreter, to make sure it doesn't wind17 * up getting placed where the bss needs to go.18 */ 19 retval = set_brk(elf_bss, elf_brk, bss_prot);20......21 elf_entry = load_elf_interp(Coloc->interp_elf_ex,22 interpreter,23 Cointerp_map_addr,24 load_bias, interp_elf_phdata);25......26 current->mm->end_code = end_code;27 current->mm->start_code = start_code;28 current->mm->start_data = start_data;29 current->mm->end_data = end_data;30 current->mm->start_stack = bprm->p;31......32}3.2 Linux稳态构件

  由于32位和64位系统结构设计密闭大小差距过大,因此构件上也有一些七差别。我们这里分别发表意见二者的构件。

3.2.1 32位Linux稳态构件

  Linux稳态的虚拟密闭和统计数据流是无关的,即所有统计数据流通过系统结构设计初始化进入Linux后,看到的虚拟URL密闭是一样的。如下三幅所示为32位Linux稳态虚拟密闭分布三幅。

image

1、并不必须同构七区

前896M为并不必须同构七区,该七地区运用于和物理学线程进行时并不必须同构。虚拟线程URL减去 3G,就给与也就是说的物理学线程的前方。在Linux之中所,有两个宇:

_pa(vaddr) 来到与虚拟URL vaddr 系统性的物理学URL;_va(paddr) 则计算显露也就是说于物理学URL paddr 的虚拟URL。  对于该部份虚拟URL的采访,同样采取分页的模式进行时,但是NTFSURL比较简单,并不必须一一也就是说即可。  在系统结构设计启动的时候,物理学线程的前 1M 现在被占用了,从 1M 开始加载Linux文档段,然后就是Linux的解释器、BSS 等,也是 ELF 之中所涵盖的。这样Linux的文档段,解释器,BSS 也就才会被同构到 3G 后的虚拟URL密闭之中所。具棒状的物理学线程样式可以察看 /proc/iomem,具棒状才会因为每个人的系统结构设计、可用等产生七差别。

2、high_memory  更智能化线程的名字来源于x86架构中所将物理学URL密闭分为三部份:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_HIGHMEM即为更智能化线程。

  更智能化线程是线程经营管理基本功能是非物理学线程的代称,指的也即896M并不必须同构七区后面的七地区。Linux中所除了线程经营管理基本功能外,其余均操作者虚拟URL。而线程经营管理基本功能才会并不必须操作者物理学URL,进行时虚拟URL的均等和同构。其发挥作用的意义是以32位系统结构设计有限的Linux密闭去采访无限的物理学线程密闭:借用这段逻辑URL密闭,建起同构到想采访的那段物理学线程(即嵌入LinuxNTFS),临时用一才会,用完后归还。

3、Linux动稳态同构密闭(noncontiguous memory allocation)  在VMALLOC_START和VMALLOC_END之间的七地区称之为Linux动稳态同构密闭,也就是说于应用程序稳态统计数据流malloc审核线程一样,在Linux稳态可以通过vmalloc来审核。Linux稳态有另行的NTFS经营管理,和应用程序稳态分开。

4、持久Linux同构七区(permanent kernel mapping)  PKMAP_BASE 到 FIXADDR_START 的密闭统称持久Linux同构,这个URL范围是 4G-8M 到 4G-4M 之间。应用于 alloc_pages() 参数的时候,在物理学线程的更智能化线程给与 struct page 构件,可以初始化 kmap() 将其同构到这个七地区。因为必需永久同构的数量有限,当依然必须更智能化线程时,应该中所止同构,这可以通过kunmap()参数来完成。

5、比较简单同构七区  FIXADDR_START 到 FIXADDR_TOP(0xFFFF F000) 的密闭,统称比较简单同构七地区,主要运用于充分利用特殊需求量。

6、临时同构七区(temporary kernel mapping)  临时Linux同构通过kmap_atomic和kunmap_atomic实现,主要运用于当必须写入物理学线程或主存时的操作者,如写入副本时应用于。

3.2.2 64位Linux稳态构件

  64位Linux稳态因为密闭不小,所以不必须像32位一样精打细算,并不必须自成很多的机闲七地区做确保,构件如下三幅所示

image

从 0xffff800000000000 开始就是Linux的部份,只不过一开始有 8T 的机档七地区。从 _PAGE_OFFSET_BASE(0xffff880000000000) 开始的 64T 的虚拟URL密闭是并不必须同构七地区,也就是减去 PAGE_OFFSET 就是物理学URL。虚拟URL和物理学URL之间的同构在大部份具棒状情况下还是才会通过建起NTFS的模式进行时同构。从 VMALLOC_START(0xffffc90000000000)开始到 VMALLOC_END(0xffffe90000000000)的 32T 的密闭是给 vmalloc 的。从 VMEMMAP_START(0xffffea0000000000)开始的 1T 密闭运用于存放物理学页面的描述构件 struct page 的。从 _START_KERNEL_map(0xffffffff80000000)开始的 512M 运用于存放Linux文档段、解释器、BSS 等。这里也就是说到物理学线程开始的前方,减去 _START_KERNEL_map 就能给与物理学线程的URL。这里和并不必须同构七区有点像,但是不矛盾,因为并不必须同构七区之前有 8T 的机当七地区,早就过了Linux文档在物理学线程中所加载的前方。回顾

  本文比较概要的深入研究了线程在应用程序稳态和Linux稳态的构件,以此辅以,下文可以开始深入研究线程的经营管理、同构了。

嵌入式海量必须学的东西真的并不多,千万不该学错了定线和主旨,致使工资要不上去!

分享大家一个参考资料包,差不多150多G。之中所学习主旨、面经、新项目都比较新也比较全!

扫码进群领参考资料

转载自:阿凡达linuxLinux

社论来源于目标密闭经营管理

原文链接:

类风湿性关节炎吃什么药好
腰疼吃什么药物能缓解
吃什么可补肾精抗衰老
昆明做第三代试管婴儿多少钱
拉肚子吃黄连素还是肠炎宁
友情链接