linux纯内核直接用吗,Linux:为啥内核有的变量没有初始化就敢直接使用?

一、问题

为啥内核有的变量没有初始化就敢直接使用?

fc6934b71d7eadeac4bd32c8adde3af9.png

3def0e614c06f30014f09c1065117a10.png

二、分析

看上图,其中的5747行的变量nid的确没有定义,就直接使用了,这么做没有问题吗?

其实大家仔细看一下,5765行是一个宏,

到内核源码去找该宏的定义:linux-3.14includelinuxNodemask.h

#define for_each_online_node(node) for_each_node_state(node, N_ONLINE)

其中的for_each_node_state又是一个宏,继续跟踪该宏,有两处定义

408 #if MAX_NUMNODES > 1

……

429 #define for_each_node_state(__node, __state)

430  for_each_node_mask((__node), node_states[__state])

……

450 #else

……

470 #define for_each_node_state(node, __state)

471  for ( (node) = 0; (node) == 0; (node) = 1)

……

481 #endif

究竟是哪一个定义,由条件#if MAX_NUMNODES > 1 来决定,

#ifdef CONFIG_NODES_SHIFT

#define NODES_SHIFT     CONFIG_NODES_SHIFT

#else

#define NODES_SHIFT     0

#endif

#define MAX_NUMNODES    (1 << NODES_SHIFT)

因为CONFIG_NODES_SHIFT没有定义【可以检索一下内核,找不到该宏的定义】,所以NODES_SHIFT     为0

所以 MAX_NUMNODES   为1;

所以 for_each_node_state 定义如下:

470 #define for_each_node_state(node, __state)

471  for ( (node) = 0; (node) == 0; (node) = 1)

而此处的node      对应 粉丝截图的nid,__state  对应 N_ONLINE

所以5765行代码,可以展开为

for ( (nid) = 0; (nid) == 0; (nid) = 1)

可见,nid被定义了。

三、宏定义的注意点

宏定义是一个给定名称的代码片段,当我们使用这个名称的时候,预处理器会自动将其替换为宏定义的内容。宏定义有两种,一种是object-like宏定义,在使用的时候相当于一个数据对象;另一种是function-like,在使用的时候就像调用函数那样。

1. 只占用编译时间

宏展开会使源程序变长,但是宏展开发生在编译过程中,不占运行时间,只占编译时间。

宏展开因为在预处理阶段发生,不会分配内存。

2. 宏替换发生时机

编译c源程序的过程:

预处理编译汇编连接

宏替换发生在编译预处理阶段。

3. 预处理包括哪些工作

预处理产生编译器的输出,实现功能如下

1)文件包含

把#include中包含的内容拓展为文件的正文,即找到.h文件,同时展开到#include所在处

2)条件编译

根据#if和#ifdef等编译命令,将源程序文件中的部分包含进来,部分排除,排除在外的一般转换为空行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql主从复制实践之单数据库多实例

1.主从复制数据库实战环境准备MySQL主从复制实践对环境的要求比较简单,可以是单机单数据库多实例的环境,也可以是两台服务器之间,每台服务器都部署一个独立的数据库的环境。本文以单机数据库多实例的环境进行实践。2.主从复制服务器角色定义序…

sdr 软件_【火腿专题】购买软件定义无线电(SDR)还是传统无线电台?追求欲望无止境...

软件定义无线电与传统无线电选择作者:Onno VK6FLAB有一段时间,我一直在解释软件无线电(SDR)的一些内部工作方式是如何运作的,以便深入了解原因和方法的细节。这种探索是在一个新世界的背景下进行的,在这个世界里,有无数…

linux文本运行层次,Linux基础知识之---文件系统层级结构

#Linux基础知识之---文件系统层级结构(Linux系统)[基础知识,文件系统,层级结构,FHS]一切皆文件: 在Linux中,无论是目录、配置、cpu、内存、键盘、鼠标、或者运行中的系统及内核、甚至临时缓存也都有对应的文件。“一切…

python的format函数如何理解_python format函数的使用

转载自:http://www.cnblogs.com/kaituorensheng/p/5709970.htmlpython自2.6后,新增了一种格式化字符串函数str.format(),威力十足,可以替换掉原来的%注:以下操作版本是python2.7映射示例语法通过{} 和 : 替换 %通过位…

Linux查询root环境变量,linux环境变量和查看方法

linux环境变量和查看方法1. 显示环境变量HOME[rootlocalhost ~]# echo $HOME/root2. 设置一个新的环境变量hello[rootlocalhost ~]# export HELLO"hello world"[rootlocalhost ~]# echo $HELLOhello world附:修改已存在的环境变量[rootlocalhost ~]# HELL…

服务器搭建-Linux基础知识

