学习网考试学习资料

Gzu521.com

Linux学习笔记(6)

LINUX教程   点击:次   发布时间:2006-12-19   【字体: 】   来源:blog
Gzu521.com我的学习网

enum fixed_addresses
{
#ifdef config_x86_local_apic nfix_apic_base, /* local (cpu) apic) -- required for smp or not */
#endif

#ifdef config_x86_io_apic nfix_io_apic_base_0, nfix_io_apic_base_end = fix_io_apic_base_0 + max_io_apics-1,
#endif
#ifdef config_x86_visws_apic nfix_co_cpu, /* cobalt timer */ fix_co_apic, /* cobalt apic redirection table */ nfix_li_pcia, /* lithium pci bridge a */ nfix_li_pcib, /* lithium pci bridge b */
#endif
#ifdef config_highmem nfix_kmap_begin, /* reserved pte’s for temporary kernel mappings */ nfix_kmap_end = fix_kmap_begin+(km_type_nr*nr_cpus)-1
#endif n__end_of_fixed_addresses

在一般情况下,linux在初始化时,总是尽可能的将所有的物理内存映射到内核地址空间中去。如果内核地址空间起始于0xc0000000,为vmalloc保留的虚拟地址空间是128m,那么最多只能有(1g-128m)的物理内存直接映射到内核空间中,内核可以直接访问。如果还有更多的内存,就称为高端内存,内核不能直接访问,只能通过修改页表映射后才能进行访问。

内存分区可以使内核页分配更加合理。当系统物理内存大于1g时,内核不能将所有的物理内存都预先映射到内核空间中,这样就产生了高端内存,高端内存最适于映射到用户进程空间中。预映射的部分可直接用于内核缓冲区,其中有一小块可用于dma操作的内存,留给dma操作分配用,一般不会轻易分配。内存分区还可以适应不连续的物理内存分布,是非一致性内存存取体系(numa)的基础

先看看代码中的注释:
in linux\include\linux\mmzone.h(version 2.4.16, line 67)
/*
* on machines where it is needed (eg pcs) we divide physical memory
* into multiple physical zones. on a pc we have 3 zones:
*
* zone_dma < 16 mb isa dma capable memory
* zone_normal16-896 mb direct mapped by the kernel
* zone_highmem > 896 mb only page cache and user processes
*/ n高端页面的映射
1)
高端物理页面共享一块4m的映射区域,该区域对齐于4m页边界,并用一张页表(pkmap_page_table)来完成映射操作。高端页面的映射地址由其页结构中virtual成员给出。
(void *virtual)(page结构)
2)
高端映射区逻辑页面的分配结构用分配表(pkmap_count)来描述,它有1024项,对应于映射区内不同的逻辑页面。当分配项的值等于零时为自由项,等于1时为缓冲项,大于1时为映射项。映射页面的分配基于分配表的扫描,当所有的自由项都用完时,系统将清除所有的缓冲项,如果连缓冲项都用完时,系统将进入等待状态。
3)
页缓冲尽可能地使用高端页面,当通过块结构刷新高端页面时,系统会在提交块设备<br>> ,原请求块,同时中转块被释放。

 

 


tlb(翻译后援存储器)

时间:2005-07-05
地点:同济大学科技园

by lxwpp Z7br" SS{ +f lV[ 本_资_料_来_源_于_贵_州_学_习_网 电脑课堂LINUX教程 Http://wwW.gzU521.coM )Z7br" SS{ +f lV

reson
由于页表尺寸较大,因此许多分页方案都只能把它保存在内存中,但这种设计对性能有很大的影响。(分页的时候,系统性能下降2/3 n 计算机设计者们发现:大部分程序倾向于对较少的页面进行大量的访问。因此只有一小部分页表项经常被用到,其他的很少被使用。

concept
tlb使个小的虚拟寻址的缓存,不需要经过页表就能把虚拟地址转换为物理地址的小的硬件设备

components
一个用来访问tlb的虚拟地址组成部分
【图】
tlb寄存器是由虚拟页号,有效位,保护位等组成

steps
1 cpu产生一个虚拟地址
2 mmu从tlb中取出相应的pte,如果命中转3;如果不命中,进行常规页表查找,用找到的pte淘汰tlb中的一个条目
3 mmu将这个虚拟地址翻译成物理地址并且把它发送到高速缓存/主存
4 高速缓存/主存将所有的请求的数据字节返回给cpu


figure1(tlb命中)
 
figure2(tlb不命中)

example
前提:虚拟地址14位,物理地址12位,页面大小64字节,tlb共有16个条目,缓存16个组 n给定虚拟地址0x3d4

flush-software
软件管理tlb
刚刚介绍的tlb故障处理都是由mmu硬件完成的。
现在的管理工作是由软件完成的。tlb条目由os显式装入,在没有命中的时候,mmu不是到页表中找到并装入信息而是产生一个故障交给os,os找到页面,淘汰一个条目,装入新条目 ntlb取一个合理的尺寸以减少不命中的频率,software管理tlb的效率高 n性能提高:实行预装入机制

essence
无论软件管理还是硬件管理,在tlb没命中的时候,都是对页表执行索引操作找出所引用的页面,然后把pte加入到tlb中。

flush
完成的工作:
(1)保证在任何时刻内存管理硬件所看到的进程的内核映射和内核页表一致
(2)如果负责内核管理的内核代码对于用户进程页面进行了修改,那么用户的进程在被允许继续执行前,要求必须在缓存中看到正确的数据

function
flush_cache_foo()
flush_tlb_foo()
地址空间改变前必须刷新缓存,防止缓存中存在非法的空映射。在刷新地址后,由于页表的改变,必须刷新tlb以便硬件可以把新的页表信息装入tlb nvoid flush_cache_all(void)
void flush_tlb_all(void)
用来通知相应机制,内核地址空间的映射已经被改变,意味着所有的进程都已经改变

 

 

vfs概述 nvfs的的数据结构
超级块(super_block)
索引节点(inode)
目录项(dentry)
文件(file) n与进程相关的文件结构 n
文件系统的安装
n文件系统的注册
根文件系统的安装
普通文件系统的安装
n目录项的缓冲
路径名到目标节点的转换

vfs概述
虚拟文件系统(vfs)的所有数据结构都是在运行之后建立的,在卸载时删除,而在磁盘上没有这些数据结构。
vfs不是真正的文件系统。与vfs相对应的ext2,msdos等称为具体的文件系统

linux系统中vfs和具体文件系统关系图
[图]

vfs的作用:
对具体文件系统的数据结构进行抽象,以一种统一的数据结构进行管理
接受用户层的系统调用,如read(),write(),open()等
支持多种具体文件系统之间的相互访问
接受内核其他子系统的操作请求,比如内存管理子系统,进程管理子系统

超级块(super_block)

对具体文件系统的超级块是文件系统中最重要的数据结构,它用来描述整个文件系统信息【组织结构和管理信息】。不涉及文件系统的内容
vfs超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时自动删除。
vfs超级块实际上应该说成是某个具体文件系统的vfs超级块
超级块对象由super_block结构组成

上 一 页 下 一 页
10页: 第 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]

责任编辑:gzu521

电脑课堂分类
Windows 2000教程
Windows XP教程
Windows 2003教程
Windows Vista教程
LINUX教程
软件教学
办公软件
硬件DIY
分类推荐信息
更多...
大类最新文章
更多...