/proc/cpuinfo on various architectures
The /proc/cpuinfo
file contains runtime information about the processors on your Linux computer (including your Android phone). For example, here is what it looks like on my phone:
u0_a123@android:/ $ cat /proc/cpuinfo Processor : ARMv7 Processor rev 1 (v7l) processor : 0 BogoMIPS : 1592.52 processor : 1 BogoMIPS : 2388.78 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 1 Hardware : SMDK4210 Revision : 000e Serial : 304d19f36a02309e
Depending on what you are looking for, these are all useful information. Being plain text files, you can write shell scripts or some other programming language (see my earlier article using CPython on this topic) to parse this information and mine the data you are looking for. These are useful information and for projects such as lshw and Beaker, quite vital too. However, one problem with dealing with this file is that depending on the hardware architecture, the information varies – both in their presentation format and the information available. If you compare the contents of your Intel/AMD desktop or laptop with the above, you will know what I am talking about. Hence, it is necessary that whatever tool/script one writes to read and use the data from this file and hopes it to work across architectures should consider these differences.
I won’t attempt to make any guesses to why they are different. However, I will share with you how to find out the information you may find in this file on different architectures. The post is admittedly half baked and may not satisfy all your queries, but I think I am on the right track.
Get the Kernel sources
Download the Linux kernel sources (tarball from http://kernel.org or clone it from https://github.com/torvalds/linux/). The arch/
sub directory has architecture specific code and in all you will see 31 subdirectories in this sub directory: alpha, arc, arm, arm64, and others. The links in the rest of this post are cross referenced links, so you may not need to download the sources.
Definition of cpuinfo_op
One file for each of the above architectures defines a cpuinfo_op
variable of type seq_operations
. For example, for the arm64 architecture, this variable is defined in arm64/kernel/setup.c
and this is what it looks like:
956 const struct seq_operations cpuinfo_op = { 957 .start = c_start, 958 .next = c_next, 959 .stop = c_stop, 960 .show = c_show 961 };
The key member assignment for our purpose here is the .show
attribute which is a function pointer pointing to the c_show()
function. This is the function where you can see the information that you will see when you see the contents of /proc/cpuinfo
. So for example, the c_show()
function for arm64 is here and you can see the fields earlier shown in the blog post. (I can’t see “Serial” there, which I am not sure why yet, I am still to figure out if it’s the right architecture at all, but you get the idea, I hope).
You can search for cpuinfo_op
and see the files for each arch where they are defined in. The function which the .show
member points has the information that will be show in /proc/cpuinfo
. Note that, the function name can be different. For example it is show_cpuinfo()
for s390x.
Examples
For an example of how the different architecture specific information can be dealt with in C/C++ program/tool using architecture specific macros, see lshw’s cpuinfo.cc file. For shell scripts or a Python program, using uname
(via os.uname()
in CPython) may be a possible approach.