当前位置: 首页 > news >正文

linux内核中的 指针 和 unsigned long

文章目录

    • 1.指针的来源
    • 2.指针的定义:
    • 3.字长和数据类型
    • 4.Linux内核为什么常用unsigned long来替代指针?
    • 参考资料

1.指针的来源

方便引用一个内存地址。
给定一个内存地址,CPU就可以取出该地址的数据。
给定一个内存地址,CPU就可以写入该地址一个值。

2.指针的定义:

指针的本质其实也是一个数据类型,和char, short, int 等一样都属于c语言中的基本类型,所以大小也确定了(与它是什么类型无关),32位系统为4个字节,64为系统为8个字节。
无论指针什么类型(大小以确定),它存放的都是一个地址,只不过这个地址存放不同数据类型而已。
指针变量与其它变量(如int)相似,也有两个方面即:值 和 类型(所指向的数据类型)
值:表示某个对象的地址(位置)。
类型:表示那个地址(位置)上所存储对象的类型。

备注:指针的强制类型转换不会改变真实的指针,只是告诉编译器以新的数据类型来看待被指向的数据。

3.字长和数据类型

在支持Linux的体系结构中,能够由机器一次完成处理的数据称之为字,指明了指针数据的 nominal size。虚拟地址是以这样的一个字来编码,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。即:对于一个字长位n的机器,虚拟地址的范围位 0 ~ 2n-1 ,程序最多访问2n个字节。

处理器通用寄存器的大小和他的字长是相同的。long类型总是等于机器的字长,也等于指针的大小。
但是long和int 大小没办法保证一样。比如:
Linux支持的64位体系架构 long 8个字节,int 4个字节。
Linux支持的32位体系架构 long 4个字节,int 4个字节
因此不要假设 long 和 int 长度相等,也不要假设指针和int 长度相等。
备注:上面只是讨论支持Linux的体系架构

4.Linux内核为什么常用unsigned long来替代指针?

因为指针也是一种基本类型,所以大小是确定的,32位系统下为4个字节,由于地址的值不能为负,所以指针的值的范围为 0 - (2^32-1),与unsigned long大小,值的范围一样。
所以32位系统下指针的最大寻址范围为2^32-1,即4G(所以32位系统虚拟地址为0 - 4G)。
64位系统下大小为8个字节,与unsigned long大小,值的范围一样。
可见指针与unsigned long 大小,值的范围也一样。(但意义不一样,只是值一样)

小结:指针与unsigned long 大小一样,值的范围也一样。
(当linux内核只关心这个地址的值,用于去运算、查找、对比,而不是关心通过这个地址去访问内存,这个时候,内核经常用unsigned long来替代指针)。

参考资料

为什么Linux内核常常用unsigned long来代替指针
聊聊C语言和指针的本质

http://www.lryc.cn/news/117952.html

相关文章:

  • STM32--GPIO
  • 剑指 Offer ! 61. 扑克牌中的顺子
  • 《玩转Python数据分析专栏》大纲
  • Zabbix自动注册服务器及部署代理服务器
  • SpringBoot下使用自定义监听事件
  • 并发编程面试题1
  • 【对于一维信号的匹配】对一个一维(时间)信号y使用自定义基B执行匹配追踪(MP)研究(Matlab代码实现)
  • 【Oracle 数据库 SQL 语句 】积累1
  • Django中级指南:理解并实现Django的模型和数据库迁移
  • Chatgpt API调用报错:openai.error.RateLimitError
  • 一键获取数百张免费商用人脸!AI人脸生成器来袭
  • 跳跃游戏 II——力扣45
  • Stable Diffusion - 常用的负向提示 Embeddings 解析与 坐姿 (Sitting) 提示词
  • 工厂方法模式(一):C#实现指南
  • Spring接口InitializingBean的作用和使用介绍
  • Excel---成绩相同者,名次并列排列,三步搞定
  • Elasticsearch6.x和7.x的区别
  • 基于STM32设计的口罩识别和无线测温系统
  • 第五十天
  • vue-pc端elementui-统一修改问题-Dialog 对话框点击空白关闭问题-element-所有组件层级问题
  • VS code 用户设置
  • 【Spring security 解决跨域】
  • 【C语言】经典题目(四)
  • Prometheus-监控 Postgresql
  • Android java.lang.UnsatisfiedLinkError: No implementation found
  • Leecode力扣704数组二分查找
  • Linux 的基本使用
  • vue3实现自定义select下拉框内容之城市区域篇
  • 性能测评:腾讯云轻量应用服务器_CPU内存带宽流量
  • python中的迭代器和生成器