[커널20차] 10주차

2023.07.09 11:22

이경재 조회 수:90

2023.07.08 (10주차) - 약 22명 참여

 

head.S 분석 시작

 

Q: .quad란 무엇인가요?

A: 64bit 공간을 차지한다는 의미의 명령어 

driective라는 말로 표현된다.

 

Q: driective라는 것이 명렁라는 것을 의미하나요?

A: 미리 정해놓은 키워드, 어셈블리에서는 directive라고 부른다.

이렇게 해달라는 지시사항을 의미한다.

 

Q: 부트로더는 어디에 있는가

A: 처음에 설치할때 이미 있지만 그렇다고 내장은 아니며 수정할 수 있다

https://docs.google.com/document/d/1fdC3i05dx6vGbPjtSkRnCG-HAGI5r_Xnb2t1dhIPvxs/edit .

 

Q: head.S 를 프로토콜이 있는가?

A: 프로토콜이 있을 것으로 보여진다.

 부트로더와 커널사이의 교감

 

Q: #define __HEAD .section ".head.text","ax" 의 의미?

A: Elf 바이너리 안에 많은 섹션이 있는데, head.text와 ax는 이 섹션에 대한 플래그이다. A는 allocatable, x는 excutable을 뜻한다. 이 뒤에 오는 것들은 다 이 섹션에 들어가게 된다. 

.section 관련 syntax

https://developer.arm.com/documentation/100068/0612/migrating-from-armasm-to-the-armclang-integrated-assembler/sections

Q: 어떻게 이해하기 쉽지 않은  어셈블리 코드를 공부하셨는지? 공부 방식이 궁금합니다

A: 익숙해지는 것이 크다

창의성이나 그런것이 필요하지는 않고 익숙해지는 것이 중요하다 

 

리눅스 커널 심층분석

  • 책에서 소개되는 코드들이 오래되었다
    Bootlin을 가지고 코드를 타고 들어갈 수 있다

  • 처음에는 난잡하게 느껴지지만 책을 잡고 Bootlin을 따라가면 익숙해진다

  • https://elixir.bootlin.com/linux/latest/source 

ARM, assembly를 모르면 캐릭터들로 느껴진다. 아는지 모르는지 차이이기에 처음에 연습하는 것이 필요하다

e.g) C로 쓰여있는 If else문을  arm assembly로 변환하는 작업을 연습할수 있다


 

Q: 링커 스크립트란..??

A: 커널 바이너리를 빌드할 때, 컴파일 이후 바이너리에 대한 링킹을 어떻게 할 것인지를 알려주는 스크립트이다. 평소에 빌드할 때도 돌아가는 스크립트이다. 다만 일반적으로는 수정할 일이 없기에 디폴트로 사용하고 있다면 커널은 효율을 위해 각 섹션을 organize 해 놓은 것 같다.


 

Q: p primary_entry의 역할은?

A: 부드로더가 해당 명령어를 읽고 나서야, 아래의 명령어들을 차례대로 읽어 커널 바이너리에 대한 정보를 확인할 수 있다. 즉 부트고러다 반드시 접근하게 되는 커널 이미지 헤더.hekreSnxGwi_TgwOt_Ohnw5amNBUJ275CjE8YH-D

 

 

디버깅을 통해 배우는 리눅스 커널의 구조와 원리

3.1 디버깅이란

3.1.1 디버깅은 문제 해결 능력의 지름길

 

Q: p.79의 kernel/irq/manage.c 패치코드를 보면 __disable_irq() 함수와 __enable_irq() 함수의 매개변수가 두 개씩 있는 것 처럼 묘사되어 있으나 실제로 코드를 확인해보면 두 번 째 매개변수인 unsigned int irq는 정의되어있지 않다. (p.77의 중앙에 나와있는 코드 예시와 같이 struct irq_desc *desc만 매개변수로 갖고 있을 뿐) 그렇다면 이 패치코드는 어떻게 입력해야 하나? 함수 원형을 변경하는 것은 다른 코드와의 의존성을 생각하면 불가능 할 것 같다.

A: irq_desc_get_irq(desc) 이 함수로 바꾸면 될것 같습니다.

biRyTw_T6VJf9tXzXJVZOxH0gcyuygBt_sm7371u

 

Q: p.85 line27과 line30은 중복?

A:중복 맞음.

 

Q: p.86 irq_trace_ftrace.sh 실행 시 아래와 같은 에러 메시지와 함께 crash 발생. 

yKAg2sDcrQp9CaeV7igtN2rwfNsnMBzyqPepP7ri

irq_trace_ftrace.sh

Ko5QyMBI57j1I_eGeZKEPSYZjAKfoYqM6fVQkjjH

A:  /sys/kernel/debug/tracing/available_filter_functions  파일에 rpi_get_interrupt_info 함수 목록이 있는가를 확인해야 한다. 없다면 해당 함수명이 오타가 걸려 있는지 아니면 rpi_get_interrupt_info 함수 뒤에 EXPORT_SYMBOL(rpi_get_interrupt_info); 를 선언해 보자.

rpi_get_interrupt_info  함수 선언 앞에 noline을 집어 넣는다.

L_Bp2YuimJ_nv9klODZ8NCIvXSsyCgnPUPjAvtW4

 

 Q. 커널로그를 커널에 추가적으로  넣을 수 있는가

 A. 리눅스 자체에 로깅이 많아서 더 로그 생성을 넣지 않고도 할수 있다. 하지만 책에서의 79p에서 로그가 더 필요해서 디버깅 패치를 추가해서 로그를 별도로 만들어준다. 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 627
228 [커널 20차] 20주차 [2] 이민찬 2023.09.17 182
227 [커널 20차] 19주차 이민찬 2023.09.10 103
226 [커널 20차] 18주차 이민찬 2023.09.03 85
225 [커널 20차] 17주차 이민찬 2023.08.27 129
224 [커널 20차] 16주차 이민찬 2023.08.20 132
223 [커널 19차] 64 주차 Min 2023.08.19 91
222 [커널 20차] 15주차 이민찬 2023.08.13 126
221 [커널 19차] 63 주차 Min 2023.08.12 60
220 [커널 19차] 62 주차 Min 2023.08.05 79
219 [커널 20차] 13주차 이민찬 2023.07.30 107
218 [커널 19차] 61 주차 Min 2023.07.30 45
217 [커널 20차] 12주차 이민찬 2023.07.22 87
216 [커널 19차] 59 ~ 60 주차 Min 2023.07.22 37
215 [커널 18차] 113주차 kkr 2023.07.22 78
214 [커널20차] 11주차 이경재 2023.07.15 86
» [커널20차] 10주차 이경재 2023.07.09 90
212 [커널20차] 9주차 이경재 2023.07.02 85
211 [커널 19차] 58 주차 Min 2023.07.01 41
210 [커널 19차] 56 ~ 57 주차 Min 2023.06.25 40
209 [커널 18차] 109주차 kkr 2023.06.24 33
XE Login