摘要:
#g++ -Wall -march=pentium4 -mmmx ft.cpp -o ft -lpthread在64位机上编译出现错误:error: CPU you selected does not support x86-64 instruction set意思是:您选择的 CPU 不支持 x86-64 指令集,解决方法,修给march的值march=x86-64 ,不同的系统可能不太一样。#g++ -Wall -march=x86-64 -mmmx ft.cpp -o ft -lpthread 阅读全文
摘要:
GCC 提供的原子操作gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。其声明如下:type__sync_fetch_and_add(type*ptr,typevalue,...)type__sync_fetch_and_sub(type*ptr,typevalue,...)type__sync_fetch_and_or(type*ptr,typevalue,...)type__sync_fetch_and_and(type*ptr,typevalue,...)type__sync_fetch_and_xor(type*ptr,typeval 阅读全文
摘要:
内存屏障(memory barrier) (2008-08-01 11:43) 分类: linux内核 首先看看__set_current_state()和set_current_state()函数的区别#define __set_current_state(state_value) \do { current->state = (state_value); } while (0)#define set_current_state(state_value) \set_mb(current->state, (state_value))#define set_mb(var, value 阅读全文
摘要:
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.htmlNext: Object Size Checking, Previous: Offsetof, Up: C Extensions 5.44 Built-in functions for atomic memory accessThe following builtins are intended to be compatible with those described in theIntel Itanium Processor-specific Applicatio 阅读全文
摘要:
这个问题困扰了我很久,一直都想不明白。今天好像有点通了,立即记录下来。仅是个人理解。在学习BOOST多线程库的原码时这样一个头文件引起了我的注意:interlocked_read.hpp[cpp:showcolumns] view plaincopyprint?·········10········20········30··& 阅读全文
摘要:
Acquire and Release Semantics1(共 3)对本文的评价是有帮助评价此主题An operation has acquire semantics if other processors will always see its effect before any subsequent operation's effect. An operation hasrelease semantics if other processors will see every preceding operation's effect before the effect of 阅读全文
摘要:
arm下的gcc内联汇编 __asm__ __volatile__内嵌汇编用法简述 在阅读C/C++原码时经常会遇到内联汇编的情况,下面简要介绍下__asm__ __volatile__内嵌汇编用法。带有C/C++表达式的内联汇编格式为: __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);其中每项的概念及功能用法描述如下: 1、 __asm__ __asm__是GCC 关键字asm 的宏定义: #define __asm__ asm __asm__或asm 用来声明一个内联汇 阅读全文
摘要:
一、简介作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生 阅读全文
摘要:
AT&T汇编指令GAS中每个操作都是有一个字符的后缀,表明操作数的大小。C声明GAS后缀大小(字节)charb1shortw2(unsigned) int / long / char*l4floats4doublel8long doublet10/12注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数,这不会产生歧义因为浮点数使用的是完全不同的指令和寄存器。操作数格式:格式操作数值名称样例(GAS = C语言)$ImmImm立即数寻址$1 = 1EaR[Ea]寄存器寻址%eax = eaxImmM[Imm]绝对寻址0x104 = *0x104(Ea)M[R[Ea]]间接寻 阅读全文
摘要:
如果您是 Linux 内核的开发人员,您会发现自己经常要对与体系结构高度相关的功能进行编码或优化代码路径。您很可能是通过将汇编语言指令插入到 C 语句的中间(又称为内联汇编的一种方法)来执行这些任务的。让我们看一下 Linux 中内联汇编的特定用法。(我们将讨论限制在 IA32 汇编。)GNU 汇编程序简述让我们首先看一下 Linux 中使用的基本汇编程序语法。GCC(用于 Linux 的 GNU C 编译器)使用 AT&T 汇编语法。下面列出了这种语法的一些基本规则。(该列表肯定不完整;只包括了与内联汇编相关的那些规则。)寄存器命名 寄存器名称有 % 前缀。即,如果必须使用 eax, 阅读全文