LINUX.ORG.RU

История изменений

Исправление shdown, (текущая версия) :

Впрочем, говорить тут что-то излишне, давайте покажу:

enum { BUF_SIZE = 1024 };
char buffer[BUF_SIZE];

volatile int buffer_ready = 0;

void buffer_init(void)
{
    for (int i = 0; i < BUF_SIZE; ++i) {
        buffer[i] = 0;
    }
    buffer_ready = 1;
}

Компилируем. gcc version 15.2.0 (Debian 15.2.0-4).

$ gcc -Wall -Wextra -O3 -c foo.c
$ objdump -S foo.o

foo.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <buffer_init>:
   0:	b9 80 00 00 00       	mov    $0x80,%ecx
   5:	31 c0                	xor    %eax,%eax
   7:	48 8d 3d 00 00 00 00 	lea    0x0(%rip),%rdi        # e <buffer_init+0xe>
   e:	c7 05 00 00 00 00 01 	movl   $0x1,0x0(%rip)        # 18 <buffer_init+0x18>
  15:	00 00 00 
  18:	f3 48 ab             	rep stos %rax,(%rdi)
  1b:	c3                   	ret

Компилятор поместил buffer_ready = 1 (movl $0x1,…) до цикла for (rep stos …).

(За идею спасибо этой статье: https://users.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf)

Исходная версия shdown, :

Впрочем, говорить тут что-то излишне, давайте покажу:

enum { BUF_SIZE = 1024 };
char buffer[BUF_SIZE];

volatile int buffer_ready = 0;

void buffer_init(void)
{
    for (int i = 0; i < BUF_SIZE; ++i) {
        buffer[i] = 0;
    }
    buffer_ready = 1;
}

Компилируем. gcc version 15.2.0 (Debian 15.2.0-4).

$ gcc -Wall -Wextra -O3 -c foo.c
$ objdump -S foo.o

foo.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <buffer_init>:
   0:	b9 80 00 00 00       	mov    $0x80,%ecx
   5:	31 c0                	xor    %eax,%eax
   7:	48 8d 3d 00 00 00 00 	lea    0x0(%rip),%rdi        # e <buffer_init+0xe>
   e:	c7 05 00 00 00 00 01 	movl   $0x1,0x0(%rip)        # 18 <buffer_init+0x18>
  15:	00 00 00 
  18:	f3 48 ab             	rep stos %rax,(%rdi)
  1b:	c3                   	ret

Компилятор поместил buffer_ready = 1 (movl $0x1,…) до цикла for (rep stos …).