우수한 CPU에서 하나의 프로세스만 쓰기엔 자원이 남는다.
그래서 멀티 프로세싱을 하기 위해서 시간을 분할해서 여러 프로세스를 빠른 속도로 나눠서 처리해줌.
스케쥴러(Scheduler)
한 순간에 오직 하나의 프로세스 만이 CPU를 점유 가능 -> 스케쥴러는 여러 프로세스가 CPU를 공유하여 사용 가능하도록 해준다.
선점형(preemptive)과 비선점형(nonpreemptive)
1. 비선점형 -> 프로세스가 자발 적으로 CPU 사용권 반납했을 때만 스케쥴링
2. 선점형(RTOS) -> 프로세스 별 사용 시간을 지켜보면서 정기적으로 스케쥴링
*문맥 교환(Context Switch)
CPU의 사용권을 다른 프로세스에게 양도 -> 현재의 Context 정보를 저장하고 새 프로세스의 Context 정보를 적재
Context 정보 -> 프로그램 카운트(PC), 스택 포인터(SP), 범용 레지스터, 프로세서의 상태 레지스터, 메모리 관리 정보 등
Linux는 운영체제 배포판이고 그 안에는 kernel도 포함되어 있는거임.
windows도 운영체제
그래서 운영체제의 구성을 한 번 살펴보면
리눅스는 fork라는 시스템 콜 함수를 통해서 application 프로그램을 실행시켜주게 되어 있음.
CPU, 주변장치, HW가 있고, 이걸 다 감싸고 있는게 운영체제
본연의 임무인 파일시스템 관리, 입출력관리, 메모리 관리, 프로세스 관리를 해줌.
HW를 제어하는 SW가 탑재되는데 이게 Device Driver가 되는거임.
운영체제가 탑재된 상태에서 HW를 제어하는 SW를 Device Driver라고 하고
운영체제가 미탑재된 상태에서 HW를 제어하는 SW를 FirmWare라고 하는거임.
BootLoader는 Kernel을 load & start 해주는 역할이고해주고 나서 쓸모가 없기 때문에
bootloader의 메모리 위에 kernel을 over write 해주면서 메모리에 load됨.
임베디드 리눅스는 특정한 목적의 응용 프로그램 탑재를 위해 운영체제를 올리기 때문에 아무래도 더 적은 메모리, 느린 속도 등 임베디드 특성에 맞게 올라간다고 생각하믄 된다.
최신 버전의 커널은 아래 링크에 올라옴. 하지만 최신꺼는 버그가 발견이 안되어 있을 가능성도 있으므로 주의가 필요하다.
괜히 검증된 옛날 버전을 쓰는게 아님
lsmod를 치면 지원하는 모듈을 확인 가능함.
ubuntu@ubuntu8:~/pi_bsp/kernel/linux$ lsmod
Module Size Used by
rpcsec_gss_krb5 32768 0
nls_iso8859_1 16384 1
snd_intel8x0 49152 2
binfmt_misc 24576 1
snd_ac97_codec 155648 1 snd_intel8x0
ac97_bus 16384 1 snd_ac97_codec
snd_pcm 135168 2 snd_intel8x0,snd_ac97_codec
snd_seq_midi 20480 0
vboxvideo 28672 1
snd_seq_midi_event 16384 1 snd_seq_midi
intel_rapl_msr 20480 0
drm_vram_helper 24576 1 vboxvideo
snd_rawmidi 49152 1 snd_seq_midi
drm_ttm_helper 16384 2 drm_vram_helper,vboxvideo
ttm 86016 2 drm_vram_helper,drm_ttm_helper
joydev 32768 0
drm_kms_helper 307200 4 drm_vram_helper,vboxvideo
intel_rapl_common 40960 1 intel_rapl_msr
crct10dif_pclmul 16384 1
snd_seq 77824 2 snd_seq_midi,snd_seq_midi_event
ghash_clmulni_intel 16384 0
cec 61440 1 drm_kms_helper
snd_seq_device 16384 3 snd_seq,snd_seq_midi,snd_rawmidi
rc_core 61440 1 cec
aesni_intel 376832 0
snd_timer 40960 2 snd_seq,snd_pcm
fb_sys_fops 16384 1 drm_kms_helper
crypto_simd 16384 1 aesni_intel
syscopyarea 16384 1 drm_kms_helper
cryptd 24576 2 crypto_simd,ghash_clmulni_intel
snd 106496 11 snd_seq,snd_seq_device,snd_intel8x0,snd_timer,snd_ac97_codec,snd_pcm,snd_rawmidi
sysfillrect 20480 1 drm_kms_helper
soundcore 16384 1 snd
sysimgblt 16384 1 drm_kms_helper
input_leds 16384 0
vboxguest 45056 0
serio_raw 20480 0
mac_hid 16384 0
sch_fq_codel 24576 2
nfsd 561152 13
msr 16384 0
auth_rpcgss 139264 2 nfsd,rpcsec_gss_krb5
parport_pc 53248 0
nfs_acl 16384 1 nfsd
lockd 110592 1 nfsd
ppdev 24576 0
grace 16384 2 nfsd,lockd
lp 28672 0
parport 69632 3 parport_pc,lp,ppdev
ramoops 28672 0
drm 618496 7 drm_kms_helper,drm_vram_helper,vboxvideo,drm_ttm_helper,ttm
pstore_blk 16384 0
sunrpc 585728 22 nfsd,auth_rpcgss,lockd,rpcsec_gss_krb5,nfs_acl
reed_solomon 28672 1 ramoops
pstore_zone 32768 1 pstore_blk
efi_pstore 16384 0
ip_tables 32768 0
x_tables 53248 1 ip_tables
autofs4 49152 2
hid_generic 16384 0
usbhid 65536 0
hid 147456 2 usbhid,hid_generic
ahci 49152 3
xhci_pci 24576 0
video 61440 0
pata_acpi 16384 0
crc32_pclmul 16384 0
psmouse 176128 0
libahci 49152 1 ahci
xhci_pci_renesas 20480 1 xhci_pci
e1000 155648 0
i2c_piix4 28672 0
펌웨어에서는 사용할 필요가 없으면 system clock을 sleep 시키고 멈출 수 있는데
OS에서는 system clock을 off할 수 없으므로 메모리와 전력 소모량이 많음.
유닉스와 유사한 운영체제 시스템, 독립적인 POSIX 구현
POSIX는 (Portable Operating System Interface) 이식 가능 운영 체제 인터페이스임. 시스템 콜 함수가 동일한 기능을 사용하고 있어야 서로 다른 운영체제에서 같은 코드로 동작이 가능한거임. C언어를 보면 딱 알 수 있음.
멀티프로세싱이 가능한게 장점
*모든 프로세스의 조상 systemd
ubuntu@ubuntu8:/etc/rc5.d$ ls
K01speech-dispatcher S01dbus S01rsync
S01acpid S01gdm3 S01rsyslog
S01anacron S01grub-common S01samba-ad-dc
S01apport S01irqbalance S01saned
S01avahi-daemon S01kerneloops S01smbd
S01bluetooth S01nfs-kernel-server S01spice-vdagent
S01console-setup.sh S01nmbd S01ssh
S01cron S01openvpn S01unattended-upgrades
S01cups S01plymouth S01uuidd
S01cups-browsed S01pulseaudio-enable-autospawn S01whoopsie
여러 데몬 프로세스 파일들이 /etc의 rc5에 들어가 있는데, 부팅과정에서 싹 실행시켜 줌.
예시로 samba, nfs 등이 있음.
pstree 명령어를 치면 process들의 계층적 구조를 보여줌
init process인 systemd에 딸려있는 형태인걸 볼 수 있음.
ubuntu@ubuntu8:/etc/rc5.d$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─accounts-daemon───2*[{accounts-daemon}]
├─acpid
├─avahi-daemon───avahi-daemon
├─blkmapd
├─colord───2*[{colord}]
├─cron
├─cups-browsed───2*[{cups-browsed}]
├─cupsd───dbus
├─dbus-daemon
├─gdm3─┬─gdm-session-wor─┬─gdm-x-session─┬─Xorg───{Xorg}
│ │ │ ├─gnome-session-b─┬─ssh-agent
│ │ │ │ └─2*[{gnome-+
│ │ │ └─2*[{gdm-x-session}]
│ │ └─2*[{gdm-session-wor}]
│ └─2*[{gdm3}]
├─gnome-keyring-d───3*[{gnome-keyring-d}]
├─irqbalance───{irqbalance}
├─2*[kerneloops]
├─networkd-dispat
├─nmbd
├─polkitd───2*[{polkitd}]
├─rpc.idmapd
├─rpc.mountd
├─rpcbind
├─rsyslogd───3*[{rsyslogd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─smbd─┬─cleanupd
│ ├─samba-bgqd
│ └─smbd-notifyd
├─snapd───9*[{snapd}]
├─sshd───sshd───sshd───bash───pstree
├─switcheroo-cont───2*[{switcheroo-cont}]
├─systemd─┬─(sd-pam)
│ ├─at-spi-bus-laun─┬─dbus-daemon
│ │ └─3*[{at-spi-bus-laun}]
│ ├─at-spi2-registr───2*[{at-spi2-registr}]
│ ├─dbus-daemon
│ ├─dconf-service───2*[{dconf-service}]
│ ├─evolution-addre───5*[{evolution-addre}]
│ ├─evolution-calen───8*[{evolution-calen}]
│ ├─evolution-sourc───3*[{evolution-sourc}]
│ ├─gjs───6*[{gjs}]
│ ├─gnome-session-b─┬─evolution-alarm───5*[{evolution-alarm}]
│ │ ├─gsd-disk-utilit───2*[{gsd-disk-utilit}]
│ │ ├─update-notifier───3*[{update-notifier}]
│ │ └─3*[{gnome-session-b}]
│ ├─gnome-session-c───{gnome-session-c}
│ ├─gnome-shell─┬─ibus-daemon─┬─ibus-engine-han───3*[{ibus-engi+
│ │ │ ├─ibus-extension-───3*[{ibus-exte+
│ │ │ ├─ibus-memconf───2*[{ibus-memconf+
│ │ │ └─2*[{ibus-daemon}]
│ │ └─16*[{gnome-shell}]
│ ├─gnome-shell-cal───5*[{gnome-shell-cal}]
│ ├─goa-daemon───3*[{goa-daemon}]
│ ├─goa-identity-se───2*[{goa-identity-se}]
│ ├─gsd-a11y-settin───3*[{gsd-a11y-settin}]
│ ├─gsd-color───3*[{gsd-color}]
│ ├─gsd-datetime───3*[{gsd-datetime}]
│ ├─gsd-housekeepin───3*[{gsd-housekeepin}]
│ ├─gsd-keyboard───3*[{gsd-keyboard}]
│ ├─gsd-media-keys───3*[{gsd-media-keys}]
│ ├─gsd-power───3*[{gsd-power}]
│ ├─gsd-print-notif───2*[{gsd-print-notif}]
│ ├─gsd-printer───2*[{gsd-printer}]
│ ├─gsd-rfkill───2*[{gsd-rfkill}]
│ ├─gsd-screensaver───2*[{gsd-screensaver}]
│ ├─gsd-sharing───3*[{gsd-sharing}]
│ ├─gsd-smartcard───4*[{gsd-smartcard}]
│ ├─gsd-sound───3*[{gsd-sound}]
│ ├─gsd-usb-protect───3*[{gsd-usb-protect}]
│ ├─gsd-wacom───2*[{gsd-wacom}]
│ ├─gsd-wwan───3*[{gsd-wwan}]
│ ├─gsd-xsettings───3*[{gsd-xsettings}]
│ ├─gvfs-afc-volume───3*[{gvfs-afc-volume}]
│ ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
│ ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
│ ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
│ ├─gvfs-udisks2-vo───3*[{gvfs-udisks2-vo}]
│ ├─gvfsd─┬─gvfsd-trash───2*[{gvfsd-trash}]
│ │ └─2*[{gvfsd}]
│ ├─gvfsd-fuse───5*[{gvfsd-fuse}]
│ ├─gvfsd-metadata───2*[{gvfsd-metadata}]
│ ├─ibus-portal───2*[{ibus-portal}]
│ ├─ibus-x11───2*[{ibus-x11}]
│ ├─pulseaudio───3*[{pulseaudio}]
│ ├─tracker-miner-f───4*[{tracker-miner-f}]
│ ├─ubuntu-report───7*[{ubuntu-report}]
│ └─xdg-permission-───2*[{xdg-permission-}]
├─systemd-journal
├─systemd-logind
├─systemd-resolve
├─systemd-timesyn───{systemd-timesyn}
├─systemd-udevd
├─udisksd───4*[{udisksd}]
├─unattended-upgr───{unattended-upgr}
├─upowerd───2*[{upowerd}]
├─whoopsie───2*[{whoopsie}]
└─wpa_supplicant
*리눅스의 주소
*가상 파일 시스템(virtual file system)
리눅스는 모든걸 파일 시스템으로 관리하는데, 모든 파일 시스템에 대한 공통 인터페이스를 제공하고
유닉스 파일 시스템과 관련된 모든 시스템 콜을 처리하는 커널 소프트웨어 계층임
df를 하면 물리적으로 연결된 파일들이 보임. 이 때 물리적으로 연결된 파일을 마운트해서 사용
'Linux BSP' 카테고리의 다른 글
[Linux] Linux 압축 관련 명령어 정리 (1) | 2024.02.15 |
---|---|
[RaspberryPi Kernel] Ubuntu 환경에서 커널 부팅 이미지 바꿔버리기~ (0) | 2024.02.15 |
[Linux BSP] U-Boot 초기화 과정 (0) | 2024.02.13 |
[Ubuntu-RaspberryPi] C언어로 U-Boot gpio제어를 통한 led 동작시키는 명령어 추가 (1) | 2024.02.13 |
[ARM] 어셈블리코드 문법 (0) | 2024.02.08 |