본문 바로가기
Linux BSP

[Linux] Kernel, Process, Memory..?

by TYB 2024. 2. 15.
반응형

우수한 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됨.

 

임베디드 리눅스는 특정한 목적의 응용 프로그램 탑재를 위해 운영체제를 올리기 때문에 아무래도 더 적은 메모리, 느린 속도 등 임베디드 특성에 맞게 올라간다고 생각하믄 된다.

 

최신 버전의 커널은 아래 링크에 올라옴. 하지만 최신꺼는 버그가 발견이 안되어 있을 가능성도 있으므로 주의가 필요하다.

괜히 검증된 옛날 버전을 쓰는게 아님 

 

The Linux Kernel Archives

 

kernel.org

 

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언어를 보면 딱 알 수 있음.

 

멀티프로세싱이 가능한게 장점

top 명령어를 쳐보면 몇개의 프로세스와 코어를 사용하는지 나온다.

 

 


*모든 프로세스의 조상 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

 

 

*리눅스의 주소

1. 논리 주소(Logical Address)
v실제 CPU가 기계어 상에서 사용되는 주소
2. 선형 주소(Linear Address)  = 가상주소
vCPU가 사용하는 4GB 영역까지의 억세스 가능한 주소(1GB:커널 동작용 메모리, 3GB: 사용자용 메모리)
v가상(Virtual)적으로 할당하어 프로그램에서 사용하는 주소
3. 물리 주소(Physical Address)
v메모리 칩의 메모리 셀의 위치를 지정
v어드레스 버스로 전달되는 전기적인 신호
 
물리주소의 한계를 극복한게 가상주소임. 1GB를 4GB처럼 사용하는거임. 파일시스템 일부를 메모리처럼 사용하는 가상메모리 기법(스왑 메모리)을 사용하기 때문에 실제 물리 메모리는 1GB밖에 없어도 가상으로 4GB를 사용하는 것 처럼 맵핑해서 사용하는 거임. 그래서 물리 메모리가 부족하더라도 스왑메모리를 활용해서 극복함.
이때 메모리를 맵핑해주는 게 MMU(Memory Management Unit) 

 

 

 


q인터럽트 핸들러의 분리
vTop half(interrupt service routine을 의미함) (긴급하게 처리해줘야됨. Flag하나 값만 변경하는 거 위주)
Ø하드웨어 레벨의 인터럽트 핸들러
Ødo_IRQ() 함수에서 처리
vBottom half(top half에서 flag변경해준거에 대한 동작을 여유로울 때 하는거임.)
Ø소프트웨어 레벨의 인터럽트 핸들러로 안정된 시점에 실행된다.

*가상 파일 시스템(virtual file system)

 

리눅스는 모든걸 파일 시스템으로 관리하는데, 모든 파일 시스템에 대한 공통 인터페이스를 제공하고

유닉스 파일 시스템과 관련된 모든 시스템 콜을 처리하는 커널 소프트웨어 계층임

 

 

q디스크 기반 파일시스템
v로컬 디스크 파티션의 기억 장소를 관리
v하드디스크, 플로피, CD-ROM 같은 블록 디바이스에 기반
vext2, msdos, vfat, ntfs, iso9660(CD-ROM), hpfs(OS/2)
q네트워크 파일시스템
v다른 네트워크의 컴퓨터에 속한 파일 시스템에 접근
vNFS, Coda, AFS, SMB, NCP
q특수 파일시스템(대부분 커널의 메모리 영역을 마운트 해놓은 거임.)
v/proc 파일시스템
Ø사용자가 커널의 데이터에 접근할 수 있는 인터페이스 제공
v/dev 파일시스템
Ø디바이스를 표준 파일시스템으로 관리할 수 있는 인터페이스 제공
 
파일에 등록하고 fdisk를 하면 등록된 게 보임
그럼 이 때 마운트를 해야됨.

 

df를 하면 물리적으로 연결된 파일들이 보임. 이 때 물리적으로 연결된 파일을 마운트해서 사용

 

 
반응형