Как syscall на самом деле происходит на Linux?

Простым языком, git pull делает git fetch сопровождаемый git merge.

можно сделать git fetch в любое время для обновления удаленно отслеживающих ответвлений под refs/remotes//.

Эта операция никогда не изменяет ни одного из Ваших собственных локальных ответвлений под refs/heads и безопасна обойтись без изменения Вашей рабочей копии. Я даже услышал о людях, работающих git fetch периодически в задании крона в фоновом режиме (хотя я не рекомендовал бы делать это).

А git pull - то, что Вы сделали бы для обеспечения локального ответвления, актуального с его удаленной версией, также обновление другого удаленного отслеживания переходит.

документация Мерзавца †“ получение по запросу мерзавца :

В ее режиме по умолчанию, git pull стенография для git fetch сопровождаемый [1 110].

9
задан Community 23 May 2017 в 11:46
поделиться

4 ответа

Предполагая, что мы говорим о x86:

  1. ID системного вызова помещается в регистр EAX
  2. Любые аргументы, требуемые системным вызовом, являются размещены в местах , продиктованных системным вызовом . Например, некоторые системные вызовы ожидают, что их аргумент будет находиться в регистре EBX. Другие могут ожидать, что их аргумент находится наверху стека.
  3. Вызывается прерывание INT 0x80 .
  4. Ядро Linux обслуживает системный вызов, идентифицированный идентификатором в регистре EAX, размещение любых результатов в заранее определенных местах.
  5. Вызывающий код использует любые результаты.

Возможно, я немного устарел, прошло несколько лет ...

8
ответ дан 4 December 2019 в 09:37
поделиться

Приведенные ответы верны, но я хотел бы добавить, что существует больше механизмов для входа в режим ядра. Каждое последнее ядро ​​отображает страницу «vsyscall» в адресное пространство каждого процесса. Он содержит немного больше, чем самый эффективный метод перехвата системных вызовов.

Например, в обычной 32-битной системе он может содержать:

 
0xffffe000: int $0x80
0xffffe002: ret

Но в моей 64-битной системе у меня есть доступ к более эффективному методу с использованием syscall / sysenter Инструкции


0xffffe000: push   %ecx
0xffffe001: push   %edx
0xffffe002: push   %ebp
0xffffe003:     mov    %esp,%ebp
0xffffe005:     sysenter 
0xffffe007: nop    
0xffffe008: nop    
0xffffe009: nop    
0xffffe00a: nop    
0xffffe00b: nop    
0xffffe00c: nop    
0xffffe00d: nop    
0xffffe00e:     jmp    0xffffe003
0xffffe010: pop    %ebp
0xffffe011: pop    %edx
0xffffe012: pop    %ecx
0xffffe013: ret    

Эта страница vsyscall также отображает некоторые системные вызовы, которые могут выполняться без переключения контекста. Я знаю, что здесь отображаются определенные gettimeofday , time и getcpu , но я полагаю, что getpid также может там поместиться.

]
7
ответ дан 4 December 2019 в 09:37
поделиться

Ответ на этот вопрос уже есть на
Как реализован системный вызов в Linux?
Вероятно, не соответствовал этому вопросу из-за разного использования термина «syscall».

4
ответ дан 4 December 2019 в 09:37
поделиться

По сути, это очень просто: где-то в памяти лежит таблица, в которой хранится каждый номер системного вызова и адрес соответствующего обработчика ( см. http: //lxr.linux.no / linux + v2.6.30 / arch / x86 / kernel / syscall_table_32.S для версии x86)

Обработчик прерывания INT 0x80 затем просто берет аргументы из регистров, помещает их в (ядро) стек и вызывает соответствующий обработчик системных вызовов.

3
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: