内核c语法

1、asmlinkage与FASTCALL
asmlinkage告诉编译器将参数存入局部栈
FASTCALL通知(与体系结构相关的)编译器将参数传给通用寄存器
include/asm/linkage.h
#define asmlinkage CPP_ASMLINKAGE __attribute__ ((regparm(0)))
#define FASTCALL(x) x __attribute__ ((regparm(3)))
#define fastcall __attribute__ ((regparm(3)))
2、UL
表明无符号长整型,保证特定体系结构内的数据不会溢出其数据所规定的范围,涉及很大的数时,有助于编写出与结构体无关的代码
include/linux/kernel.h
#define ULONG_MAX (~0UL)
3、const和volatile
const int *x 表示一个指向const整数的指针,可以修改指针,但不能通过该指针修改整数的值
int const *x 表示一个指向整数的const指针,因而这个整数可以改变,但指针x不可以改变
volatile表明变量无需警告就可以被修改,它通知编译器每次使用这个标记的变量时都要重新加载其值,而不是存储或访问一个副本
volatile unsigned int lock;
4、__init
编译器将标有__init的所有代码存到特殊的内存段中,初始化后释放这段代码。
__initdata、__init
__exitdata、__exit
5、likely()和unlikely()
现代众多CPU具有众多的启发式分支预测法,它尝试预测即将到来的命令,以便达到最快的速度。宏likely()和unlikely()允许开发者通过编译器告诉CPU,某一段代码很可能执行,因而应该被预测到,某一段代码很可能不被执行,不必预测
6、IS_ERR和PTR_ERR
宏IS_ERR将负的错误号编码成指针,而宏PTR_ERR则将该指针恢复成错误号
7、current
尼玛current是个宏,老子还以为全局变量呢
static inline struct task_struct * get_current(void)
{
struct task_struct *current;
__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));
return current;
}
 
实际上,这段代码相当于如下一组汇编指令(设p是指向当前进程task_struc结构的指针):
   
movl $0xffffe000, %ecx
andl %esp, %ecx
movl %ecx, p

换句话说,仅仅只需检查栈指针的值,而根本无需存取内存,内核就可以导出task_struct结构的地址。
8、prefetch
prefetch的含义是告诉CPU那些元素有可能马上用到,预取一下,可以提高效率

时间: 2024-08-11 03:30:33

内核c语法的相关文章

内核kconfig语法及原理

语法 http://www.cnblogs.com/AP0904225/p/5967979.html 目前自己用过 一.菜单 menu "desc" endmenu 二.可配菜单 menuconfig CONFIG_STR bool "desc" depends on CONFIG_OTHER default  y help if  CONFIG_STR ~~do sth endif 三.单选菜单 choice prompt "desc" def

Linux系统的快速启动机制(内核切换) 【转】

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4187846 原文地址:Linux系统的快速启动机制(内核切换) 作者:Renwen0524 快速启动机制:允许通过已经运行的Linux内核的上下文启动另一个Linux内核,不需要经过BIOS.BIOS可能会消耗很多时间,特别是带有众多数量的外设的大型服务器.这种办法可以为经常启动机器的开发者节省很多时间. 1.使用该机制要满足两个基本条件1)内核

各大浏览器内核介绍(Rendering Engine)

在介绍各大浏览器的内核之前,我们先来了解一下什么是浏览器内核. 所谓浏览器内核就是指浏览器最重要或者说核心的部分"Rendering Engine",译为"渲染引擎".负责对网页语法的解析,比如HTML.JavaScript,并渲染到网页上.所以浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定这浏览器如何显示页面的内容和页面的格式信息.不同的浏览器内核对语法的解释也不相同,因此同一的网页在不同内核的浏览器显示的效果也会有差异.这也就是网页编写者在不同内核的浏览器

windbg命令详解

DLL 该扩展仅在内核模式下使用,即使它是在Ext.dll中的. Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll 注释 如果不提供参数,调试器会列出所有进程,以及时间和优先级统计.这和使用!process @#Process 0 作为CommandString值一样. To terminate execution at any point, press CTRL+BREAK (in WinDbg) or CTRL

sysctl 中文手册

SYSCTL(8) System Administration SYSCTL(8) 名字 sysctl - 在运行时配置内核参数 语法 sysctl [options] [variable[=value]] [...] sysctl -p [file or regexp] [...] 描述 sysctl 可以在运行时配置内核参数.所有可用参数都位于 /proc/sys/ 目录下. 参数与选项 variable 要读取其值的变量,比如"kernel.ostype".[提示]".

Linux常用命令速查

索引表格 命令 功能简述 目录与文件基本操作 pwd 显示当前目录 ls 列出目录和文件名称 cp 复制文件或目录 mv 移动或更名现有的文件或目录 rm 删除文件或目录 mkdir 新建目录 rmdir 删除空目录 file 显示文件类型 stat 显示文件或文件系统的详细信息 du 显示文件或目录大小 touch 更改文件或目录的时间标记 ln 建立链接文件 查找文件或目录 which 在$PATH设定的目录范围查找指定文件 whereis 查找文件(只用于查找:二进制文件.源代码文件.ma

内核调试神器SystemTap — 探测点与语法(二)

a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探测点 SystemTap脚本主要是由探测点和探测点处理函数组成的,来看下都有哪些探测点可用. The essential idea behind a systemtap script is to name events, and to give them handlers. Systemtap works by translating the script to C,

[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285人阅读 评论(1) 收藏 举报  分类: Webkit(34)  JavascriptCore/JIT(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 看到HorkeyChen写的文章<[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现>

第01节:Linux 内核中的 C 语言语法扩展

1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来"怪怪的".说它是C语言吧,貌似又跟教材中的写法不太一样:说它不是 C 语言呢,但是这些程序确确实实是在一个 C 文件中.此时,你肯定怀疑你看到的是一个"假的 C 语言"! 比如,下面的宏定义: #define mult_frac(x, numer, denom)( { typeof(x) quo