zoukankan      html  css  js  c++  java
  • 华为内部面试题库(14)

    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的地址

  • 相关阅读:
    C++ string 实现大整数相加减
    HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
    Quick-Cocos2d3.2RC1在Code IDE中实现代码提示
    Codeforces 558C Amr and Chemistry
    Linux编程---进程通信
    HDU 5371 Hotaru's problem(Manacher算法+贪心)
    微社区
    创业忌讳
    微信公众平台开发(82) 天气预报
    天气预报接口
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332756.html
Copyright © 2011-2022 走看看