Загрузчик на C / C ++

Опубликовано: 30 Декабря, 2021

Загрузчик - это программа операционной системы, которая загружает исполняемый файл с диска в основную память (ОЗУ) для выполнения . Он выделяет пространство памяти исполняемому модулю в основной памяти, а затем передает управление команде начала программы.

Пример:

akash @aix(/ u / akash) #cat./ ak1.cpp
#include<stdio.h>
int main()
{
printf ( "Testing of Loader !" );
return 0;
}

Компиляция компилятором xlC:

akash @aix(/ u / akash) #xlC – o ak1.out./ ak1.cpp akash @aix(/ u / akash) #ls – lrt ak1 * -rw – rw – r– 1 akash dev 74 Nov 12 06 : 10 ak1.cpp
– rwxrwxr – x 1 akash dev 8562 Nov 12 06 : 34 ak1.out akash @aix(/ u / akash) #

Что на самом деле происходит при запуске исполняемого файла: для этого также можно использовать команду strace.

akash@aix(/u/akash)# truss ./ak1.out
execve(“./ak1.out”, 0x2FF20A00, 0x200138A8) argc: 1
read_sysconfig(0xF06F8278, 0x00000010, 0xFFFFFFF9, 0x10000000, 0x200007BC, 0x000000C0, 0x06010000, 0xF076A0F0) = 0x00000000
sbrk(0x00000000) = 0x20000998
vmgetinfo(0x2FF20350, 7, 16) = 0
sbrk(0x00000000) = 0x20000998
sbrk(0x00000008) = 0x20000998
__libc_sbrk(0x00000000) = 0x200009A0
loadquery(2, 0x200009C8, 0x00001000) = 0
__loadx(0x0A040000, 0xF06F599C, 0x00000000, 0xF05BE208, 0x20001D20) = 0xF05BFD64
loadbind(0, 0xF0760BBC, 0xF06D0E54) = 0
kfcntl(0, F_GETFL, 0x00000000) = 67110914
kfcntl(1, F_GETFL, 0x00000000) = 67110914
kfcntl(2, F_GETFL, 0x00000000) = 67110914
kfcntl(2, F_GETFL, 0x00000000) = 67110914
kioctl(1, 22528, 0x00000000, 0x00000000) = 0
Testing of Loader !kwrite(1, ” T e s t i n g o f L”.., 19) = 19
kfcntl(1, F_GETFL, 0x00000070) = 67110914
kfcntl(2, F_GETFL, 0x2FF22FFC) = 67110914
_exit(0)

Первый отображаемый вызов - это execve () , который на самом деле является загрузчиком. Этот загрузчик создает процесс, который включает:

  • Чтение файла и создание адресного пространства для процесса.
  • Создаются записи в таблице страниц для инструкций, данных и стека программ, а набор регистров инициализируется.
  • Затем выполняет инструкцию перехода к первой инструкции программы, которая обычно вызывает сбой страницы, и первая страница ваших инструкций помещается в память.

Ниже два пункта не относятся к загрузчику и предназначены только для получения дополнительной информации:

  • Еще одна вещь, которую мы получили, - это вызов kwrite со значением аргумента, который передается функции printf в нашей программе. kwrite - это системный вызов, который фактически вызывается из функции printf с переданным ей значением, и эта функция отвечает за отображение значения на консоли с переданным ей значением.
  • Мы также получили вызов _exit (0) в последней инструкции, который является системным вызовом _exit со статусом аргумента 0, что означает возврат в операционную систему с успешным сигналом. Этот _exit был вызван из оператора return (0).
Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++ C