리눅스 커널 12

[ Linux Kernel ] 28. 가상 파일 시스템

프로그래밍을 하다보면 빠지지 않는 것이 파일 처리인데요, 혹시 파일 작업을 하기 위해 read(), write()와 같은 시스템콜을 사용하면서 "왜 매개변수로 어떤 파일 시스템인지 넘겨주지않지?"라고 생각해보신적 있으신가요? 사실 조금만 생각해보면 답이 금방나오는 질문입니다. 이유는 파일 시스템이 추상화되어있기 때문입니다. 구조를 표현하면 다음 그림과 같습니다. 파일 시스템간의 공통된 인터페이스를 둠으로써 얻는 장점은 여러 가지가 있습니다. 동일한 방법으로 접근이 가능하다. 파일 시스템간의 이식성이 좋아진다. 새로운 파일 시스템이 추가되더라도 설계를 변경할 필요가 없다.

[ Linux Kernel ] 22. 커널에 모듈 추가하기

22. 커널에 모듈 추가하기 Kconfig => Kernel에 새로운 장치를 추가하고, 해당하는 모듈을 추가하기 위해서는 먼저 Kconfig라는 파일을 알아야한다~ Kconfig를 정리하자면 Tree구주로 된 Configuration option들의 집합으로 자신만의 종속성을 가지고 있음 Child Entry는 Parent Entry가 선택되어 볼 수 있게 되었을 때만 보임 Menu entry들은 각각의 config option을 정의하고 있음. 각각의 config option들은 자신만의 type을 가지며, tristate, bool type이 있음 tristate : bool : 이 type에 따라 어떤 선택을 하느냐에 따라 Kernel에 해당 모듈을 포함하는 여부가 결정된다.( 보통 make men..

[ Linux Kernel ] 13. Process State

17. Process State 프로세스의 상태에는 ready, running, waiting이 존재한다. running은 프로세스 입장에서는 최상의 상태이며, running 중 Disk I/O를 요구하는 사건이 발생하면 CPU가 해당 프로세스의 상태를 waiting으로 바꾼다. waiting의 경우 시그널의 상황에 따라 2가지의 반응이 있을 수 있는데 이 부분은 중요한 내용은 아니므로 넘어가도록 한다. I/O가 끝나고 상태는 wait에서 ready로 넘어가게 된다(CPU는 항상 바쁘다). I/O가 끝나고 ready list에 참여해서 기다리다 보면 자신의 차례가 올 것이다. 차례가 오는 것을 Scheduler dispatches라고 표현한다. dispatch과정을 상세하게 풀어보자면, **context..

[ Linux Kernel ] 12. Kernel Thread(커널 스레드)

16. Kernel Thread(커널 스레드) 이번 5번째 강의에서는 프로세스간 CPU 점유권의 이동이 어떤 매커니즘으로 이루어지는지를 다루게 된다. CPU를 할당해준다는 것은 단순히 프로세스의 우선순위 말고도 고려해야할 것들이 많다. 리눅스 운영체제는 과연 이러한 숙제를 어떻게 풀고 있는지 지금부터 살펴보려 한다. 먼저 강의노트 4에서 다뤘던 내용들을 잠시 떠올려보자. 스레드(Thread)가 있고 프로세스(Process)가 있었다. 프로세스는 부모의 것(Task basic info + files, fs, tty, mm, signals)을 전부 그대로 복사한 것(heavy-weight creation)이고,반대로 최소한으로 복사(light-weight creation)한 것이 스레드이다. 또한 커널은 메..

[ Linux Kernel ] 10. Process Create

14. Process Create 부모 프로세스가 자식 프로세스를 만들어 내는 작업을 할 때는 두번의 오버헤드(overhead)가 발생한다. 이 오버헤드들은 fork()를 하는 도중 발생하며, 첫번째 오버헤드는 부모 프로세스의 이미지를 자식에게 복사할 때 생기고 두번째는 부모 프로세스의 PCB를 자식 프로세스에 복사하며 생긴다. 작업 과정을 자세히 알아보기 전에 먼저 PCB의 구성에 대해 알아보자. # Note 오버헤드: 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간, 메모리 등을 말한다. A라는 처리를 10초만에 했지만 안전성 고려 때문에 처리가 15초가 걸리는 B의 방식은 오버헤드가 5초가 발생한 것이다. 또한 이러한 B의 방식을 개선해 12초가 걸리면 오버헤드가 3초 단축되었다고 말한다. 14..

[ Linux Kernel ] 09. 중간정리 및 Daemon(데몬)/Server(서버)

12. 총정리 지금까지 다뤘던 내용들을 총 엮어서 설명을 진행한다. 꽤나 복잡한 그림이 엮여 나오니 설명과 함께 따라오도록 노력해보자. 일단 아래 그림에 분홍색 구간은 커널이다. 커널 안에는 여러가지 시스템 콜이 존재하고 있다. 그리고 이 시스템 콜들은 context_switch()와 같은 내부함수와 연관이 있으며 각 하드웨어 자원마다 자료구조가 존재(struct CPU)한다. 아래 그림 또한 그림에 오류가 있는 부분이 있는데, 오류가 난 부분은 설명하면서 함께 나오니 너무 걱정할 필요는 없다. fork()를 진행하면 커널로 진입한다. 커널에서 fork( )는 부모 프로세스와 똑같은 image를 생성한다. 점선으로 표시된 이유는 아직 CPU 제어가 부모 프로세스에 있기 때문에 자식 프로세스로 향하는 선은..

[ Linux Kernel ] 07. 주요 시스템 콜 동작 원리

9. 주요 시스템 콜 동작 원리 2강에서 설명했던 fork()의 작동 원리에 대해서 이어서 설명한다. fork()뿐만아니라 이번 3강에서는 다양한 시스템 콜에 대해 학습한다. 또한 데몬(Daemon)과 서버(Server)에 대해서도 간단히 학습할 것이다. 시작하기 앞서 이번 강의에서 등장할 그림들에 오류가 있다는 점을 언급하고 싶다. 오류가 있는 부분은 별도로 빨간색으로 마크해서 원래 있어야할 곳으로 표식을 해놓거나 중간 중간 어떤 부분에 오류가 있는지를 언급을 했으니 부디 설명을 읽으면서 헷갈리지 않길 바란다. 9.1 Fork(2)의 동작 원리 그림에서 수정된 사안이 하나 있는데, printf(“I am parent!\n”)부분이 else 구문에 속해야하는 것이 맞다. 이점을 주의해서 아래 설명을 보자..

[ Linux Kernel ] 06. Child Process 생성하기

8. Child Process 생성하기 컴퓨터를 부팅하면 제일 먼저 커널 프로세스가 로드된다. 그리고 이 커널은 터미널이 켜질때 마다 그에 해당하는 Shell, 즉 Child Process를 만든다. Shell은 사용자의 입력을 기다리고 입력이 들어오면 그에 따른 작업을 수행해주는 프로그램이다. 사용자가 Mail이라고 입력하면 Mail이라는 Child Process가 생성 된다. 이처럼 프로세스들이 진행될 때는 자식 프로세스(Child Process)가 생성되면서 진행된다. 따라서 커널을 공부할 때 Child Process는 반드시 알아야하는 개념이다. 지금부터의 설명은 아래 그림과 함께 살펴보도록 한다. # Note 잠시 여기서 프로그램과 프로세스의 차이에 대해 알아보자. 프로그램과 프로세스의 차이는 ..

[ Linux Kernel ] 04. 시스템콜(System Call)

6. 시스템 콜(System Call) 시스템 콜(System Call)은 것은 정확히 언제 일어나는 것일까? 우리가 I/O관련 function을 하려고 하면 그때 바로 일어나는 것일까? 이것을 알아보기 위해 먼저 밑에 그림을 보자. 리눅스 명령어는 옆에 붙은 숫자에 따라 커맨드(1), 시스템 콜(2), 라이브러리 함수(3)*로 구분된다.* 위 그림의 좌측을 보면 유저 영역 안에 내가(유저)가 작성한 코드 my code가 있다. 이 코드에서 printf()를 호출(call) 하는데 이 printf() 코드는 내가 작성한 게 아니라 library function이다. C언어를 배울 때 #include 를 하는 이유를 생각해보면 금방 이해할 것이다. 그럼 이제 printf()가 내가 작성한 코드 my cod..

[ Linux Kernel ] 02. printf("Hello Wolrd!")의 진실

3. printf("Hello World!")의 진실 그러면 이제 우리가 한 가지 궁금한 점이 있다. 우리는 프로그램을 만들 때 소스코드에 입출력과 관련된 함수를 작성한다. printf()를 사용하거나 get()등 디스크에 접근해서 값을 읽어오거나 화면에 문자를 출력하는 함수를 사용한다. 우리가 작성한 코드와 프로그램은 유저모드에서 아무런 제약없이 사용할 수 있었는데, 왜 I/O가 금지되었다고 말을 하는 것일까? 정답은 “소스코드에서만 그렇게 보인다”이다. 소스코드에서는 개발자가 입출력을 관리하는 것처럼 보이지만, 소스코드를 컴파일 한 후에 바이너리 파일을 열어보면 I/O와 관련된 instruction은 전혀 존재하지 않는다. 위에서 언급했듯이 I/O를 하고 싶으면 커널이 가지고 있는 function을 ..

[ Linux Kernel ] 00. 리눅스커널과 운영체제

LINUX 커널 리눅스 커널을 한 사람이 전부 아는 것은 불가능하다. 커널 관련 두터운원서를 75~80권 정도는 읽어야 "아, 한 번씩은 훑어봤다"라고 말할 수 있을 정도다. IBM같은 대형회사에서도 리눅스를 다루는 사람만 250명 정도 있다고 한다. 250명의 사람이 방대한 커널에서 각자 분야를 맡아서 일을 처리한다. 따라서 "모든걸 다 알아야지~!"라는 마음가짐 보다는 "커널과 운영체제가 어떤식으로 동작하는지 개략적으로 이해해보자"라는 수준의 마음가짐으로 임할것이다. 1. 운영체제란? 운영체제(Operating System)이란 하드웨어 자원들(cpu, memory, disk, tty)을 관리하고 프로그램들을 지원(support)해주는 것이다. (아래 그림을 살펴보면 Operating System의 ..

[ Embedded ] 00. 임베디드의 이해(LINUX 기반)

** 무엇을 배워야 임베디드 리눅스 개발을 잘할 수 있을까? ** 좁게 보면 임베디드 리눅스 개발자가 알아야할 지식은 다음과 같다. 리눅스 디바이스 드라이버 리눅스 커널 CPU 아키텍쳐 SoC 조금 넓게 보면 다응 내용도 알면 좋다. 유저 공간 HAL(Hardware Abstraction Layer) 코드 구현 빌드 스크립트 구현 테스트용 디바이스 드라이버 구현 git과 형상관리 임베디드 리눅스 개발을 시작하면 바로 디바이스 드라이버를 맡는 경우가 많다. 물론 프로세스나 개발 회사 규모에 따라 드라이버 개발 범위가 다르다. 제품을 이루는 디바이스 드라이버의 특정 분야를 맡을 수도 있고 어떤 경우 한 명의 임베디드 개발자가 임베디드 리눅스를 채임지는 경우도 있다. 디바이스 드라이버..