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

linux中INIT_MM_CONTEXT宏对pgd的重复赋值

在GNU C中,支持通过标号元素对指定结构体成员名进行初始化,这允许初始化值以任意顺序出现。

在linux内核中对init_mm初始化时有如下代码。

#define INIT_MM_CONTEXT(name)	\.pgd = init_pg_dir,struct mm_struct init_mm = {.mm_rb		= RB_ROOT,.pgd		= swapper_pg_dir,.mm_users	= ATOMIC_INIT(2),.mm_count	= ATOMIC_INIT(1),.write_protect_seq = SEQCNT_ZERO(init_mm.write_protect_seq),MMAP_LOCK_INITIALIZER(init_mm).page_table_lock =  __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),.arg_lock	=  __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),.mmlist		= LIST_HEAD_INIT(init_mm.mmlist),.user_ns	= &init_user_ns,.cpu_bitmap	= CPU_BITS_NONE,INIT_MM_CONTEXT(init_mm)
};

其中对.pgd进行了两次赋值,第一次是.pgd = swapper_pg_dir, 而最后,又使用INIT_MM_CONTEXT宏对其进行了赋值,那结果如何呢?

请看如下测试代码:

#include <stdio.h>#define __pr(x)     printf("%-40s: %d\n", #x, x)struct test {int a;int b;int c;
};int main(void)
{struct test val = {.a = 1,.c = 2,.a = 3, // final val};__pr(val.a);__pr(val.b);__pr(val.c);return 0;
}

测试结果:

val.a                                   : 3
val.b                                   : 0
val.c                                   : 2

从测试结果来看,最终结果以最后一次赋值为准。

除了结构体可以覆盖之前的值外,数组的赋值也有类似特性,如kernel/time/hrtimer.c中

static const int hrtimer_clock_to_base_table[MAX_CLOCKS] = {/* Make sure we catch unsupported clockids */[0 ... MAX_CLOCKS - 1]  = HRTIMER_MAX_CLOCK_BASES,[CLOCK_REALTIME]        = HRTIMER_BASE_REALTIME,[CLOCK_MONOTONIC]       = HRTIMER_BASE_MONOTONIC,[CLOCK_BOOTTIME]        = HRTIMER_BASE_BOOTTIME,[CLOCK_TAI]             = HRTIMER_BASE_TAI,
};

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

相关文章:

  • Windows 10 2021 LTSC【版本号:19044.6036】
  • 设计模式笔记_结构型_代理模式
  • 小白学Python,标准库篇——随机库、正则表达式库
  • 【跟着PMP学习项目管理】每日一练 - 5
  • C++,从汇编角度看《虚拟继承的邪恶》
  • 【Linux】GDB/CGDB 调试器学习笔记
  • 【经典面经】C++新特性 TCP完整收发数据 TLS1.2 TLS1.3
  • AWS控制台升级EKS版本
  • AI进化论07:第二次AI寒冬——AI“改头换面”,从“AI”变成“机器学习”
  • 学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
  • 基于vscode开发工具显示git提交信息的插件
  • Web3.0 支付网络对企业的优势
  • Linux磁盘限速(Ubuntu24实测)
  • spark3 streaming 读kafka写es
  • 可以悬浮在Windows电脑桌面的好用便签软件评测
  • 前端开发—全栈开发
  • php use 命名空间与 spl_autoload_register的关系
  • DVWA靶场通关笔记-反射型XSS(Reflected Low级别)
  • uni-app获取手机当前连接的WIFI名称
  • 小皮面板搭建pikachu
  • 如何将文件从OPPO手机传输到电脑
  • GNhao,获取跨境手机SIM卡跨境通信新选择!
  • 手机恢复出厂设置怎么找回数据?Aiseesoft FoneLab for Android数据恢复工具分享
  • 【Python3教程】Python3高级篇之CGI编程
  • linux系统-----Redis主从复制
  • Hadoop 用户入门指南:驾驭大数据的力量
  • 传输层协议UDP原理
  • 【数据库基础 1】MySQL环境部署及基本操作
  • 工作间期休息一下
  • 重振索尼复古微型电脑——计划以OrangePi CM5 作为主板升级