1、 关于虚拟地址空间的说法错误的是()
A. 进程地址空间是用多少分配多少,4G仅仅是最大限额
B. 进程的地址空间并不一定对应实际的物理页
C. 不同进程的不同虚拟地址可以映射到相同的物理页
D. 不同进程的相同虚拟地址不能映射到相同的物理页
解答:D
2、 关于mmap设备的说法,错误的是()
A. 映射一个设备,意味着使用户空间的一段地址关联到设备内存上
B. 串口设备和其他面向流的设备就可以实现mmap抽象
C. 被映射的区域必须是PAGE_SIZE的整数倍,而且必须位于起始于 PAGE_SIZE整数倍地址的物理内存内
D. 有两种建立页表的方法:使用remap_page_range函数可一次建立所有的页表,或者通过nopage VMA方法每次建立一个页表
解答:B。
分析:对于驱动程序来说,内存映射可以提供给用户程序直接访问设备内存的能力。映射一个设备,意味着使用户空间的一段地址关联到设备内存上。无论何时,只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问。
并不是所有的设备都能进行mmap抽象。例如,串口设备和其他面向流的设备就无法实现这种抽象。mmap的另一个限制是映射都是以 PAGE_SIZE为单位的。内核只能在页表一级处理虚拟地址;因此,被映射的区域必须是PAGE_SIZE的整数倍,而且必须位于起始于 PAGE_SIZE整数倍地址的物理内存内。如果区域的大小不是页大小的整数倍,内核就通过生成一个稍微大一些的区域来容纳它。
mmap方法是file_operations结构中的一员,并且在执行mmap系统调用时就会调用该方法。在调用实际方法之前,内核会完成很多工作,而且该方法的原型与系统调用的原型由很大区别。
文件操作声明如下:
int (*mmap) (struct file * filp, struct vm_area_struct *vma);
其中vma参数包含了用于访问设备的虚拟地址区间的信息。大部分工作已经由内核完成了,要实现mmap,驱动程序只要为这一地址范围构造合适的页表即可,如果需要的话,就用一个新的操作集替换vma->vm_ops。
有两种建立页表的方法:使用remap_page_range函数可一次建立所有的页表,或者通过nopage VMA方法每次建立一个页表。
3、 下列说法错误的是()
A. 对于一个CPU来说,只需要有当前进程的页表,就可以实现其虚拟地址到物理地址的转化
B. 发生中断时,需要进行地址空间切换
C. 内核线程没有进程地址空间,也没有相关的内存描述符,内核线程对应的进程描述符中mm域也为空
D. inux中实现了快表(TLB),其本质是一个缓冲器,作为一个将虚拟地址映射到物理地址的硬件缓存
解答:B。
分析:中断处理不需要切换进程空间,直接在当前进程空间进行中断处理。
4、 地址空间布局分布从低到高顺序正确的是()
A. "物理内存区", "虚拟内存分配区", "高端页面映射区", "专用页面映射区", "系统保留映射区"
B. "虚拟内存分配区","物理内存区" , "专用页面映射区","高端页面映射区", ,"系统保留映射区"
C. "物理内存区", "高端页面映射区", "虚拟内存分配区", "专用页面映射区", "系统保留映射区"
D. "物理内存区", "高端页面映射区", "虚拟内存分配区", "专用页面映射区", "系统保留映射区"
解答:A
分析:
1) Linux将整个4G线性地址空间分为用户空间和内核空间两部分, 而内核地址空间又被划分为"物理内存区", "虚拟内存分配区", "高端页面映射区", "专用页面映射区", "系统保留映射区"几个区域.
2) 在标准配置下, 物理区最大长度为896M, 系统的物理内存被顺序映射在物理区中, 在支持扩展页长(PSE)和全局页面(PGE)的机器上, 物理区使用4M页面并作为全局页面来处理. 当系统物理内存大于896M时, 超过物理区的那部分内存称为高端内存, 低端内存和高端内存用highmem_start_page变量来定界, 内核在存取高端内存时必须将它们映射到"高端页面映射区".
3) Linux保留内核空间最顶部128K区域作为保留区, 紧接保留区以下的一段区域为专用页面映射区, 它的总尺寸和每一页的用途由fixed_address枚举结构在编绎时预定义, 用__fix_to_virt(index)可获取专用区内预定义页面的逻辑地址. 在专用页面区内为每个CPU预定义了一张高端内存映射页, 用于在中断处理中高端页面的映射操作.
4) 距离内核空间顶部32M, 长度为4M的一段区域为高端内存映射区, 它正好占用1个页帧表所表示的物理内存总量, 它可以缓冲1024个高端页面的映射. 在物理区和高端映射区之间为虚存内存分配区, 用于vmalloc()函数, 它的前部与物理区有8M隔离带, 后部与高端映射区有8K的隔离带.
5) 当系统物理内存超过4G时, 必须使用CPU的扩展分页(PAE)模式所提供的64位页目录项才能存取到4G以上的物理内存. 在PAE模式下, 线性地址到物理地址的转换使用3级页表, 第1级页目录由线性地址的最高2位索引, 每一目录项对应1G的寻址空间, 第2级页目录项以9位索引, 每一目录项对应2M的寻址空间, 第3级页目录项以9位索引, 每一目录项对应4K的页帧. 除了页目录项所描述的物理地址扩展为36位外, 64位和32位页目录项结构没有什么区别. 在PAE模式下, 包含PSE位的中级页目录项所对应的页面从4M减少为2M.
5、 关于IO与内存空间说法错误的是()
A. I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问
B. 内存空间可以直接通过地址、指针来访问
C. 内存空间是可选的,而I/O空间是必须的
D. I/O空间单元必须表示成大于PAGE_OFFSET的地址
解答:C。
分析:在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问。端口号标识了外设的寄存器地址。Intel语法的in、out指令格式为:
IN 累加器, {端口号│DX}
OUT {端口号│DX},累加器
目前,大多数嵌入式微控制器如ARM、PowerPC等中并不提供I/O空间,而仅存在内存空间。内存空间可以直接通过地址、指针来访问,程序和程序运行中使用的变量和其他数据都存在于内存空间中。即便是在X86处理器中,虽然提供了I/O空间,如果由我们自己设计电路板,外设仍然可以只挂接在内存空间。此时,CPU可以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的I/O指令。因此,内存空间是必须的,而I/O空间是可选的。 内核程序作用于虚拟地址,因此I/O空间单元必须表示成大于PAGE_OFFSET的地址