데비안 11로 업데이트 후 에러로 docker를 실행할 수 없다. 인터넷에 역시 해결 방법이 있었다. /etc/fstab에 기록하면 된다. https://waspro.tistory.com/556 docker root directory 변경 https://fliedcat.tistory.com/113
docker cgoup issue
데비안 11로 업데이트 후 에러로 docker를 실행할 수 없다. 인터넷에 역시 해결 방법이 있었다. /etc/fstab에 기록하면 된다. https://waspro.tistory.com/556 docker root directory 변경 https://fliedcat.tistory.com/113
모듈을 로딩하면 kernel thread부터 만들어야 한다. 같은 책 초반에 나왔는데, 다시 보니 기억할 수 없다. 스레드를 만든 후 함수와 데이터를 넘겨야 하는데, 데이터가 void 포인터다. struct로 캐스팅 하고 싶은데, 에러가 났다. kernel 코드를 보고 괄호를 몇 번 붙였다. 아! ㅅㅂ. 구글 찾아보기보다 시(간)성비가 더 좋다. spinlock을 만든 후 초기화 하지 않으면, 사용할 수 없다. kernel에 […]
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
리눅스가 work queue를 다양하게 사용한다. 나는 초짜라 DECLARE_WORK와 INIT_WORK를 구분할 수 없었다. DECLARE_WORK가 work struct를 전역 변수로 선언한다. 여러 work로 같은 데이터에 접근할 수 있다. workqueue funtion() 파라미터로 work struct를 넣는데, 여기로 work를 전달하면 된다. 코드가 넝마조각이 되고 있다. 모듈을 로딩하고 인터럽트를 만들면 schedule_work로 등록한 workqueue_fn을 실행한다. 파일을 오픈하면 같은 데이터를 다른 work로 index를 접근할 […]
tasklet을 배우고 실습하다 보니, 캐릭터 디바이스를 활용한 예제를 찾았다. 하다보니 강제로 character device를 등록, 열고, 닫고, 읽고, 쓰는 방법을 배웠다. 대충 이해한 다음 아래 동작을 구성했다. read: 앞쪽부터 읽음. write: 데이터가 있다면 뒤로 채워 넣음. 인터럽트: gpio를 시물레이션하여 앞에서 한 글자씩 지움. 버퍼 용량은 char 256개 사용. 전에 사용한 파일을 수정했고, 모듈을 만들기 위한 makefile을 […]