[커널 17차 4조] 3주차

2020.09.07 20:07

주영 조회 수:138

일시 : 2020.09.05

 

장소 : 온라인 스터디 (줌)

 

교재 : 리눅스 커널 내부구조 (백승재, 최종무 저)

 

진행 : 6.2 시스템 호출 처리 과정(P.171) ~ 8 디바이스 드라이버 (p.231)

 

참석자

 

15:00 ~ 18:00 11명 (김주영, 김동혁, 김주성, 한가윤, 유정우, 이경재, 최왕용, 김은영, 정현선, 김영석, 김석원)

19:00 ~ 22:00 9명 (김주영, 김동혁, 김주성, 한가윤, 이경재, 김은영, 정현선, 김영석, 김석원 )

 

 

질문, 토론

 


1. 라이브러리에서 idt offset과 sys_call_table 인덱스를 알고 있어야 올바른 시그템콜  호출이 가능해 보인다. 따라서 라이브러리 구현 시 커널 버전에 의존성이 있어 보이는데 맞을까요?
- 기존에 대해서는 굳이 라이브러리가 바뀔 필요가 없다. 새로 생긴 시스템콜에 대해서 호환성을 위해 남겨둘 것이다.

 

2. 트랩이란 무엇인가.

- 6.1절 참조

 

3. 새로운 시스템 호출을 만들 때 항상 318번이어야 하는가. 
- 커널 버전에서 달라질 것이다. 아키텍처에 따라선 같을 수도 달라질 것이다. (Arm, intel 등) 아키텍처 디팬던트한 시스템콜이 있지 않을까, 실제론 코드를 확인해 봐야한다.

 

4. 0x80이 의미하는 건?
- 특별하게 msb를 부여하지 않았을까. (추측)

 

5. copy_to_use 말고 직접 대입할 수 있을까?
- 즉, Res user 공간 주소 그 주소에 바로 값을 넣을 수 있을까? kernel에서 바로 넣는 게 아니라 copy_to_use를 이용해서 넣는다. 커널에서 메모리 접근 시 페이지 테이블이 필요하다.  
따라서 매핑 -> 복사 -> 해제 이렇게 동작할 것이다. 바로 쓰는건 불가능할 것이다. 참고로 arm에서는 변한다 사용자 주소-> 커널 주소. 

 

6. intel에서 asmlinkage가 아무것도 안 하는 건 아니다. x86에서 파라미터를 레지스터로 넘기지 않고 스택으로 옮긴다. (호출 규약)

 

7. 메시지 등급이란? 
- 번호가 낮을수록 중요하다. 커널 로그 레벨보다 같거나 낮은 것에 대해서 출력한다. 커널 인자로 레벨을 줄 수 있으며 디큐를 할 때 확인한다. 레벨보다 클 경우 화면에 쏘지 않고 다른 곳에 저장된다. 

 

8. 그림 7.2 makefile에서 module dir이 없는 이유 
- 커널 디렉터리, 모듈 디렉터리 디폴트로 있을 것이다. 아마 상속받았을 것이다. 전체가 아닌 일부일 것이다.

 

9. 194쪽 locat_sys_call_table에서 주소 구간은 어떻게 선정되었는가
- https://github.com/torvalds/linux/blob/master/Documentation/x86/x86_64/mm.rst

 

10. 그림 7.4 cr0가 read_cr0, write_cr0 read_only를 write로 수정해서 Get pageable 없이 바로 읽어도 되는지
- cr 레지스터. 페이지 테이블에 비트를 하나 바꾸면 write가 불가능해도 무시하고 write 가능하게 해준다. Permit 무시. 위험한 명령어.
 
11. Ins mod -> Unresolvec symbol xxx 문제에서 ko 파일은 relocatable elf인지 excutable elf인지. 
- Elf 포맷을 executable으로 메모리 적재 ins mod 그 이후 심볼을 링킹한다.

 

12. 217 페이지 코드는 불안정하다. mkdrv_major 변수가 없다.

 

13. udev에서 class create() 함수와 device_create() 함수와의 관계는?

 

14. MYDRV_MAX_LENGTH 가 4096으로 할당되었다. 제한이 있을까?
- 페이지 크기보다 작아야 할 것이다.

 

15. alloc_chrdev_regin 함수는 주번호를 첫 번째 인자에 반환한다.

 

16. bio_for_each_segment() 매크로 사용법은?
- https://21crt.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%99%80-%EB%B8%94%EB%A1%9D-%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4

 

17. p.228 코드에서 mydrv_open과 mydrv_release는 아무것도 하지 않는다. 사용하지 않지만 block_device_operations 구조체를 위해 할당한다.(그림 8.4)

 

XE Login