ACPI这个单词,用电脑用多了的同学应该或多或少能在系统的报错信息等地方见过它。它表示表示高级配置和电源管理接口(Advanced Configuration and Power Management Interface)。通过ACPI规范,就能查询计算机硬件的一些信息。

在这里给大家推荐一下我的操作系统项目,希望大家能在GitHub上面给我点个小星星哦~GitHub - fslongjin/DragonOS: 一个64位的操作系统。A x86_64 operating system.

事情的起因是这样的,我在写DragonOS的时候,需要初始化I/O APIC控制器,因此我需要知道I/O APIC控制器的控制寄存器的地址,书上说的方法是查主板芯片手册。但是我在想,难不成我还要把那么多的主板芯片组的手册都查一遍?于是我就找到了ACPI规范,能够通过它来获取电脑的状态信息。这些信息里面就包括了I/O APIC控制寄存器的基地址。

大概的流程是这样的:

首先,根据MultiBoot2协议,我们能从BootLoader那里获取到一份RSDP的拷贝。接着,就可以去解析这个RSDP,RSDP内包含了RSDT的物理地址。于是,我们将RSDT的物理地址填写进页表之中,接着去访问RSDT。

看到这里,读者可能会疑惑了,在内存管理结构中不是已经映射了虚拟内存页面吗?怎么现在又多了这个物理地址需要映射?

原因是,内存管理结构中,我们并没有将所有的物理地址都映射了。还有一部分是系统保留的内存地址以及设备的寄存器物理地址。这里的就属于由BootLoader保留的物理地址,因此,在内存管理单元中并没有映射它们。

根据ACPI规范,RSDT的结构是这样的:

然后,我们就可以根据Entry数组中的物理地址,一个个的查找我们需要的数据结构。这时,我们仍然需要在页表中映射这些地址。经过我的观察,这些物理地址是连续的,且包含在同一个2MB物理页中,因此只需要映射一个物理页即可。

然后,根据ACPI规范,我们可以看到,这个Entry指向了多种数据结构,如APIC、HPET等。它们这些数据结构的共同特点就是,开头部分都是Signature+length的结构,我们可以根据signature来识别每个Entry项对应的数据结构,然后再用合适的结构体来解析它们。

Entry中可能包含的部分数据结构(因物理平台而异)

关于我们目标的APIC的信息,就位于表格中的Signature为APIC的数据结构中。这个数据结构叫做MADT(Multiple APIC Description Table),进一步查阅ACPI文档,看到了MADT的结构,如下所示:

这里面就包含了本地中断控制器的地址,但是这并不是I/O APIC的控制寄存器的地址。再继续查找文档,看到Interrupt Controller Structure的部分内容如下:

其中,I/O APIC的数据结构中,就有我们需要的I/O APIC控制寄存器的物理地址。

这里面还包含了Globan System Intrrupt Base,这对于我们的操作系统编程也是一个有用的信息。

到这里,我们的最开始的目标就达成了!成功查询到了I/O APIC控制寄存器的物理地址。

转载请注明来源:如何根据ACPI规范来获取I/O APIC控制寄存器的地址 | | 龙进的博客

