본문 바로가기

All154

[Linux Kernel] 가상 파일시스템이란 (VFS, Virtual Filesystem Switch) Virtual Filesystem이란 리눅스를 사용하면 다양한 형식으로 포맷된 디스크를 사용할 수 있다. 보통 리눅스어세는 ext2, ext3, ext4를 사용하지만 윈도우에서 사용하는 NTFS나 FAT같은 디스크도 사용할 수 있다. 그런데, 어떤 디스크를 사용하던간에 관계 없이 프로그램을 작성할 땐 open, read, write, close와 같은 시스템 호출을 사용해서 이 모든걸 처리할 수 있다. 지금은 이게 모두 당연하지만, 예전에는 그렇지 않았다. 실제 파일 시스템이 무엇이냐에 관계 없이 공통된 인터페이스 (open/read/write/close 등)로 접근하는 것은 매우 어려운 일이었다. 이렇듯 리눅스에서, 실제 파일시스템에 관계 없이 공통된 인터페이스로 파일시스템에 접근하도록 하는 계층을 가.. 2021. 4. 13.
[Linux Kernel] 리눅스 커널 모듈 작성 리눅스 커널 모듈이란 리눅스 커널 모듈은, 시스템에 설치된 커널 바이너리와는 다르게 동적으로 기능을 추가할 수 있는 오브젝트 파일이다. 예를 들어 커널에 어떤 기능을 추가하기 위해선 코드를 수정하고, 커널을 컴파일하고 설치한 후에 재부팅을 해야한다. 하지만 모듈로 작성하면 시스템이 실행중인 도중에도 동적으로 기능을 추가하거나 제거할 수 있다. 물론 모듈을 추가하거나 제거하려면 root 권한이 필요하다. 시스템 호출을 구현하거나, 문자/블록 디바이스 드라이버, 파일시스템 구현 등 다양하게 사용될 수 있다. 커널 모듈의 로딩과 언로딩 lsmod로 설치된 모듈을 확인하고, insmod로 모듈을 로드하고, rmmod로 모듈을 언로드할 수 있다. modprobe, depmod 등의 명령도 존재한다. 간단한 차이점.. 2021. 4. 13.
[kernel/locking] spinlock (2) - Test And Set, Ticket, ABQL, MCS [kernel/locking] - spinlock(1) 앞선 글에서, 아키텍처에 종속적인 부분을 제외하고 spinlock을 어떻게 사용하는지 이야기해보았다. 실제 아키텍처별로 구현된 spinlock 구현체를 보려면 일단 spinlock에 대한 개념들이 더 필요하므로 개념을 짚고 넘어가겠다. Test And Set (TAS) spinlock의 기본적인 구현은 lock을 획득할 수 있을 때까지 loop를 도는 Test And Set lock이라고 할 수 있다 // Test and Set lock pseudocode while (test_and_set(lock) == FAILED) { // spin } // 위의 while문이 끝나면 lock을 획득했다는 것이 보장된다. 여기서 test_and_set이란, 현.. 2021. 3. 28.
[kernel/locking] spinlock (1) - spinlock 사용법 앞선 글에서 lock이란 무엇이고, lock의 필요성에 대해서 알아보았다. 이번 글에서는 가장 기본적인 spinlock을 리눅스 커널에서 어떻게 구현했는지 알아볼 것이다. 우선 관련된 개념을 몇 가지 살펴보자. 참고로, 이 문서에서 다루는 spinlock은 커널에서 사용하는 spinlock에 대해 다루고 있다. userspace에서의 spinlock은 pthread spinlock을 사용해야 한다. 자료구조 spinlock은 include/linux/spinlock_types.h에 spinlock_t로 정의되어있다. 한 번 살펴보자. /* include/linux/spinlock_types.h */ typedef struct spinlock { union { struct raw_spinlock rlock.. 2021. 3. 27.
락 (lock)이란 무엇인가 Lock 락은 여러 스레드 간에 자원을 접근하는 매커니즘을 제공한다. 일반적으로 상호 배제 정책을 통해, 하나의 스레드가 특정 자원에 접근중인 경우에는 다른 스레드가 접근하지 못하도록 제한한다. 락이 없다면 두 개 이상의 스레드가 동시에 자원에 접근할 수 있으므로, 데이터의 무결성이 보장되지 않는다. 락의 개념은 멀티스레드를 사용하는 환경이라면 어디든 사용될 수 있다. ex)데이터베이스 락이 필요한 예시 - 여러 스레드가 동시에 공유 자원에 접근하는 경우 이해를 돕기 위해 간단한 예시를 들어보자. 스레드 A, B가 다음의 작업을 동시에 수행한다고 해보자. A, B는 변수 x를 공유한다. 스레드 A: x를 1 증가시킨다 스레드 B: x를 1 증가시킨다 그런데 'x를 1 증가시킨다'라는 작업은 기계어 상으로.. 2021. 3. 16.
리눅스 커널에 커밋 해보자 리눅스 커널에 커밋해보자! 리눅스 커널에 커밋한다는 건 정말 멋진 일이다. 하지만 나는 아직 쪼렙이기 때문에 커널의 중요한 파트에 기여할 수는 없다. 하지만 리눅스 커널에 커밋하기 위해서 항상 엄청난 일을 해야하는 건 아니다. 대신 나는 아주 작고 귀여운, 코딩 스타일 고치기를 해보기로 했다. 코딩 스타일을 점검해주는 checkpatch.pl 스크립트의 warning을 고쳐보자. 우선 git 저장소를 클론한다. git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git drivers/staging 폴더에는 TODO 파일이 있는데, 코딩 스타일을 고쳐야 할 경우에는 "fix checkpatch.pll warning"이라고 보통 쓰여.. 2021. 3. 14.