服务器搭建还是需要一些Linux知识的,这节就聊点基础的。 文件权限操作 查看权限 Linux中每个文件对每个用户来说都有对应的权限,在任一路径中输入ll就可以查看这些信息: rootip-*** /usr/local # ll total 32K drwxr-xr-x 2 root root 4.0K J…

seo从入门到精通_从入门到精通,新人必看的3本书SEO书籍

SEO入门书本引荐:从入门到通晓,新人必看的3本书在这个网上学习泛滥的年代,很多人都习气在网络上找教程学习,无论上视频教程,学习论坛,或是网上课堂等等。但也有些人仍是更习气看书学习的,很多人…

linux firefox 脚本,linux下调整firefox的有用设置(高分辨率下需要)

注:自己一般比较喜欢opensuse,所以以下所说皆是在opensuse下的做法,在其他发行版下应该也差不多firefox69 默认禁用了userchrome.css,需要把about:config 中的选项toolkit.legacyUserProfileCustomizations.stylesheets设置为true界面字体大小…

读懂python代码_Python面试|一文让你读懂if __name__==’__main__’的含义

程序入口对于很多编程语言来说,程序都必须要有一个入口,比如 C,C,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C 都需要有一个 main …

C语言程序设计第三节课作业

1 指针是一个存储计算机内存地址的变量。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。根据出现的位置不同,操作符 * 既可以用来声明一个指针变…

linux netcat测试udp端口,使用nc(netcat)测试udp协议与端口连通性

[v1.10]connect to somewhere: netcat [-options] hostname port[s] [ports] …listen for inbound: netcat -l -p port [-options] [hostname] [port]options:-g gateway source-routing hop point[s], up to 8-G num source-routing pointer: 4, 8, 12, …-h this cruft-i se…

Hession矩阵与牛顿迭代法

1、求解方程。 并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。 原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) f(x0)(x-x0)f(x0) 求解方程f…

抽象工厂模式_设计模式——抽象工厂模式

阅读目录使用频率:★★★★★一、什么是抽象工厂模式二、补充说明三、角色四、例子使用频率:★★★★★一、什么是抽象工厂模式就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位);例如:生产一台PC机,使用工…

Linux启动和退出系统的方法,实验二 Linux的启动与关闭

实验二 Linux的启动与关闭一、实验目的(1)掌握linux操作系统正确的启动与关闭方法;(2)理解系统运行级的概念,掌握查看和设置的方法;(3)理解系统运行级服务的概念,掌握查看、开启和关闭的方法;(4)理解LILO和GRUB的原理&…

linux需要什么基础,学linux需要什么基础?

近几年来,随着计算机网络的发展,越来越多的人学习 linux。对于想要从事运维工作或者从事智能开发方面的同学来说,学习 linux 是必要的。linux 的学习并不简单,那么这篇文章 w3cschool 小编来告诉你,学 linux 需要什么基…

python arima模型_Python时间序列处理之ARIMA模型的使用讲解

ARIMA模型ARIMA模型的全称是自回归移动平均模型,是用来预测时间序列的一种常用的统计模型,一般记作ARIMA(p,d,q)。ARIMA的适应情况ARIMA模型相对来说比较简单易用。在应用ARIMA模型时,要保证以下几点:时间序列数据是相对稳定的&am…

windows(win7,win8,xp)hosts文件找不到原因分析及解决方法

2019独角兽企业重金招聘Python工程师标准>>> 一般情况hosts文件是保存在C:\windows\System32\Drivers\Etc 文件夹上,由于安装是win7系统,在这个路径上就能找到这个hosts文件。如果你在该路径下没有找到这个文件的话,一般是以下几种…

linux虚拟化cpu的绑定,为虚拟机vCPU绑定物理CPU

使用taskset命令将vCPU线程绑定到指定的物理CPU。例如,某虚拟机的qemu进程及两个vCPU线程如下: ​[rootkelvin ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep -v greproot 4706 3629 4706 1 qemu-system-x86_64 -m 2G -smp 2 /var/lib/li…

sql 显示百分比_轻松搞定数据分析之SQL——简单查询

每天早起或者睡前听一首温柔而美好的音乐,是一件很幸福的事情,无论你是否懂音乐,它都能带你发现生活中的隐藏的那些美好,今天我们先来一起欣赏Mindy Gledhill的单曲《California》California (网易云音乐),每次我听到这首歌&#…

SpringMVC 中设置日期字符串转换格式

2019独角兽企业重金招聘Python工程师标准>>> 在使用SpringMVC的项目中经常遇到 controller 参数中接收Date类型的数据,但是页面传过来的参数又是日期字符串,会出现转换异常。 由于项目需要支持两种日期格式所以从写了一个日期转换器。网友可以…