`
longxj
  • 浏览: 101777 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
文章列表
linux可以直接运行的文件格式都保存在一个list里,其中list的基本结构是linux_binfmt,这个结构包含3个methods:1.load_binary:执行文件创建execution environment的方法2.load_shlib:binds a shared library3.core_dump:dump the execution context of the current process in a file named core.而需要解释器来执行的文件格式,则需要在/proc/sys/fs/binfmt_misc里写入下面格式的字符串::name:type:offs ...
exec系列函数从linux的linux_binfmt链表中,通过依次调用每个结构的load_binary函数来选择合适的运行格式,一旦找到就执行load_binary函数,否则尝试下一个linux_binfmt的load_binary,直到尝试完所有的linux_binfmt。load_binary函数:1.检查128位的magic number,看文件是不是属于这个格式2.读取文件的header3.从文件得到dynamic linker的位置4.检查dynamic linker是否有效5.调用flush_old_exec()函数,清除被之前计算所使用的所有资源,像内存,页表6.使用do_mm ...
linux的进程有2种memory region layout:1.classic layout2.flexible layout见<understanding the linux kernel>-819页type of memory regionclassic layout flexible layouttext segment(elf) start from 0x08048000data and bss segments start right after textheapstart right afte the data and bss file memory mappin ...
在linux2.2以前,进行系统调用时,kernel将会对传入的参数进行比较细致的检查,特别是对指针参数,但是linux2.2后,系统在函数开始时只会检查指针是否是属于用户地址空间,而是不是有效的则在进行相关操作时才进行。2009/02/12 四
However, once the kernel initialization phase ends, the master kernel Page Tables are not directly used by any process or kernel thread. 内核使用的master page table并不是直接被进程或者内核线程使用,而内核在申请内存空间时,使用的lazy手法不会更新进程的page table(因为更新所有的进程page table是非常耗时的),而当进程在内核态访问内核线性地址时,就会发生缺页fault,这时缺页处理函数会将相应的master page tabl ...
当一个进程要增加线性空间时,kernel首先检查看是不是现有的memory region是不是可以被增大,如果不可以的话,就创建一个新的memory region。一个进程可以包含多个memory region,他们用list结构进行存储,考虑到如果一个进程包含太多的memory region时,查找一个特定的线性地址在哪个memory region时,开销太大。所以每个进程的mm_struct(也就是跟内存分配有关的数据结构)还有一个结构,保存了所有memory region的指针,这个结构是一个红黑树,所以可以方便地查找特定的线性地址所在的memory region.一般的访问是通过list ...
当一个进程第一次对一个页进行读操作时,而且该页不在内存中时,kernel应该给进程分配一个新的页帧,更安全的做法是分配一个filled with zero的页帧给进程,这样才能保证别的进程的信息不会被新的进程给读取,所以linux中保留的一个这样filled with zero的页帧,叫zero page,当这种情况发生时,系统就将zero page填入页表中,并标记为不可写。当进程要对zero page进行写操作时则copy on write 机制就会被触发。2009/02/07 六
共有1g线性空间,分成4部分:1.先映射内存的前896m空间,到high_memory结束2.剩下的用于noncontiguous memory area映射,从VMALLOC_OFFSET到VMALLOC_END,其中VMALLOC_OFFSET距high_memory8mb,每个被映射的noncontiguous memory area中间还要间隔4kb3.用于映射persistent kernel mapping,从PKMAP_BASE开始4.最后这部分用于fix-mapped linear address 详见<understand the linux kernel>第3版3 ...
Linux 2.6 also features a vmap( ) function, which maps page frames already allocated in a noncontiguous memory area: essentially, this function receives as its parameter an array of pointers to page descriptors, invokes get_vm_area( ) to get a new vm_struct descriptor, and then invokes map_vm_area( ) ...
首先要说的是memory area,因为有时需要的内存没有一个page frame那么大,比方说只有10bytes,如果分配一个page frame给它,则会产生很多internal fraction。这是一方面,更重要的是很多kernel的数据结构都不正好是一个或几个page frame那么大,那么在分配的时候就会造成很多internal fraction。为了解决这个问题,linux现在是采用sun solris的解决方法。在内存划出多块区域,被称为cache用来存放常用的kernel object,每个cache用来存放一类kernel object,每个cache被分为多个slab,每个 ...
slab color是为了提高硬件cache的使用率,因为相同大小的object in different slabs有很大的可能被映射到同一个cache line,而同时又会有其它的cacheline处于空闲。解决方法如下:假设aln是对齐参数,free是每个slab为了对齐而未被使用的空间,通常free>aln将color*aln未使用的空间放到slab的最前面,后面留free-color*aln。这样就可以错开各个slab里有相同offset的object了。(color<free/aln)从这里又可以看到linux在设计时的细心程度,连本来没用的空间(free),也被用来优化 ...
memory pool是给kernel component使用的内存cache,它保存了一些object,书上称为了memory element。是为了保证在低内存的情况下,也就是向memory allocator再也申请不到所要的内存时,component仍然可以从memory pool中申请到所需要的空间。一个memory pool中所有的cache都是一类的。2009/02/05 四
这是一个很著名的算法,它的思想如下:首先将一系列连续的page frame看作一个block,然后每次需要allocation时,都会将一个block分成一半,一半用来满足需求,另一半则是free的,kernel中用一个list,来记录所有可用block。在linux中,这个list的名字是free_area array,数组的大小是11,即1, 2, 4, 8, 16, 32, 64, 128, 256, 512, and 1024 contiguous page frames.合并的时候需要满足3个条件:1.Both blocks have the same size, say b.2.Th ...
linux保留了一定的reserved page frame数量由以下方式决定:The amount of the reserved memory (in kilobytes) is stored in the min_free_kbytes variable. Its initial value is set during kernel initialization anddepends on the amount of physical memory that is directly mapped in the kernel's fourth gigabyte of linear addre ...
linux使用3种方法来实现这个目标:1.permanent kernel mappings: 这种实现方法有两个核心的数据结构,一个是dedicated page table,地址由变量pkmap_page_table来指明,这个table有512或者1024中entries,取决于pae是否被激活,负责将线性地址转为物 ...
Global site tag (gtag.js) - Google Analytics