Linux
Что такое userspace, kernelspace? Чем они отличаются?
Под пользовательским пространством понимается весь код операционной системы, который находится вне ядра.
Большинство Unix-подобных операционных систем (включая Linux) поставляются с разнообразными предустановленными утилитами, средствами разработки и графическими инструментами — это все приложения пространства пользователя.
Все пользовательские приложения (и контейнеризированные и нет) при работе используют различные данные, но где эти данные хранятся?
Какие-то данные поступают из регистров процессора и внешних устройств, но чаще они хранятся в памяти и на диске. Приложения получают доступ к данным, выполняя специальные запросы к ядру — системные вызовы. Например, такие как выделение памяти (для переменных) или открытие файла. В памяти и файлах часто хранится конфиденциальная информация, принадлежащая разным пользователям, поэтому доступ к ним должен запрашиваться у ядра с помощью системных вызовов.
Ядро обеспечивает абстракцию для безопасности, оборудования и внутренних структур данных. Например, системный вызов open() используется для получения дескриптора файла в Python, C, Ruby и других языках программирования. Вряд ли бы вы хотели, чтобы ваша программа работала с XFS на уровне битов, поэтому ядро предоставляет системные вызовы и работает с драйверами. Фактически этот системный вызов настолько распространен, что является частью библиотеки POSIX .
Краткое определние
Пользовательское пространство представляющее собой набор местоположений, в которых выполняются обычные пользовательские процессы (т. е. все, кроме ядра). Роль ядра состоит в том, чтобы управлять приложениями, работающими в этом пространстве, от взаимодействия друг с другом и с машиной. Пространство ядра , то есть место, где хранится и выполняется код ядра.
Пользовательское пространство имеет доступ к ограниченной памяти, ядро имеет всю память. И чтобы работать приложения взаимодествуют через интерфейс, которое называется системным вызовом.
Как работает sudo? Для чего она используется?
По умолчанию выполнение команды происходит от имени суперпользователя.
Например, вот эта команда
sudo whoami
И вот эта
sudo -u swfuse whoami
Будет отличаться результатом.
Можно просмотреть какие полномочия есть с помощью команды:
sudo -l
Что такое системные вызовы? Зачем они нужны и как они работают? Какие системные вызовы знаешь (5-10)
Системный вызов — это то, посредством чего код приложения, выполняющегося в пользовательском режиме, запрашивает службу, предоставляемую кодом, который выполняется в режиме ядра. read - чтение из файлового дескриптора. open - открывающий и по возможности создающий файл или устройство close - закрыть файловый дескриптор
access - проверка пользовательских привелегий для этого файла
mmap - служит для отображения предварительно открытого файла (например, с помощью системного вызоваа open()) в адресное пространство вычислительной системы
Команда для вывода всех системных вызовов во время исполнения программы:
strace -c ls
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 4 read
0.00 0.000000 0 5 write
0.00 0.000000 0 6 open
0.00 0.000000 0 9 close
0.00 0.000000 0 7 fstat
0.00 0.000000 0 18 mmap
0.00 0.000000 0 10 mprotect
0.00 0.000000 0 2 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 6 6 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 getdents
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 1 futex
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 openat
0.00 0.000000 0 1 set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 84 7 total
Где можно найти информацию о конкретном системном вызове?
man 2 <syscall>
Но нужно будет предварительно поставить пакет `man-pages
sudo apt install manpages-dev manpages-posix-dev
Что делает команда kill?
Назначение команды kill - отправить определенный сигнал процессу. По умолчанию используется сигнал SIGTERM.
А вот все сигналы можно глянуть через kill -l, они нужны для взаимодействия между процессами
root@swfuse:~# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
2) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
3) IGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
4) IGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
5) IGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
6) IGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
7) IGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
8) IGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
9) IGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
10) IGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
11) IGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
12) IGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
13) IGRTMAX-1 64) SIGRTMAX