Linux内核
酉阳书社
这个作者很懒,什么都没留下…
展开
-
Linux内核之物理内存管理
Linux内核对于内存的管理摒弃了i386复杂的段式管理,而是采用了页式管理。Linux把整个的物理内存空间化为成一个个单独的页面,每页占4K空间大小。Linux把所有页面链接到一个全局的数组mem_map[]中,mem_map的每一个元素都是一个指针指向page数据结构。系统中的每个物理页面都对应着一个page数据结构,并根据需要把这些页面划分为不同的管理区:ZONE_DMA,ZONE_NORM...原创 2010-07-10 20:03:25 · 121 阅读 · 0 评论 -
Linux内核之中断向量的初始化
LInux内核在完成了对页式虚存的管理之后,调用trap_init()和init_IRQ()两个函数进行中断机制的初始化。其中trap_init()主要完成一些系统保留的中断向量的初始化,init_IRQ()则主要用于外设的初始化。 trap_init()首先设置中断向量表(IDT)开头的19个陷阱门,这些中断向量都是系统保留用于异常处理的。中断向量14就是用于页面异常保留的。然后是对系统...原创 2010-09-14 19:45:53 · 351 阅读 · 0 评论 -
系统调用mmap()
一个进程可以通过系统调用mmap(),将一个已打开的内容映射到他的用户空间。内核中实现这个函数是sys_mmap2()。 具体的映射是动态的,时常在变。所谓文件与虚存之间的映射包含着两个环节:一是物理页面与文件映像之间的换入,换出;二是物理页面与虚存页面之间的映射。 1. 当区间中的一个页面首次收到访问时,会因为页面无映射,发生缺页异常,相应的页面异常处理函数为do_no_page...原创 2010-09-11 21:20:29 · 150 阅读 · 0 评论 -
系统调用brk()
用户进程通过系统调用brk() 向内核申请空间,brk()在内核中由sys_brk实现。brk()对于用户进程在堆上分配的内存进行批量向内核申请。 一个有用户空间映射可换出的页面,同时在三个队列中。一般通过其队列头list链入某换入/换出队列,即相应address_space结构中的 clean_pages, dirty_list和locked_pages三个队列之一;二是通过其队列头lr...原创 2010-09-11 21:01:02 · 667 阅读 · 0 评论 -
Linux内核之外设存贮空间的地址映射
Linux对于外设的访问一般有两种方式:一种叫内存映射,另一种叫I/O映射。随着外设的寄存器和自身存贮空间的增加,采用第二种方式已经远远不能满足外设的需要。Linux看到的外设的地址都是总线地址,相应的存贮空间都在系统空间(3GB以上)。 内核为自己保持一个虚存区间队列vmlist,这是由一串vm_struct数据结构组成的一个单链队列。相似于供进程使用的vm_area_struct结构。...原创 2010-09-09 21:01:01 · 271 阅读 · 0 评论 -
Linux内核之内核缓冲区的管理
Linux内核采用slab方法来管理内核缓冲区,slab类似于面向对象的方法进行内核区的分配和回收。 1. slab可能由1个,2个,4个.......最多32个连续的物理页面构成;2. 每个slab都有slab的描述结构slab_t,用于同一种对象或多个slab通过描述结构队列头形成一个双向链队列。每个slab结构逻辑上分成3段,对一段是各个slab上所有的对象都已分配使用;第二个是...原创 2010-08-31 20:51:29 · 379 阅读 · 0 评论 -
Linux内核之页面的换入
在页面表项和页面目录中P标志为0表示相应的物理页面不在内存,从而无法完成本次访问,cpu就会产生一次缺页异常。当页面在内存时,页面表项是一个pet_t结构,指向一个内存页面;当页面不在内存时,则是一个swap_t结构,指向一个盘上页面。 处理一次因缺页产生的异常,首先要检查相应的页面是否还在swapper_space的换入/换出队列中尚未释放,那就通过read_swap_cache()分配...原创 2010-08-30 22:14:18 · 168 阅读 · 0 评论 -
Linux内核之页面的换出
Linux通过一个守护线程kswapd进行页面的定期换出,这个时间间隔由编译内核是决定。kswapd一般会执行以下两个部分的例行操作:1. 在发现物理页面短缺的情况下进行的,目的是预先找出一些页面,且将这些页面的映射断开,使这些页面从活跃状态转到不活跃状态,为页面换出做准备。 2. 每次都要执行,目的在于把处于不活跃的脏页面写入交换设备,使他们成为不活跃的“干净”页面,继续缓冲,或进一...原创 2010-08-29 19:46:29 · 188 阅读 · 0 评论 -
Linux内核之物理页面使用和周转
Linux把暂时不用的物理内存页放在交换分区,其中swap_map指向一个数组,该数组中的每一个短整数代表盘上的一个物理页面,而数组的下标决定了该页面在盘上的位置。数组的第一个元素swap_mem[0]表示设备和文件自身的一些信息。链表swap_list各个swap_info_struct结构按优先级高低连接在一起。 而内存页面的周转有两方面的意思,其一是页面的分配,使用和回收;其二是...原创 2010-07-28 20:18:30 · 194 阅读 · 0 评论 -
Linux协议栈之ICMP和IGMP传输协议
ICMP(Internet Control Message Protocol)和IGMP(Internet Group Management Protocol)fenbie用于网络侦错和组播,多播管理。如下一些常用的IP分组:224.0.0.1:该子网所有系统组224.0.0.2:该子网所有路由器组224.0.1.1:网络时间协议NTP224.0.0.9:路由协议RIP-2...原创 2010-07-20 22:09:27 · 403 阅读 · 0 评论 -
Linux内核之物理页面的分配
物理页面的分配使用函数:static inline struct page * alloc_pages(unsigned int gfp_mask, unsigned int order) 参数gfp_mask表示分配的策略,order表示所需物理块的大小。gfp_mask作为下标查找数组node_zonelists[]决定具体的分配策略。 其具体分配的流程如下:1. 如果...原创 2010-07-14 21:47:27 · 438 阅读 · 0 评论 -
Linux内核之虚拟内存管理(二)
Linux把整个的虚拟存贮空间自上而下分为系统空间,堆栈空间,数据段和代码段。当系统访问页面异常时,cpu将失败的线性地址保存在CR2中。同时还会传来两个参数pt_regs和error_code。前者保存了异常发生前夕各寄存器的一个副本。 struct pt_regs { long ebx; long ecx; long edx; long esi; long edi;...原创 2010-07-14 20:56:10 · 256 阅读 · 0 评论 -
Linux内核之虚拟内存管理(一)
Linux内核对于虚拟内存的管理是以进程为基础的,每个进程都有自己的虚存空间。而系统空间是所有进程所共享的。对虚拟空间常用数据结构vm_area_struct来描述。 struct vm_area_struct { struct mm_struct * vm_mm; /* The address space we belong to. */ unsigned long vm_sta...原创 2010-07-13 22:19:57 · 205 阅读 · 0 评论 -
Linux内核之虚拟内存地址映射
Linux通过地址映射将物理页面映射到4G的虚拟地址空间,其中3G以上是内核地址空间,而3G以下为用户地址空间。Linux中所有的进程将使用虚拟地址空间进行内存的管理和操作。 Linux内核的映射机制设计成三层,在页面目录和页面表中间增设了一层“中间目录”。页面目录为PGD,中间目录为PMD,而页面表为PT。PT中的表项PTE(page Table Entery)。而对于i386 CPU直...原创 2010-07-10 20:35:30 · 243 阅读 · 0 评论 -
Linux内核之中断请求队列的初始化
前面所说的中断向量表IDT,有两种表项:一种是保留专用于CPU本身的中断门,主要用于CPU产生的异常以及由用户程序长生的系统调用,这些中断向量处系统调用的0x80之外都在0x20之下。从0x20之上就是第二种表项共224项,都用于外设的通用中断。二者的区别在于,外设中断门可以为多个中断源所共享。 IDT表初始化完成之初,每个中断服务队列都是空的。真正的中断服务要到具体的设备初始化程序将...原创 2010-09-15 20:48:04 · 151 阅读 · 0 评论