모듈 / 빌딩 / 제작 / 테스트 / POC / 리허설 / 노트 / 면책 / 라이센스 / 책 / 링크
LKM (Linux Kernel Module) 샌드 박스는 Linux 커널 모듈의 개발을 배우고, 발견하고 실험 할 수있는 다양한 모듈의 모듈입니다. 이 저장소의 목적은 Linux 커널 내에서 개발을 연습하고 기타 개념을 연구하기 전에 첫 번째 패치를 커널에 제출하기 전에 기타 개념을 연구하는 것입니다.
대부분의 모듈은 하나의 개념을 보여주고 커널 API를 사용하는 방법을 보여줍니다. 몇 가지 모듈은 하나 이상의 개념을 결합하여 개념이 어떻게 작동하는지 제시합니다. 예를 들어, 모듈 LKM_DEVICE는 문자 장치에 액세스하고 /Proc에 주요 번호를 저장하고 있습니다. 또는 모듈 LKM_MEM은 /Proc의 파일별로 메모리 /스왑 정보를 노출시키고 있습니다.
Linux 커널에 접근하려는 다른 개발자에게는 가치가 있기를 바랍니다.
| 아니요. | 기준 치수 | 원천 | 설명 |
|---|---|---|---|
| 1 | LKM 디버그 | lkm_debugfs.c | 디버깅 파일 시스템 디버그를 사용하는 방법을 보여주는 모듈 |
| 2 | LKM 장치 | lkm_device.c | 문자 장치로 작동하는 방법과 /Proc에 장치 정보 저장 방법을 보여주는 모듈 |
| 3 | LKM 장치 번호 | lkm_device_numbers.c | 통계적으로 동적으로 할당 된 장치 번호를 설명합니다 |
| 3 | LKM 메모리 | LKM_MEM.C | 메모리 노출 메모리 및 정보 교환 /Proc |
| 4 | LKM 메모리 기반 장치 | LKM_MEV.C | Scull을 기준으로 메모리 기반 문자 장치의 드라이버, Linux Device Drivers, 3 장에서 개발되었습니다. |
| 5 | LKM 매개 변수 | lkm_parameters.c | 사용자- 커널 공간으로 매개 변수를 전달하기위한 모듈 |
| 6 | LKM Pretty Printk | LKM_PP.C | Pretty-Printk의 통합 테스트 모듈 |
| 7 | LKM Proc | LKM_PROC.C | 순차적 I /O를 사용한 모듈 액세스 /Proc 파일 시스템 |
| 8 | LKM 프로세스 | lkm_process.c | 현재 프로세스 정보 액세스 및 인쇄 |
| 9 | LKM 샌드 박스 | lkm_sandbox.c | 다양한 실험을위한 샌드 박스 모듈 |
| 10 | LKM 골격 | lkm_skeleton.c | 새로운 모듈의 더 빠른 스캐 폴딩을위한 골격 모듈 |
처음으로 복제 할 때 --recurse-submodules 로 서브 모듈을 복제하여 꽤 프린트를 얻으십시오.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
기본 하중/언 로딩 및 모든 추가 개념 테스트를 포함하여 사용 가능한 모든 테스트를 실행하려면 ..
make test커널 링 버퍼로드, 언로드 및 출력으로 테스트합니다 (Sudo는 루트 권한을 요구합니다).
make test-module name= < module-name > 로드 모듈, /Proc에서 주요 장치 번호 수집, 장치 생성 및 최종 메시지 비교를 포함한 샌드 박스 장치에 대한 추가 테스트는 make test-device 로 MakeFile 대상을 실행하거나 다음 명령을 실행합니다.
캐릭터 장치를 만들려면 주요 번호가 필요하며 파일 /Proc /LKM_DEVICE_MAJOR를 촉구하여 얻을 수 있습니다. 이 주요 번호는 커널 링 버퍼에도 기록됩니다. 모듈 매개 변수 param_major_num을 사용 하여이 주요 숫자를 제공하고 sudo insmod lkm_device.ko param_major_num=241 과 같은이 모듈을로드 할 수 있습니다 (이 순간 에이 정적 할당은 신뢰할 수없는 것으로 보입니다. 샌드 박스 장치의 등록이 실패했을 때의 전공이 발생하지 않았을 때, 샌드 박스 장치의 등록이 발생하지 않았습니다.
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device 로드 모듈을 포함하여 /Proc에 대한 샌드 박스 액세스에 대한 추가 테스트, 내부 /Proc가 존재하는 경우 파일 테스트 및 해당 파일을 출력합니다. make test-proc 또는 다음 몇 가지 명령으로 MakeFile Target Test Proc을 실행하십시오.
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc 매개 변수를 모듈로 전달하기위한 추가 테스트의 경우 LKM_Parameters는 make test-parameters 와 함께 MakeFile 대상 테스트 패러머 미터를 실행합니다. 이렇게하면 모듈을로드/언로드하고/sys 파일 시스템 (/sys/module/lkm_parameters/parameters/*)에서 읽은 값으로 모듈을로드 할 때 전달 된 매개 변수 번호와 메시지를 비교합니다. 또는 다음 명령을 실행하십시오.
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parameters버그 및 문제를 해결하고 디버깅하고 작업하는 동안 일부 코드를 실험하고 일부 진술을 증명하거나 질문에 대답하기 위해 POC를 작성하는 데 유용 할 수 있습니다. 다음은 내가 최근에 나온 진술, 아이디어 및 질문을 증명하기 위해 리드를 후속하는 POC의 모음이 있습니다.
| 파일 | 설명 | 동기 부여 |
|---|---|---|
| 비교 -iopl-ioperm.c | IOPL과 IOPERM이 부여한 I/O 권한 비교 | 버그 205317 -IOPL (2) - 권한 수준은 프로세스 당 또는 스레드 당 설정됩니까? |
| 권한-반사 .c | 클론, 포크, 실행 또는 pthread를 사용할 때 I/O 권한은 어떻게 부여됩니까? | 버그 205317 -IOPL (2) - 권한 수준은 프로세스 당 또는 스레드 당 설정됩니까? |
커널 스페이스의 개념을 더 잘 이해하려면 C와 표준 라이브러리의 기본 기본 사항을 검토하고 연습해야합니다. 이해를 향상시킬 수 있다는 것은 접근법을 비교할 수 있습니다. 이러한 기본의 대부분은 파일 I/O부터 시작하여 동반자 소스로 볼 수 있습니다. 물건을 연습하는 것은 결코 나쁘지 않지만 때로는 그런 것들을 연습해야한다는 것을 인정하는 것은 때로는 약간 당황 스럽습니다. :)
| 파일 | 개념 |
|---|---|
| 클론 .C | 클론 ()로 클로닝 프로세스 |
| execve.c | execve ()로 다른 프로세스 실행 |
| 포크 | 포크 ()로 아동 프로세스 생성 |
| io_ports.c | 저수준 포트 매핑 I/O 작업 |
| read.c | 바닐라에서 파일 읽기 c |
| Simple_circular_buffer.c | 간단하고 간단한 원형 버퍼 |
| 쓰기 .c | 바닐라의 쓰기/추가 c |
해당 파일을 빌드하려면 make clean && make IN ./rehearsals/ 그리고 모든 실행 파일이 빌드 디렉토리에 배치됩니다.
"Linux 커널 모듈은 Linux 커널에 직접 삽입되는 컴파일 된 바이너리 코드이며 X86–64 프로세서에서 가장 낮고 가장 보호 된 실행 링 인 Ring 0에서 실행됩니다."
"전통적인 애플리케이션 개발 패러다임은 크게 폐기 될 수 있습니다. 모듈의로드 및 언로드를 제외하고는 순차적 인 패턴으로 작동하지 않고 시스템 이벤트에 응답하는 코드를 작성하게됩니다."
"커널 개발을 통해 응용 프로그램 자체가 아닌 API를 작성하고 있습니다."
Linux/GNU 시스템에서 모듈을로드/언로드 및 파일에 액세스하는 것과 같은 특정 작업이 루트 권한에 의존하기 때문에이 저장소는 루트 권한을 요청합니다. Makefile은 이러한 권한이 사용되는 내용에 대해 미리 명시합니다.
Sudo 의이 저장소를 검색 하여이 모든 작업을 검토하고 어떤 식 으로든 잘못 사용되지 않도록 할 수 있습니다. 나는 이것이 보안 문제 일 수 있다는 것을 알고 있지만,이 과정을 가능한 한 투명하게 만들려고 노력하고 있습니다. 그러나 이러한 모듈은 보증없이 제공됩니다. 커널 패닉 및 데이터 손실이 발생할 수 있습니다. 가상 시스템 내부에서 사용하십시오.
다음에는 Sudo가 사용되는 모든 위치가있는 테이블이 있습니다 (readme.md 제외).
grep -n -r " sudo " *| 파일 : 줄 | Sudo의 사용 |
|---|---|
| Makefile : 118 | |
| Makefile : 119 | $ (평가 번호_file_content = sudo cat $(number_file) ) |
| Makefile : 122 | |
| Makefile : 123 | |
| Makefile : 126 | @sudo rmmod $ (module_filename) |
| Makefile : 140 | @sudo mknod $ (device_filename) c cat $(proc_filename) 0 |
| Makefile : 143 | @sudo rm $ (device_filename) |
| Makefile : 144 | @sudo rmmod $ (module_filename) |
| Makefile : 162 | @sudo rmmod $ (module_filename) |
| Makefile : 175 | @sudo mknod |
| Makefile : 176 | @echo "테스트"| sudo tee $ (device_file) |
| Makefile : 178 | @sudo rm -fv $ (device_file) |
| Makefile : 179 | @sudo rmmod $ (모듈) |
| Makefile : 190 | @Sudo Insmod |
| Makefile : 193 | @sudo rmmod $ (모듈) |
| Makefile : 207 | @sudo rmmod $ {module} |
| Makefile : 219 | @sudo insmod $ (module) .ko |
| Makefile : 222 | @sudo rmmod $ (모듈) |
| tests.mk:31 | @lsmod | awk '{print $$ 1}'| grep -qe "^$ (1) $$"&& (sudo rmmod |
| tests.mk:75 | @Sudo DMESG -Clear |
| tests.mk:78 | @sudo rmmod $ (1) |
LKM Sandbox는 무료 소프트웨어입니다. Free Software Foundation, 라이센스의 버전 2 또는 이후 버전에서 게시 한 GNU 일반 공개 라이센스의 조건에 따라 재분배 및/또는 수정할 수 있습니다.
LKM 샌드 박스는 유용하지만 보증이 없다는 희망으로 배포됩니다. 상업성 또는 특정 목적에 대한 적합성에 대한 묵시적 보증조차 없습니다. 자세한 내용은 GNU 일반 공개 라이센스를 참조하십시오.
LKM 샌드 박스와 함께 GNU 일반 공개 라이센스 사본을 받았습니다. 그렇지 않은 경우 https://www.gnu.org/licenses/를 참조하십시오.