저자가 디버깅, 커널을 강조하다보니, 제목이 너무 길어졌다. 다행히 초심자가 쉽게 이해할 수 있는 내용이다. 책 2권이다 보니 사기 아까웠지만, 읽고나면 살만한 책이다. 이 책이 자세하게 설명하여 커널이 어떻게 동작하는지 알 수 있다. 내용이 인터넷에도 있겠지만, 내가 찾는 수고를 저자가 했고, 틀린 내용을 저자가 걸러줬다. 이렇게 보면 지출할 만한 가격이다.
20년 전 리눅스를 시작하려 해도 괜찮은 책, 문서가 없었다. 그 시절 인터넷도 잘 발달되지 않아 따라 하기 어려웠다. 커널 구조, 동작 방식을 설명하는 책도 찾기 어려웠고, 파편화 된 영문 문서를 종합하여 이해할만한 시간, 능력, 의지도 없었다. PC 성능도 낮아 한번 커널 컴파일하면 4시간 정도 걸렸다. 커널 패닉에 닥치면 어떻게 해결할지 막막했다. 지금같이 휴대폰으로 찾아볼 수 없다보니. 진심이 아닌 취미로 접근하기 너무나도 어려웠다.
다행히 시대가 변해 성능좋고 값싼 하드웨어를 쉽게 구할 수 있다. 이 책과 같은 좋은 교재로 짧은 시간에 익힐 수 있다. 커널에서 지원하는 디버그 툴이 함수 호출 내역을 표시한다. 인터넷도 발달되어 남이 작성한 문서를 쉽게 찾고, 사용할 수 있다. 의지만 있다면 과거 5년 학습 결과를 지금 6개월에 달성할 수 있어 보인다.
책 차례를 보면 커널을 어떻게 접근할지 보인다. OS 기본이 프로세스이므로 task descriptor에서 시작한다. 인터럽트 또한 중요하여 다음에 있다. softirq, workqueue도 인터럽트 다음으로 쉽게 알 수 있다. 2권을 보면 그 외 타이머, 동기화, 스케줄러 등 기본 지식을 학습할 수 있다.
책을 읽고 나면 커널을 쉽게 접근할 수 있고, 남이 작성한 문서를 이해할 수 있다는 자신감-실력이 아닌-을 갖는다. IoT 시대를 대비할 수 있는 지금 배우지 않을 이유가 없다. ON/OFF 스위치를 만들더라도 인터넷도 되고, 터치 패드 있는 제품이 뽀대 난다. 얼마인지 모르겠으나 정말 있다!! 수화물 5kg를 희생하여 미국까지 들고 온 보람있다.
나온 지 10년 된 다큐를 유투브로 볼 수 있다.한시간을 보면 방글라데시 치타공 선박 해체 노동자가 어떻게 살아가는지 알게된다. 아동 노동, 위험한 작업 환경, 치명적인 석면 취급 등 인권 문제를 제기할 수 있다. 그러나 치타공 선박 해체 노동자가 방글라데시 내 다른 업종보다 돈벌이가 좋다고 말하기 때문에 단순하게 생각할 수 없다.
현실적으로 사업주가 인권을 보장하지 못하니, 인권 단체가 폐선 해체 사업을 접으라 할 수 없다. 이미 국가는 인권 개선 의지도 없어 보이고, 인권 단체가 국가에 어떤 압력을 행사할 수 있을까. 환경단체가 폐선에서 유출되는 기름으로 환경을 파괴한다고 문제를 제기할 수 있다. 만약 방글라데시가 폐선 사업을 접는다면 그 많은 배들을 수장시켜야 한다는데, 이런 노답을 환경 단체가 어떻게 받아들일 지 모르겠다. 치타공에서 해체되는 선박 재활용율이 100%이고, 87%의 철을 방글라데시에 공급한다 한다. 사람을 갈아 넣는 환경 친화적 사업이다. 원론적으로 접근하면 아무런 해결책도 안보인다.
내 생각에는 국가가 나서 인권을 개선해야 한다. 이래서 정책이 중요하다. 산업 현장에서 죽거나 다치는 사람이 없도록 감시해야 한다. 방글라데시 빈부 격차를 줄여 치타공 노동자가 막장에서 일 하지 않도록 해야 한다. 국제 기구에 압력을 행사?하여 선박주가 폐선 비용을 더 지불 할 수도 있다. 제조 시점에 폐선 비용을 포함시킬 수 있다. 안타깝게도 지금 자본주의 환경에서는 환경, 인권 문제를 제대로 해결할 수 없다.
이건 내 생각이고, 다큐 마지막에 노동자가 치타공에서 일해 행복하다고 한다. 여러 생각할 거리를 던저준 KBS가 아닌 박봉남 PD에게 감사하다. 인생은 운빨이라는데, 방글라데시가 아닌 한국에서 태어나게 해 준 부모님께, 쉬는 날 호텔방에서 시간을 준 회사에 감사하다.
모듈을 로딩하면 kernel thread부터 만들어야 한다. 같은 책 초반에 나왔는데, 다시 보니 기억할 수 없다. 스레드를 만든 후 함수와 데이터를 넘겨야 하는데, 데이터가 void 포인터다. struct로 캐스팅 하고 싶은데, 에러가 났다. kernel 코드를 보고 괄호를 몇 번 붙였다. 아! ㅅㅂ. 구글 찾아보기보다 시(간)성비가 더 좋다.
[146685.757495] [=]236-0, was allocated
[146685.757504] [=]driver was initialized
[146685.757960] [=]irq 54 was assinged
[146685.757984] [=]module was installed
[146685.757991] 14638325: timer was setup
[146686.818385] 14638432: timer function was activated
[146686.818398] index is 1
[146687.858398] 14638536: timer function was activated
[146687.858402] index is 2
[146688.898415] 14638640: timer function was activated
[146688.898428] index is 3
[146689.938432] 14638744: timer function was activated
[146689.938445] index is 4
[146690.978452] 14638848: timer function was activated
[146690.978457] index is 5
[146692.018469] 14638952: timer function was activated
[146692.018483] index is 6
[146693.058494] 14639056: timer function was activated
[146693.058500] index is 7
[146694.098512] 14639160: timer function was activated
[146694.098548] index is 8
[146695.138529] 14639264: timer function was activated
[146695.138563] index is 9
[146696.178545] 14639368: timer function was activated
[146696.178573] index is 10
[146697.218575] 14639472: timer function was activated
[146697.218607] index is 11
[146698.258571] 14639576: timer function was activated
[146698.258587] index is 12
리눅스가 work queue를 다양하게 사용한다. 나는 초짜라 DECLARE_WORK와 INIT_WORK를 구분할 수 없었다. DECLARE_WORK가 work struct를 전역 변수로 선언한다. 여러 work로 같은 데이터에 접근할 수 있다. workqueue funtion() 파라미터로 work struct를 넣는데, 여기로 work를 전달하면 된다. 코드가 넝마조각이 되고 있다.
[ 52.456926] [=]236-0, was allocated
[ 52.456935] [=]driver was initialized
[ 52.457621] [=]irq 54 was assinged
[ 52.457693] [=]module was installed
[ 68.542830] workqueue scheduled
[ 68.542855] Executing workqueue function
[ 68.542866] index is 1
[ 69.549436] workqueue scheduled
[ 69.549460] Executing workqueue function
[ 69.549466] index is 2
[ 70.552638] workqueue scheduled
[ 70.552659] Executing workqueue function
[ 70.552663] index is 3
파일을 오픈하면 같은 데이터를 다른 work로 index를 접근할 수 있다. schedule_work(&work_ptr->work_read)를 디바이스를 읽을 때마다 실행한다.
[ 86.495196] Deviced file was opend.
[ 86.495242] Deviced file was closed.
[ 91.476276] Deviced file was opend.
[ 91.476318] start 9f3ac859, offset is 0, read_len is 5
[ 91.476327] kernel has 5, read 5 characters from kernel
[ 91.476367] opened, index is 4
[ 91.476430] Deviced file was closed.
[ 105.664089] Deviced file was opend.
[ 105.664138] start 9f3ac859, offset is 0, read_len is 5
[ 105.664149] kernel has 5, read 5 characters from kernel
[ 105.664197] opened, index is 5
[ 105.664275] Deviced file was closed.