int 0x80
предполагает i386; другие архитектуры могут использовать другие вещи , например. syscall
на amd64 . Если переключение контекста происходит каждый раз, когда выполняется системный вызов, это должно быть легко заметно, если мы запустим программу, которая генерирует невероятно большое количество системных вызовов. К счастью, у меня есть именно такая программа.
bits 64
section.text
global _start
_start: mov r9,9551615
mov rax,1 ; sys_write
mov rdi,1 ; stdout
mov rsi,letter
mov rdx,1 ; length
_again: syscall
dec r9
jnz _again
mov rax,60 ; sys_exit
mov rdi,0 ; exit code
syscall
section.data
letter: db "a"
Когда мы скомпилируем это на 64-битной -системе Linux и запустим под perf
, мы увидим
$ nasm -f elf64 -g -F dwarf -o max.o max.asm
$ ld -o max max.o
$ sudo perf stat./max > /dev/null 2> perf.log
$ grep context perf.log
88 context-switches # 0.051 K/sec
$
всего 88 переключений контекста для этого процесса; если бы происходило переключение контекста каждый раз, когда ядро находится в контексте процесса, мы должны были бы увидеть где-то ближе к 9551615 переключениям контекста.
Сейчас! Если вы хотите, чтобы система работала с переключениями контекста, запустите вышеописанное подstrace
$ strace -c./max
...
А в другом окне уже запущен vmstat 1
...
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 896 333928 2132 3124628 0 0 0 0 74 98 0 0 100 0 0
0 0 896 333896 2132 3124628 0 0 0 0 89 103 0 0 100 0 0
0 0 896 333896 2132 3124628 0 0 0 0 65 85 0 0 100 0 0
0 0 896 333896 2132 3124628 0 0 0 0 67 83 0 0 100 0 0
2 0 896 333756 2132 3124628 0 0 0 0 21460 529902 10 29 61 0 0
3 0 896 333832 2132 3124628 0 0 0 0 23690 652506 13 32 55 0 0
1 0 896 333832 2132 3124628 0 0 0 0 27574 673152 11 33 55 0 0
0 0 896 333768 2132 3124628 0 0 0 0 24351 650723 11 30 59 0 0
Кажется довольно очевидным, когда strace
иmax
(и другое программное обеспечение, если вы забыли /dev/null
, вывод )начал дико переключаться между ними.
«Физический уровень», используемый для WLAN, сложнее, чем вы думаете, на самом деле это несколько уровней.
Из коробки, без взлома и модификации прошивки конкретной карты, самое низкое, что можно получить, это захват пакетов с заголовками 802.11,включив «режим монитора» в этом драйвере (, который обычно дает вам второй интерфейс WLAN ).
Wireshark может захватывать и отображать эти заголовки. См., например. здесь для получения подробной информации см. man iw
, как включить режим монитора, используйте iw phy
, чтобы узнать, поддерживает ли ваше оборудование режим монитора.
См. aircrack-ng
для других инструментов, которые вы можете использовать для захвата и внедрения пакетов на этом уровне.