데비안 11로 업데이트 후 에러로 docker를 실행할 수 없다. docker: Error response from daemon: cgroups: cgroup mountpoint does not exist: unknown. ERRO[0000] error waiting for container: context canceled 인터넷에 역시 해결 방법이 있었다. I ran into similar issue found a temp fix on another place. Temp fix: sudo mkdir /sys/fs/cgroup/systemd sudo mount -t cgroup -o…… docker cgoup issue 계속 읽기
[카테고리:] 생활코딩
spinlock, mutex 실습
모듈을 로딩하면 kernel thread부터 만들어야 한다. 같은 책 초반에 나왔는데, 다시 보니 기억할 수 없다. 스레드를 만든 후 함수와 데이터를 넘겨야 하는데, 데이터가 void 포인터다. struct로 캐스팅 하고 싶은데, 에러가 났다. kernel 코드를 보고 괄호를 몇 번 붙였다. 아! ㅅㅂ. 구글 찾아보기보다 시(간)성비가 더 좋다. pi@raspberrypi:~/linux $ grep -wn “kthread_create” -r ./drivers ./drivers/usb/usbip/usbip_common.h:285: = kthread_create(threadfn,…… spinlock, mutex 실습 계속 읽기
timer 실습
kernel timer를 실습했다. callback 함수 argrument로 timer를 가지고 있는 구조체 데이터를 전달할 수 있다. work queue와 같은 방식이다. 커널 특정 버전부터 이런 식으로 변경되었는 듯 하다. 타이머가 만료되면 다시 등록하도록 했다. #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/gpio.h> //GPIO #include <linux/cdev.h> #include <linux/device.h> #include <linux/uaccess.h> #include <linux/fcntl.h> #include <linux/timer.h> #include…… timer 실습 계속 읽기
workqueue 실습
리눅스가 work queue를 다양하게 사용한다. 나는 초짜라 DECLARE_WORK와 INIT_WORK를 구분할 수 없었다. DECLARE_WORK가 work struct를 전역 변수로 선언한다. 여러 work로 같은 데이터에 접근할 수 있다. workqueue funtion() 파라미터로 work struct를 넣는데, 여기로 work를 전달하면 된다. 코드가 넝마조각이 되고 있다. #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/gpio.h> //GPIO #include <linux/cdev.h> #include…… workqueue 실습 계속 읽기
character device를 tasklet으로 테스트
tasklet을 배우고 실습하다 보니, 캐릭터 디바이스를 활용한 예제를 찾았다. 하다보니 강제로 character device를 등록, 열고, 닫고, 읽고, 쓰는 방법을 배웠다. 대충 이해한 다음 아래 동작을 구성했다. read: 앞쪽부터 읽음.write: 데이터가 있다면 뒤로 채워 넣음.인터럽트: gpio를 시물레이션하여 앞에서 한 글자씩 지움.버퍼 용량은 char 256개 사용. 전에 사용한 파일을 수정했고, 모듈을 만들기 위한 makefile을 그대로 사용했다. #include…… character device를 tasklet으로 테스트 계속 읽기