x86 vt-d在linux中的应用
 
在新公司已近两年,所学甚多甚杂,已经不能用一篇水文来记录里面的点点滴滴,这是我一直没有写一篇总结的原因.现在想想随兴所至一些更好。

翻看前文,发现还差一篇风河hypervisor硬件虚拟化的文章,懒得写了,浪费时间.看过xen的代码后觉得hypervisor就是只小麻雀.以后有精力了写写xen里面对x86硬件虚拟化技术的利用,那将是一个大篇幅.今天介绍下linux里对x86硬件虚拟化技术的利用,算是个引子.xen里面用到硬件虚拟化那是理所当然,有意思的是linux也用到了里面的东西,vt-d,sr-iov.它当然不会用vt-x,这里不讲kvm,它本身就把linux变成了虚拟机而不是一个纯内核了.同样我不会写代码分析的细节,那是很无聊的事,只写我认为有意思的东西.

vt-d里主要有两个新技术,int remapping和dma remapping.
int remap在服务器配置中经常见到,如果系统中cpu超过255个或有apic_id>255的时候,intr是必须打开的,因为ioxapic系统即使在物理目标模式也只支持8bit的cpu_id,没有办法把中断分发给所有的cpu.而打开intr后,虽然ioapic中索引是16bit,但是irte中可以有32bit的物理地址或逻辑地址,最大能有2的32次个cpu.当然也有一些老系统只支持intr的xapic模式,也就是不能和x2apic配合,那和不打开也就没什么分别了,只在中断迁移时能保证不丢中断.intr关闭时,ioapic或msi/msix中触发中断后转换成内存写消息向上传到北桥,被识别为中断后自动分发给相应的cpu,中间还会经过cpu的仲裁与选择,识别是通过特殊地址信息fee来识别的.linux中已经基本有完善的支持了,只是缺msi这块,msi目前只支持单个中断,倒不是无法实现,只是代码要有大的改动,申请一段连续的vector和irq号都是比较困难的。msix比较不错,没有32个vector限制,而且每个vector和irq都不需要连续,缺点是会占用一些mem空间。另外打开msi中断后记得关闭legacy int。如果打开intr的话,rte或msix msg中要填的是一个索引,不是关于这个irq的所有信息,比如触发模式,目标模式,目标地址,vector等。这个index会去索引内存中一个irte的表,找到后取出其中的信息转发给apic。有意思的是这里面的信息就是irq的所有信息。当然那个表未必是一个,要看这个系统是不是只有一个pci段,或者说是不是只有一个drhd单元。另外irte是有缓存的,修改irte后要有指令清除irte缓存.

所谓dmar就是给设备一个地址空间映射,设备对内存的访问要通过一个页表结构转换成真正的访存地址.也就是说设备地址就是个设备虚拟地址,真正的访存地址是设备物理地址。这个页表结构和cpu的页表结构还有vmx的ept相似,可以有大页,还有地址映射的缓存即所谓iotlb,等同于cpu的tlb,但是在北桥里.有的系统为了优化,在设备中也提供了device-iotlb,这些对软件是透明的,只有特殊的刷新指令序列能改变它们.dmar在一些特殊场合有用,比如32bit pci设备要dma数据到4G以上地址,dmar可以提供这种映射,让高端地址在pci设备中映射为32bit的范围之内.关闭dmar的话只能用软件模拟了,即bounce-buffer.
整个iommu功能是在acpi表结构中提供的,目前有4种子表,drhd,rmrr,atsr,rhsa。其中drhd是最本文最关键的一个表,它枚举了每个dma重映射单元及属于它的下属设备,每个drhd有指针指向一个reg集合,里面会有irte表基址和dmar root entry,root entry数组,256项,指向context entry数组,context entry指向顶级页表。整个结构是由sid索引的,sid通常是bus,dev,fn,对pci桥下的设备,是桥的sid,也就是说所有pci桥下的设备都只能处于同一个域,具体在xen中的话只能直接分配桥下所有的设备给同一个domain。hpet和ioapic这两个特殊设备的sid是通过device scope得到的。rmrr指定保留内存,目前只在usb和显卡中用到,要注意不要将页表中含有这些保留内存的映射。否则会导致系统panic。atsr是关于device-iotlb,rhsa指定drhd单元的node亲和性,可用于各种表项内存分配的优化。写来写去,又虎头蛇尾了,但还是那句老话,随兴就好。

