목록전체 글 (22)
꾸준히
리눅스 디바이스 모델을 정리하는 글입니다. 리눅스 디바이스 모델 목차 1. 디바이스 모델 구성 2. 플랫폼 디바이스와 드라이버 3. 디바이스 트리 디바이스 모델 구성 디바이스 모델 커널에서는 기본적인 형식 위에 다양한 형태의 하드웨어를 쉽게 다룰 수 있도록, 디바이스 드라이버의 구성을 체계화 했다. 즉, 처리 방식을 통합하기 위함이다. 위 디바이스 모델에 따라, HW(위 그림에서 keypad)를 등록하기 위해서, bus, device, class, driver를 등록해야 한다. 가상 버스 생성 후 driver를 등록하는 순서는 아래와 같다. 가상 버스를 등록 가상버스를 디바이스로 등록 위 디바이스 타입을 사용하여 driver를 등록 클래스를 등록 참고로 디바이스 드라이버 연결 관계를 출력하기 위해 sys..
리눅스 가상 메모리의 개념과 가상메모리가 물리 메모리로 변환되는 과정을 설명하는 글입니다. 리눅스 가상 메모리 목차 1. 가상 메모리란 2. 페이징 기법과 주소 변환의 이해 3. 가상 메모리가 물리 메모리로 변환 되는 과정 위의 목차를 클릭하면 해당 글로 자동 이동 합니다. 가상 메모리란 가상 메모리란 실제 각 프로세스마다 충분한 메모리를 할당하기에는 메모리 크기의 한계가 있어, 디스크(ROM)의 일부를 확장된 RAM처럼 사용하기 위한 개념이다. 위 말의 의미는 프로세스의 가상 메모리 공간에 있는 페이지들 가운데, 현재 수행에 필요한 부분만 물리 메모리에 적재하여 사용한다는 의미이다. (물리 메모리가 부족해지면 일정 부분의 페이지들을 다시 하드디스크로 이동 시킨다) 가상 메모리 구조 페이징 기법과 주소 ..
디바이스 드라이버에서 변수와 메모리 할당에 관한 내용을 정리하는 글입니다. 디바이스 드라이버에서 변수의 사용, 이식성과 데이터 형, 커널에서의 동적 메모리에 대해 설명합니다. 디바이스 드라이버에서 변수와 메모리 할당 목차 1. 변수의 사용 2. 이식성과 데이터 형 3. 커널에서의 동적 메모리 관리 변수의 사용 디바이스 드라이버는 다중 프로세스 환경에서 동작하기 때문에 프로세스간 변수 사용에 따른 경쟁 문제를 해결하기 위해 가급적 지역 변수를 사용하는 편이 좋다. 하지만 해제되는 시점까지 유지해야 하는 정보라면 전역 변수로 지정해야 한다. 변수 명 사용 시 static을 주로 사용한다. 커널 소스는 방대한 함수와 전역 변수가 있으므로, 이것이 서로 중복되지 않도록 하기 위해 static으로 선언하는 습관을..
캐릭터 디바이스 드라이버를 작성하고, 커널에 모듈로 등록하여 정상적으로 동작되는지 확인하는 과정을 정리한 글입니다. 캐릭터 디바이스 드라이버 API 캐릭터 디바이스 번호 할당/해제 alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name) 디바이스 번호를 동적으로 할당하기 위한 함수 매개 변수 설명 *dev 성공적인 경우 디바이스 번호가 할당 됨 firstminor 디바이스에 할당될 첫 번째 minor number, 일반적으로 0 count 부 번호로 디바이스 개수 *name 디바이스 이름 (/proc/devices와 sysfs에 나타남) unregister_chrdev_region(dev_t first,..
정의 디바이스 드라이버란 디바이스와 응용프로그램 사이에 데이터를 주고 받기 위한 인터페이스이다. 쉽게 말하면 OS에서 디바이스를 인식하게 해주고, 디바이스를 제어할 수 있는 코드를 작성하는 것이다. 여기서 디바이스란 키보드, 마우스, 네트워크 카드 등의 CPU와 연결되어 있는 주변장치를 말한다. 응용 프로그램에서 open(), read(), write(), close() 등 file_operations 구조체에 정의된 함수를 통해 장치 파일에 접근할 때, 호출할 함수를 정의하고 구현해야한다. 사용자는 드라이버 내의 함수에 대해 알 필요가 없다. 디바이스 종류 디바이스는 문자 디바이스, 블록 디바이스, 네트워크 디바이스로 나눌 수 있다. 문자 디바이스는 시간 순으로 들어오는 데이터를 처리한다. 예를 들어 ..
CPU 성능 향상의 한계 스레드 프로그래밍이 많이 쓰이는 이유는 CPU의 성능과 효율에 기술적 한계가 보이기 시작했기 때문이다. 과거에는 프로그래머가 비효율적인 코드를 작성하더라도 새로 개발된 CPU 및 주변 장치로 교체해주면 성능 문제가 해결되는 경우가 많았다. 하지만 시간이 지나면서 클럭 속도를 4GHz 이상 올리기 시작하자 심각한 전력 소비 현상과 더불어 발열 문제가 발생했다. 원래 CPU의 성능을 올리기 위한 기초적인 방법은 작동 클럭을 올리는 것이다. 하지만 클럭의 한계점이 보이기 시작하자 벤더들은 분업의 원리를 적용한 멀티코어를 만들었다. 이는 프로세서 1개의 성능 향상이 한계에 부딪히자 2개 이상의 프로세서가 작업을 나눠서 실행하도록 하는 병렬 처리 힌트에서 파생된 것이다. 공정 기술의 향상..
mmap (memory mapped I/O) mmap은 장치나 파일을 메모리와 대응시키는 기법이다 POSIX 시스템에서 mmap의 구현은 파일기술자(fd)를 포인터 변수에 대응시키는 방법을 사용한다 따라서 먼저 파일을 열고 거기서 얻어진 파일기술자를 mmap에 넘기는 방식을 사용한다 mmap 대응이 완료되면 파일의 내용에 접근할 때 read, write 관련 명령을 사용할 필요 없이 포인터 변수를 이용하여 접근할 수 있다 int fd = open("/tmp/myfile", O_RDWR, 0664); char *p_map = mmap((void *)0, 8192, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); close(fd); 위 예시를 보면 먼저 파일을 오픈하고, mmap ..
컨텍스트 스위칭이란 태스크란 동작하는 프로그램이고, 동작하는 프로그램의 정보는 컨텍스트이다 이 컨텍스트를 어딘가에 저장하고 다른 어딘가에서 컨텍스트를 가져다가 프로세서 코어의 레지스터에 복구하는 작업이 컨텍스트 스위칭이며 컨텍스트 스위칭이 완료되면 다른 프로그램(태스크)가 실행되는 것이다 * 컨텍스트 컨텍스트 스위칭 과정 1. 현재 동작하고 있는 태스크의 컨텍스트를 현재 스택에 백업한다 2. 다음에 동작할 태스크 컨트롤 블록을 스케줄러에서 받는다 3. 2에서 받은 태스크 컨트롤 블록을에서 스택 포인터를 읽는다 4. 3에서 읽은 스택포인터로 태스크 스택의 컨텍스트를 읽어 ARM코어에 복구한다 5. 다음에 동작할 태스크의 직전 프로그램 실행 위치로 이동한다 6. 태스크가 전환 된다 Task1이 현재 동작 중..