如何根据ACPI规范来获取I/O APIC控制寄存器的地址相关推荐

  1. 7.嵌入式控制器EC实战 ACPI规范中的电源管理通道PMC(Power Management Channel)

    文章目录 前言 一.电源管理通道PMC概述 二.通过电源管理通道PMC完成EC和BIOS或操作系统通信 操作系统或BIOS通过PMC通道与EC通信 如果PMSTS的BIT2为1时,代表发送过来的信息是 ...

  2. python获取mac、计算机id_python 获取本机IP、mac地址、计算机名的简单示例

    这篇文章主要为大家详细介绍了python 获取本机IP.mac地址.计算机名的简单示例,具有一定的参考价值,可以用来参考一下. 对python获取本机IP.mac地址.计算机名感兴趣的小伙伴,下面一起 ...

  3. csdn获取自己所有博客的地址,包含分页

    获取自己的所有博客地址 一.步骤 1. 先获取首页看到的部分 2. 正则截取每月发表的博客数,总和即是所有的博客数. 3. 分页请求获取每一页的博客 4. 正则截取获得每篇博客的地址 二.代码 imp ...

  4. 获取用户电脑的上网IP地址

    在项目中经常要获取用户的上网的IP地址,如何获取用户的IP地址,方法很多,现在介绍以下2种. /// <summary>         /// 获取本机在局域网的IP地址         ...

  5. 【备忘】Android获取正在使用网络的IP4地址

    [备忘]Android获取正在使用网络的IP4地址 public String getLocalIpAddress() { String ipaddress="";try { fo ...

  6. Swift3.0语言教程获取字符串编码与哈希地址

    Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...

  7. netstat获取本机监听的地址列表 —— *awk与splite命令实现*(sudo netstat -nl | grep tcp……)

    问题描述: 校验某个端口是否被使用(80端口是否被使用): 1.获取本机监听的地址列表中,协议类型为tcp与tcp6的端口: (sudo netstat -nl | grep tcp  | awk ' ...

  8. netstat获取本机监听的地址列表 —— *链表实现*(sudo netstat -nl | grep -w tcp | awk '{print $4}')

    问题描述: 获取本机监听的地址列表中,协议类型为tcp的端口.(sudo netstat -nl | grep -w tcp) 知识填充: 在linux一般使用netstat 来查看系统端口使用情况步 ...

  9. oracle+查询主机地址,oracle函数:获取Internet主机名和ip地址

    您可能感兴趣的话题: Oracle 核心提示:oracle函数获取Internet主机名和ip地址 Oracle包utl_inaddr 作用:用于取得局域网或Internet环境中的主机名和IP地址. ...

最新文章

  1. C#程序设计笔记(第九章)
  2. 摩托罗拉指控苹果iPhone 4S和iCloud侵犯6项专利
  3. log4日志内容换行_Linux 下 4 种实时监控日志文件的方法,总有一种适合你
  4. dede mysql语句_让dede运行php代码和mysql语句
  5. 共用数据库和上传的文件的laravel-admin 和 laravel 项目中文件保存路径的配置
  6. 分析 linux /var/log/messages,2009-11-30 15:30 Linux系统日志/var/log/messages (转)
  7. python 如何调用linux系统中命令
  8. python编程100个小程序-【Python精华】100个Python练手小程序
  9. 如何对接泡椒云,给你的Auto.js脚本增加卡密验证功能?详细教程
  10. WindowsXP系统主题成Windows7风格windowsxp主题包
  11. NS3 之 入坑
  12. 安利4款良心的时间轴软件,建议收藏!
  13. 25个最佳SSH命令
  14. TCL通讯宣布于9月30日港股收盘后从港交所退市
  15. 数据的存储------计算机中常见数据类型的存储方式(C语言解析)
  16. 计算机社团收获作文,写智慧校园的优秀作文
  17. 故事分享|B站up主的感悟:粉丝从0到1.4万,我做对了什么?
  18. 计算机毕业设计Python+uniapp基于微信小程序某企业考勤系统(小程序+源码+LW)
  19. Java练习案例之输入一个字符串统计每个字母出现次数
  20. 文件夹加密超级大师 v13.10 是什么

热门文章

  1. JavaScript 内存详解 分析指南
  2. vivox6android版本5.1,vivo X6的手机系统是什么?vivo X6能升级安卓5.0吗?
  3. [渝粤教育] 天津科技大学 化工开发与创新实验 参考 资料
  4. java计算机毕业设计游泳馆信息管理系统源码+数据库+系统+部署+lw文档
  5. C++小白如何入门?
  6. python与tensorflow实现人脸表情识别(基于CNN)
  7. eclipse中包里建包
  8. 2022山东理工大学pta程序设计---实验五(一维数组)代码
  9. [DP]JZOJ 5804 简单的序列
  10. matlab 期权分析,matlab程序优化 (期权计算为例)