본문 바로가기
코스웨어/12년 내장형하드웨어

2012.10.09 리눅스 커널

by 알 수 없는 사용자 2012. 10. 10.
728x90
반응형

80년대까지 롬라이터를 이용한 임베디드 프로그래밍이 대세였으나, 90년대 이후로는 자체적으로 쓰고 지울 수 있는 방식이 대중화 되었다. 우리가 사용해본 Atmel 사의 제품들이 그렇다.


CPU에 전원이 들어가게 되면 0번지부터 읽어 들이기 시작하며, 이것을 부팅(booting)이라 한다.


운영체제는 최소한 2개 이상의 프로그램이 존재하게 되는데 하나는 운영체제, 다른 하나는 어플리케이션이다.


커널 공간과 어플리케이션 공간으로 나누어 분리해서 사용하며 운영체제마다 공간할당은 다를 수 있다.


윈도우 95에서 자주 보던 파란화면은 대부분 어플리케이션이 메모리를 잘못 사용해서 일어나는 에러이며 이것을 전문용어로 커널 패닉(Kernel Panic)이라한다. 우리는 커널 프로그래밍을 배우는 과정이기에 잘못 작성하면 커널 패닉이 일어난다.


요즘에는 커널공간의 메모리를 접근할 때에는 접근 권한을 필요로 하며, 이것은 속도측면의 이익을 위해 CPU자체에서 메모리 매니지먼트 유닛 MMU 라는 부분을 따로 두어 접근을 제어한다. 이 권한을 특권레벨 Privilege Level 이라 부른다.


CPU에서는 총 네 개의 레벨을 제공하지만 보통 0번과 3번만을 사용한다. 이것은 복잡해지는것을 막기 위해서

두 가지만 사용하지만 OS가 더 커지고 방대해질 경우 모든 레벨을 사용할 수도 있겠다.


세그먼트 디스크립터(SD)는 구조체를 말한다.


DPLType Filed 두 가지가 있다.


DPL 끼리는 호출하거나 리턴할 수 있으며 서로 점프할 수 없다. 커널 영역을 건드리지 못하게 하기 위해서 중간에 특수한 함수, 즉 허용된 범위안에서만 쓸 수 있게 한다.. 이것을 Call Gate 라고 한다. 어셈블리라 할지라도 JMP를 이용해서 점프할 수 없다.


인터럽트

시스템 호출도 인터럽트의 하나이다.

80h는 인터럽트를 리눅스의 인터럽트를 말하기도 하며, 호출 후 또다를 Vector Table이 있는 곳으로 점프한다. 결론적으로 두개의 코드를 다 알아야만 올바른 호출이 가능하다.


명시된 특정 조건에 만족하면 프로그램은 정지하고 인터럽트가 호출된다. 0 부터 19까지는 CPU 구조적으로 Intel에서 디자인해 두었다. 바꿀 수 없다. 리눅스에는 커널 제작자가 Intel CPU 스펙을 참고하여 해당 인터럽트가 발생했을때 수행할 함수를 다 구현해 두었다.


DPL 3은 일반 Application에서 사용할 수 있는 레벨이다.

리눅스의 man page 분류는 system call이냐 일반 Application Call이냐에 따라 섹션이 나뉜다.


인터럽트 Vector의 크기는 1024이며 주소는 4바이트 체계를 가지므로 총 256개의 인터럽트를 가질 수 있다. 만약 운영체제가 원하는 모든 인터럽트를 다 부여할 경우 256개로서는 부족하겠지만 System Call 을 이용하여 모든 인터럽트를 구현할 수 있게 해 두었다.


페이지 171

사용자 영역에서 호출시키기 위해선 Vector Table에 등록하기 위해선 set_system_gate()를 사용해서 하나하나 다 등록을 시켜줘야 한다.


728x90