Solaris(64 位)开发者指南

libkvm/dev/ksyms

64 位版本的 Solaris 系统是使用 64 位内核实现的。直接检查或修改内核中内容的应用程序必须转换为 64 位应用程序,并且必须与 64 位版本的库链接。

执行此转换和清理工作之前,应当考虑为什么应用程序需要首先直接查看内核数据结构。可能是由于在此过程中首先会导入或创建程序,因此 Solaris 平台上将启用用来提取系统调用所需数据的其他接口。请参见 sysinfo(2)kstat(3KSTAT)sysconf(3C)proc(4),这些接口是最常见的替换 API。如果可以使用这些接口来替代 kvm_open(3KVM),请使用它们并使应用程序保持 32 位以实现最大可移植性。另一个益处是其中的大多数 API 可能更快,并且可能不要求访问内核内存所需的相同安全权限。

如果尝试针对 64 位内核或崩溃转储使用 kvm_open(3KVM),则 32 位版本的 libkvm 会返回失败信息。同样,如果尝试针对 32 位内核崩溃转储使用 kvm_open(3KVM),则 64 位版本的 libkvm 也会返回失败信息。

因为内核是一个 64 位程序,所以用来打开 /dev/ksyms 以直接检查内核符号表的应用程序需要进行增强,以便可以识别 ELF64 格式。

无法明确判断 kvm_read()kvm_write() 的地址参数应该是内核地址还是用户地址这一问题对于 64 位应用程序和内核更加严重。所有使用 libkvm 并且还使用 kvm_read()kvm_write() 的应用程序应当转换为使用相应的 kvm_read()kvm_write()kvm_uread()kvm_uwrite() 例程。(这些例程最初是在 Solaris 2.5 中提供的。)

尽管直接读取 /dev/kmem/dev/mem 的应用程序尝试解释从这些设备中读取的数据可能会出错,但这些应用程序仍可以运行;32 位和 64 位内核之间的数据结构偏移量和长度几乎肯定是不相同的。