x86 vt-d在linux中的应用相关推荐

  1. linux进程tss和ldt,x86体系下linux中的任务切换与TSS

    tss的作用举例:保存不同特权级别下任务所使用的寄存器,特别重要的是esp,因为比如中断后,涉及特权级切换时(一个任务切换),首先要切换栈,这个栈显然是内核栈,那么如何找到该栈的地址呢,这需要从tss ...

  2. 笔记本虚拟机 安装红旗linux x86,在红旗linux中安装vmware虚拟机

    在红旗linux中安装vmware虚拟机 为了逐渐适应在linux下使用电脑的习惯,可以说试着在linux下进行相应的操作,想要离开windows,但就像有人形容微软是让人又爱又恨,已经习惯了在win ...

  3. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容...

    [Qt开发][VS开发][Linux开发]OpenCV.Qt-MinGw.Qt-msvc.VS2010.VS2015.Ubuntu Linux.ARM Linux中几个特别容易混淆的内容 标签:[Qt ...

  4. MIPS(loongson)linux 中添加系统调用

    在基于MISP(loongson)架构处理器与基于 x86 架构处理器的 linux 内核中添加系统调用时更改的文件是不同的,x86 中需要更改 arch/x86/kernel/syscall_tab ...

  5. 深入理解计算机系统-之-内存寻址(四)--linux中分段机制的实现方式

    linux中的分段机制 前面说了那么多关于分段机制的实现,其实,Linux以非常有限的方式使用分段.因为,Linux基本不使用分段的机制(注:并不是不使用,使用分段方式还是必须的,会简化程序的编写和运 ...

  6. Linux中常见命令和单词的缩写全称

    Linux中常见命令和单词的缩写全称 文章目录: 参考 ls:list(列出目录内容)cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat ...

  7. Linux 中使用 KVM

    听讲XEN很快就要从LINUX内核中去掉,redhat和Ubuntu也大力的在推广KVM,所以在Ubuntu下整了一下KVM,相当容易使用,基本比Vmware还要容易,但性能好上很多倍,因为他是半虚拟 ...

  8. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  9. linux 中/proc 详解

    proc 文件系统   在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西 ...

  10. eclipse中linux打包,Eclipse中Maven打包程序并在Linux中运行

    Eclipse中Maven打包程序并在Linux中运行 1 在Eclipse中新建Maven工程 新建后的maven工程如下: 新建Maven工程的默认pom.xml如下,不需要修改: 4.0.0 T ...

最新文章

  1. python各个解释器的用途-常用的五种Python解释器|老男孩网络Python学习课程
  2. 女性人均存款56.3万,中国女性存款为何比男性高?
  3. 6-12mysql库的操作
  4. nacos初探--作为配置中心
  5. 第2章 理解memcached的内存存储
  6. VS编译运行时提示:应用程序并行配置不正确,无法启动程序
  7. unity2018关联不到vs_Unity和VS2019下载及配置流程
  8. 【三极管知识】之【9011,9012,9013,9014,8050,8550 三极管的区别】
  9. 2020第二届长安杯电子数据竞赛试题(二次修改版),本人亲解,尽量做到细致仔细,镜像百度网盘奉上,建议大家联系一下,弘连题目还是很好的(强烈推荐)
  10. 神器——写Markdown来画流程图、时序图
  11. CAD想画得快,你需要看看我的吐槽
  12. 五分频电路(50%占空比)
  13. RGB与HSV是什么,为什么要进行转换
  14. win10系统计算器闪退怎么办? win10系统计算器闪退解决方法?
  15. 经典java程序源代码_【转】经典Java程序源代码(一)
  16. python 批量下载知网(CNKI)论文
  17. Karl Guttag:Magic Leap 2与HoloLens 2对比
  18. 自学单片机编程(四)流水灯代码优化
  19. 微小区V2 v2.3.4 小区 智能设备 智慧物业
  20. sega+model+3+android,新人求SEGA model3模拟器的键位设置的详细教程

热门文章

  1. 在mininet中测试TCP、UDP带宽并作图
  2. vue-router实现根据用户权限显示不同菜单-动态路由
  3. pythonyield详解_yield详解
  4. excel保存快捷键_这应该算是Windows电脑中最强的几组快捷键!
  5. python3.9性能_谁说Python性能差的
  6. 微博中微服务缓存_微服务实践分享(5)缓存中心
  7. jquery name选择器_jQuery学习(1)
  8. top res mysql_Java应用Top命令RES内存占用高分析
  9. android studio module build,踩坑将一个AndroidStudio项目变成一个module引入到自己的项目中...
  10. python面试专题--with 关键字与上下文管理