CPU底层那些事(CPU如何读写变量)

本文探讨了如何通过compiler explorer查看汇编指令,揭示了CPU如何通过寄存器间接访问内存中的变量。详细分析了变量在内存中的布局,指出每个变量对应唯一的内存空间,并根据变量a、b、c的地址推断出int、short、char的字节大小。同时,总结了全局变量和局部变量的内存分配特点,强调了它们在内存中占用的空间由其类型决定,且局部变量的生命周期和地址会受线程和调用轨迹影响。

1.打开compiler explorer,查看汇编指令。
在这里插入图片描述
2.由于CPU不能直接访问内存地址,需要通过寄存器,配合方括号,间接访问内存。根据指令集,rip寄存器存放着CPU的下一条指令的地址。变量a的地址就是0x401114 + 0x2f18 = 0x40402c
在这里插入图片描述
总结:变量不过是内存地址的别名
在这里插入图片描述
3.底层查看类型的字节大小。a的地址:40402c;b的地址:404030;c的地址:404034。可以看出int在底层占用四个字节的内存空间。short两个字节。char一个字节。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.局部变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:
1.每一个变量,都对应一个内存空间。
2.变量的内省,决定了它占用内存空间的长度。
3.全局变量,静态变量占用的内存地址是全局唯一的,不会随程序的运行而变化。
4.临时变量是栈变量,变量的值,有有效期的限制,变量的地址,会因为不同线程调用而不同,在同一个线程,也会因为调用轨迹不同而不同。

在Linux内核中,`errno` 是用于表示系统调用或库函数执行失败时的错误代码。虽然 `errno` 本身是一个全局变量,但在多处理器(SMP)系统中,为了提高性能和减少锁竞争,某些与 CPU 相关的状态信息会被存储为 **每CPU变量**(per-CPU variables)。然而,`errno` 并不是一个 per-CPU 变量。 Linux 内核通过 `<asm/errno.h>` 和 `<linux/err.h>` 等头文件定义了标准的错误码,并确保它们可以在不同架构下统一使用。每个错误码都有一个宏定义,例如: - `EAGAIN` (Resource temporarily unavailable) - `ENOMEM` (Cannot allocate memory) - `EFAULT` (Bad address) - `EINVAL` (Invalid argument) 这些错误码是全局共享的整数值,并不绑定到特定的 CPU 上[^1]。因此,在 Linux 内核中并不存在所谓的 "per-cpu errno definitions" 的概念。 尽管如此,Linux 内核确实存在一些 per-CPU 变量用于调度、中断处理等底层机制,比如 `this_rq()` 获取当前 CPU 的运行队列,或者 `nr_running` 和 `nr_uninterruptible` 被用于计算系统负载(load average)中的活跃进程数[^1]。但这些与 `errno` 没有直接关系。 ### 错误码的获取与设置 在用户空间程序中,`errno` 是线程局部变量(Thread-local storage),这意味着每个线程拥有自己的 `errno` 值。而在内核空间中,错误码通常通过函数返回值传递给用户空间,例如系统调用返回 `-EFAULT` 来表示地址无效错误。 例如,在内核模块中,可以通过如下方式返回错误码: ```c #include <linux/errno.h> static ssize_t my_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { if (!buf || !count) return -EFAULT; // 返回错误码 ... } ``` 上述方式将错误码以负值形式返回,用户空间可通过 `strerror(errno)` 或 `perror()` 函数将其转换为可读字符串。 ### 小结 Linux 内核中并没有专门针对每个 CPU 定义不同的 `errno` 值。所有错误码都是全局定义的标准常量,用于描述系统调用或内核操作的失败原因。虽然内核广泛使用 per-CPU 变量来优化性能,如 `nr_running` 和 `nr_uninterruptible` 用于系统负载计算,但这与 `errno` 的定义和使用机制无关。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值