개발/컴퓨터사이언스
-
eventfd개발/컴퓨터사이언스 2018. 7. 18. 21:37
eventfd는 리눅스기반 운영체제에서 파일 디스크립터를 통해 프로세스들끼리 통신 할 수 있는 API중 하나다. IPC로 가장 유명한 pipe는 read와 write용으로 채널을 따로 만드는 것과는 달리 eventfd에서는 읽고 쓸 파일 디스크립터 하나면 충분하기 때문에 번거로운 세팅작업 없이 간단하게 구현 할 수 있다. 그러나 단 한개의 채널을 사용하는만큼 사용할 수 있는 기능은 제한적이다. 이 파일 디스크립터로 교환할 수 있는 값은 1 이상의 64비트 정수 하나가 전부라 데이터 전송보다는 이름처럼 프로세스간에 event를 전달하는 용도로 사용한다. 1. eventfd(uint64 initval, int flag) 프로세스들끼리 통신 할 수 있는 파일 디스크립터를 만드는 함수다. 종료후에는 채널로 사용..
-
workqueue 사용법개발/컴퓨터사이언스 2018. 7. 16. 20:30
workqueue를 사용하는 작업은 크게 queue와 work를 만들고 작업을 스케줄 하는 것으로 나뉜다. 1. Queue 생성 workqueue도 이름에서 짐작 할 수 있듯이 queue이기 때문에 자료구조시간에 지겨울 정도로 봤던 queue를 만들어야 한다. 하지만 push나 pop처럼 queue를 사용하는 함수 API까지 만들어줄 필요는 없고 내가 짓고 싶은 Queue의 이름만 하나만 생각하고 생성 매크로만 호출하면 된다 #define create_workqueue(name) \ alloc_workqueue("%s", __WQ_LEGACY | WQ_MEM_RECLAIM, 1, (name))리턴인자는 workqueue_struct * 다. 이 포인터를 이용해서 queue에 넣는 작업을 할 수 있다. 2..
-
tasklet 사용법개발/컴퓨터사이언스 2018. 6. 17. 09:48
tasklet을 사용하는 과정은 tasklet을 생성하는 작업과 스케줄하는 작업으로 구분된다. 1. tasklet 생성 include/linux/interrupt.h 라는 파일을 보면 tasklet_struct 라는 구조체가 존재한다. 구조체 내의 속성 값을 입력해서 tasklet이 수행할 작업을 설정 할 수 있는데 일일이 속성 값을 호출할 필요는 없이 tasklet_init 이라는 함수를 이용해서 간단히 선언 할 수 있다.// include/linux/interrupt.h struct tasklet_struct { struct tasklet_struct *next; unsigned long state; atomic_t count; void (*func)(unsigned long); unsigned lo..
-
tasklet과 workqueue의 차이점개발/컴퓨터사이언스 2018. 6. 15. 20:04
커널 내의 코드를 짜다보면은 특정 작업을 다른 CPU에서 처리해야 하기도하고 어떤 작업은 몇미리 후에 처리 할 필요가 있는데 이런 경우 리눅스 커널에서는 tasklet과 workqueue라는 API를 사용해서 간단히 해결 할 수 있다. booklet, piglet 단어처럼 기존보다 작은 단위를 표현 할 때 let을 쓴다는 점으로 추측해볼 때 tasklet은 작은 일을 처리할 때 사용하는것 같고 같은 논리로 workqueue는 접미사로 queue가 있다는 점에서 미루어보아 작업(work)을 queue에 넣어서 처리하는 API인 것 같다. tasklet과 workqueue 모두 특정 작업을 미룰 수 있다는 점에선 동일하나 동작하는 매커니즘은 다르다. 먼저 tasklet은 softirq를 이용해서 동작한다. ..
-
ARM64 리눅스 부팅 초기 어셈블리 코드 분석(head.S) (2/2)개발/컴퓨터사이언스 2018. 1. 27. 17:18
앞 포스팅에서 다루지 못한 부분들을 마저 분석해보자. 처음에는 ARM 어쎔 코드도 생소했고 Exception Level 개념도 없어 많이 헤맸는데 이젠 어느정도 훈련도 되어 있고 앞에서 했던 것들 보다 내용 도 적을 뿐만 아니라 상대적으로 익숙한 작업들이라 쉽다. 4. setup_boot_mode_flag set_cpu_boot_mode_flag: adr_lx1, __boot_cpu_mode cmpw0, #BOOT_CPU_MODE_EL2 b.ne1f addx1, x1, #4 1:strw0, [x1]// This CPU has booted in EL1 dmbsy dcivac, x1// Invalidate potentially stale cache line ret 현재 실행 되고 있는 cpu의 Excepti..
-
ARM64 리눅스 부팅 초기 어셈블리 코드 분석(head.S) (1/2)개발/컴퓨터사이언스 2018. 1. 17. 23:54
최근에 ARM 64bit 리눅스의 초기 부팅 어셈블리 코드(arch/arm64/kernel/head.S)를 분석할 일이 있었다. 학교 다닐 때 x86 어셈블리로 코딩을 해본적도 있고 예전에 ARM 32bit miniOS 초기 부분도 분석해본 경험이 있어서 금방 할 줄 알았는데... ldr 같은 기본적인 명령어도 오랜만에 보니 생소했고 ARM 64bit만의 고유한 레지스터가 있어 레퍼런스를 뒤적거리면서 찾게 되다 보니 생각보다 오랜 시간이 소요됐다. ARM32와 ARM64가 원래 겹치는 영역이 별로 없는건지 아니면 내 머릿속에 남아 있는게 별로 없어서 겹칠게 없어진건지. 고생한 만큼 쉽게 잊혀질 수 있기 때문에(응?) 포스트로 이번에 공부한 내용들을 짧게나마 정리해보려한다. 1. ENTRY(stext) E..
-
입출력제어(ioctl)개발/컴퓨터사이언스 2017. 2. 11. 13:10
리눅스는 크게 시스템 영역(kernel)과 사용자 영역(user space)을 분리해서 악의적으로 만든 사용자 애플리케이션이 시스템 핵심 영역에 침범 할 수 없도록 만들어졌다. 하지만 애플리케이션을 개발하다보면 커널 영역내에 있는 함수들을 사용해야 할 일이 있는데 이런 경우 커널에서는 기본적으로 시스템 콜을 이용해 커널영역에 있는 함수들을 사용 할 수 있도록 지원한다. 하지만 시스템 콜은 기껏 해야 300개 정도 등록 할 수 있는데 모든 사용자 애플리케이션이 시스템 콜에 필요한 함수를 등록하기엔 수가 부족하다. 이때 사용 할 만한 툴이 ioctl이다. ioctl은 유저영역에 있는 애플리케이션이 현재 동작 중인 드라이버에 값을 전달하거나 받아 올 수 있도록 한다. 동작 과정을 간단히 그림으로 설명해보면 다..
-
디바이스트리(Device Tree)개발/컴퓨터사이언스 2017. 1. 4. 19:07
운영체제(Operating System)가 하드웨어와 소프트웨어 사이의 중간자 역할을 하고 사용자의 애플리케이션이 하드웨어를 조작하기 쉬운 환경을 제공 한다는 것은 컴퓨터 전공자라면 운영체제 수업시간에 귀가 빠지도록 배웠을 것이다. 운영체제는 오드로이드, 아두이노, 주노보드처럼 다양한 보드 위에 있는 RAM, CPU, EMMC등 하드웨어들을 초기화 및 조작하는 역할을 한다. 지금 이 글을 쓰기 위해 타자를 치는 동안 운영체제는 타자 입력 인터럽트를 처리하고 소프트웨어에 전달하는 일을 계속 하고 있다. 어떤 메인 보드를 사용하더라도 운영체제의 기본 뼈대는 동일해야 한다. 하지만 메인 보드들마다 상세 하드웨어 스펙은 천지 차이다. 예를 들면 RAM의 크기나 USB의 물리 주소의 위치처럼 당연한 것 부터 이 ..