Linux内存寻址研究——极速之路(linux内存寻址)
Linux是构建在Unix操作系统的基础之上的,其特点是可移植性强,是构建计算机平台的一种常用操作系统,在这里我们将要研究Linux的内存寻址方式,帮助我们更好的构建适用于Linux的软件系统。
Linux是基于硬件设计的,它的主要工作内容是将CPU、内存和I/O等硬件资源分配给用户程序,Linux对内存寻址有着独到的设计,可以帮助Linux内核更加高效的工作,从而让运行在Linux平台上的程序能够更迅速的启动且拥有更少的延迟。
Linux通过分页方法来进行内存寻址,每个进程都有一组逻辑地址,它们不允许进程访问同一物理内存空间,而是根据进程的权限分配物理内存空间,为了尽可能的提高内存的使用效率,Linux内核将整个内存空间划分为若干等大的页,每个页大小4KB,这样每页都可以储存若干字节的数据。
Linux采用了一种非常受欢迎的增量式地址转换机制,负责将虚拟地址转换成物理地址,该机制又称为二级页表寻址,它可以大大减少对内存中虚拟地址的查询次数,从而加快寻址速度。其具体实现代码如下所示:
static inline unsigned long shm_vma_nopage(struct vm_area_struct *vma, unsigned long address, int *type)
{ struct page *page;
unsigned long page_table, page_addr; unsigned long pgd_entry, pmd_entry;
unsigned long pte_entry;
pgd_entry = pgd_offset(vma->vm_mm, address); pmd_entry = pmd_offset(pgd_entry, address);
pte_entry = pte_offset(pmd_entry, address); page_table = *pte_entry;
page_addr = (page_table & PAGE_MASK) | (address & ~PAGE_MASK); page = boinc_vma_nopage(vma->vm_file, page_addr, vma->vm_flags);
if (page) { get_page(page);
*type = VM_FAULT_MINOR; return (unsigned long)page_address(page);
} return 0;
}
以上就是Linux内存寻址的概况,由以上可以看出Linux在内存寻址上采取了独到的设计,可以大大提高内存使用效率。我们今后应该着重研究Linux在分配硬件资源上的优化,帮助我们开发更加高效的操作系统。