商家名称 | 信用等级 | 购买信息 | 订购本书 |
Linux 操作系统原理与应用(第2版)(陈莉君著) | |||
Linux 操作系统原理与应用(第2版)(陈莉君著) |
版权页:
插图:
为此,Linux内核设置了一个定期将页面换出的守护进程kswapd。
从原理上说,kswapd相当于一个进程,它有自己的进程控制块task_struct结构。与其他进程一样受内核的调度。而正因为内核将它按进程来调度,所以可以让它在系统相对空闲的时候来运行。不过,与普通进程相比,kswapd有其特殊性。首先,它没有自己独立的地址空间,所以在近代操作系统理论中把它称为“线程”或“守护进程”以与进程相区别。
那么,kswapd到底隔多长时间运行一次,这由内核设计时所确定的一个常量HZ决定。HZ决定了内核中每秒时钟中断的次数,用户可以在编译内核前的系统配置阶段改变其值,但是一经编译就确定下来了。在Linux2.4 的内核中,每秒钟kswapd被调用一次。
kswapd的执行路线分为两部分,第一部分是发现物理页面已经短缺的情况下才进行的,目的在于预先找出若干页面,且将这些页面的映射断开,使这些物理页面从活跃状态转入不活跃状态,为页面的换出做好准备。第二部分是每次都要执行的,目的在于把已经处于不活跃状态的“脏”页面写入交换区,使它们成为不活跃的“干净”页面继续缓冲,或进一步回收这样的页面成为空闲页面。
在本章的学习中,有一点需特别向读者强调。在Linux系统中,CPU不能按物理地址访问存储空间,而必须使用虚拟地址。因此,对于Linux内核映像,即使系统启动时将其全部装入物理内存,也要将其映射到虚拟地址空间中的内核空间,而对于用户程序,其经过编译、链接后形成的映像文件最初存于磁盘上,当该程序被运行时,先要建立该映像与虚拟地址空间的映射关系,当真正需要物理内存时,才建立地址空间与物理空间的映射关系。内存管理实例
我们希望能通过访问用户空间的内存达到读取内核数据的目的,这样便可以进行内核空间到用户空间的大规模信息传送,从而应用于高速数据采集等性能要求高的场合。
因为通过外设采集的数据首先会由驱动程序放入内核,然后才传送到用户空间由应用程序做进一步的处理。由于内核内存是受保护的,因此,要想将其数据拷贝到用户空间,通常的方法是利用系统调用,但是系统调用的缺点是速度慢,这会成为数据高速处理的瓶颈。因此我们希望可以从用户空间直接读取内核数据,从而省去数据在两个空间拷贝的过程。
具体地讲,我们要利用内存映射功能,将内核中的一部分虚拟内存映射到用户空间,使得访问用户空间地址等同于访问被映射的内核空间地址,从而不再需要数据拷贝操作。
4.6.1 相关背景知识
我们知道,在内核空间中调用kmalloc()分配连续物理空间,而调用vmalloc()分配非连续物理空间。在这里,把kmalloc()所分配的内核空间称为内核逻辑空间(KernelLogicSpace)。它所分配的内核空间虚地址是连续的,所以能很容易获得其对应的实际物理地址,即“内核虚地址-PAGE_OFFSET=实际的物理地址”。另外,由于系统在初始化时就建立了内核页表swapper_pg_dir,而kmalloc()分配过程所使用的就是该页表,因此也省去了建立和更新页表的工作。
相关阅读:
更多图书资讯可访问读书人图书频道:http://www.reAder8.cn/book/