리눅스에서 User Space가 하드웨어 자원을 사용하기 위해 요청을 보내는 곳
커널이 존재하지 않고 유저가 모든 자원을 사용할 수 있다면, 안정성과 보안성이 떨어지게 된다.
User가 Kernel에 요청을 보내는 행위를 System Call이라고 부른다.
Task는 쓰레드와 프로세스를 통칭하는 말로 커널에서는 큰 구분없이 사용한다.
커널에서 프로세스와 쓰레드 차이는 자원을 덜 공유하는 태스크와 자원을 더 공유하는 태스크이다.
만약 응용 프로세스에서 fork()나 pthread_create()를 호출하게 된다면 커널은 구분하지 않고 동일하게 copy_process() 함수를 호출한다
Task가 생성되면 각 Task는 하나씩 task_struct 구조체가 할당된다
커널 코드에서 많이 보이는 current 매크로는 CPU에서 현재 실행중인 태스크의 task_struct를 가르키는 포인터이다. 이 매크로를 통해서 커널 코드 어디서나 현재 실행 중인 태스크의 정보에 접근할 수 있다. 그렇기에 커널 기능 구현에 필수적이다.
리눅스 네임스페이스
위 코드에서 start_code
와 end_code
는 코드 세그먼트의 시작과 끝의 주소를 담고 있고, start_data
와 end_data
는 데이터 세그먼트의 시작과 끝을, start_brk
와 brk
는 힙 세그먼트의 시작과 끝의 주소를 담고 있으며 brk
는 증가할 수 있다. start_stack
는 스택 세그먼트의 시작 주소를 뜻한다.
========================================================================================================================
Start addr | Offset | End addr | Size | VM area description
========================================================================================================================
| | | |
0000000000000000 | 0 | 00007fffffffffff | 128 TB | user-space virtual memory, different per mm
__________________|____________|__________________|_________|___________________________________________________________
|
| Kernel-space virtual memory, shared between all processes:
____________________________________________________________|___________________________________________________________
| | | |
ffff888000000000 | -119.5 TB | ffffc87fffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base)
__________________|____________|__________________|_________|____________________________________________________________
|
| Identical layout to the 56-bit one from here on:
____________________________________________________________|____________________________________________________________
ffffffff80000000 | -2 GB | ffffffff9fffffff | 512 MB | kernel text mapping, mapped to physical address 0
ffffffffa0000000 |-1536 MB | fffffffffeffffff | 1520 MB | module mapping space
__________________|____________|__________________|_________|___________________________________________________________
커널 영역의 메모리 구조는 유저 영역과 달리 모든 프로세스가 공유하기 때문에, 서로 다른 프로세스가 같은 커널 영역의 주소에 접근하게 되면 모두 같은 커널 영역 메모리에 접근하게 된다