카테고리
생활코딩

docker cgoup issue

데비안 11로 업데이트 후 에러로 docker를 실행할 수 없다. 인터넷에 역시 해결 방법이 있었다. /etc/fstab에 기록하면 된다. https://waspro.tistory.com/556 docker root directory 변경 https://fliedcat.tistory.com/113

카테고리
생활코딩

spinlock, mutex 실습

모듈을 로딩하면 kernel thread부터 만들어야 한다. 같은 책 초반에 나왔는데, 다시 보니 기억할 수 없다. 스레드를 만든 후 함수와 데이터를 넘겨야 하는데, 데이터가 void 포인터다. struct로 캐스팅 하고 싶은데, 에러가 났다. kernel 코드를 보고 괄호를 몇 번 붙였다. 아! ㅅㅂ. 구글 찾아보기보다 시(간)성비가 더 좋다. spinlock을 만든 후 초기화 하지 않으면, 사용할 수 없다. kernel에 […]

카테고리
생활코딩

timer 실습

kernel timer를 실습했다. callback 함수 argrument로 timer를 가지고 있는 구조체 데이터를 전달할 수 있다. work queue와 같은 방식이다. 커널 특정 버전부터 이런 식으로 변경되었는 듯 하다. 타이머가 만료되면 다시 등록하도록 했다. https://embetronicx.com/tutorials/linux/device-drivers/using-kernel-timer-in-linux-device-driver/ https://stackoverflow.com/questions/14953871/how-to-pass-custom-argument-to-linux-timers-function

카테고리
생활코딩

workqueue 실습

리눅스가 work queue를 다양하게 사용한다. 나는 초짜라 DECLARE_WORK와 INIT_WORK를 구분할 수 없었다. DECLARE_WORK가 work struct를 전역 변수로 선언한다. 여러 work로 같은 데이터에 접근할 수 있다. workqueue funtion() 파라미터로 work struct를 넣는데, 여기로 work를 전달하면 된다. 코드가 넝마조각이 되고 있다. 모듈을 로딩하고 인터럽트를 만들면 schedule_work로 등록한 workqueue_fn을 실행한다. 파일을 오픈하면 같은 데이터를 다른 work로 index를 접근할 […]

카테고리
생활코딩

character device를 tasklet으로 테스트

tasklet을 배우고 실습하다 보니, 캐릭터 디바이스를 활용한 예제를 찾았다. 하다보니 강제로 character device를 등록, 열고, 닫고, 읽고, 쓰는 방법을 배웠다. 대충 이해한 다음 아래 동작을 구성했다. read: 앞쪽부터 읽음. write: 데이터가 있다면 뒤로 채워 넣음. 인터럽트: gpio를 시물레이션하여 앞에서 한 글자씩 지움. 버퍼 용량은 char 256개 사용. 전에 사용한 파일을 수정했고, 모듈을 만들기 위한 makefile을 […]