리눅스커널 스터디 - 1주차(start_kernel)

Kim Minseok·2024년 3월 29일
0

커널 스터디 1주차에는 start_kernel 함수가 불러오는 과정을 간략하게 살펴보았고, 커널 공부에 도움이 되는 사이트를 여러개 찾아보았다. 공부한 내용 까지 전부 정리하면 좋을텐데, 시간의 압박으로 이번 주차에는 일단 살펴보았던 자료만 정리한다.

팀원분들이 좋은 자료를 많이 가져오신 덕분에 살펴볼 사이트들이 많았다.

리눅스 커널 소스

보통 리눅스 배포판을 설치하면, /usr/src에 커널의 소스를 일부 혹은 전부가 저장되어있다. 실제로 우분투 배포판을 뜯어보니 c코드는 없고 헤더파일하고 makefile이 존재했다. 일단 왜 커널 자신의 소스코드를 /usr/src에 저장하는건지 처음에 궁금했다. 아마도 뭔가 하드웨어에 맞는 커널을 빌드 makefile나 헤더 정보가 필요하기 때문이지 않을까 하는 생각이 들었다.

-> 그 추측이 얼추 맞았다. 다음 글에 따르면 헤더파일들은커널과 함께 동작하는 드라이버나 커널 모듈(?) 등을 쉽게 컴파일하기 위해 있다고 설명하고 있다. 글 링크


Ubuntu Desktop 22.04 LTS 에서 /usr/src에 헤더파일이 있는 모습

참고로 generic은 일반적인 커널소스, hwe는 최신하드웨어지원을 포함한 커널소스라고 한다.

부팅 ~ start_kernel()

컴퓨터의 부팅 과정

https://youtu.be/qUdrtNdwQZ4?si=xadPl0_jCjrG_7Ul
컴퓨터가 부팅되는 과정을 시각적으로, 간략하게 나타냈다.

i am root

국내에서 커널의 소스코드를 연구하는 스터디 그룹. 옛날 자료도 많이 있지만 아주 좋은 자료를 국어로 찾아볼 수 있어서 좋다.
http://www.iamroot.org/xe/

소스를 분석하고 총 정리 해주신것 (커널버전 3.9.11)
http://www.iamroot.org/ldocs/linux.html

정리

이건 옛날 방식(BIOS를 사용하는 x86 32비트 시스템)이라, 현재 x64과 UEFI를 사용하는 방식과는 다르다고 함. BIOS는 리얼모드에서만 동작하고 제한된 기능을 가지지만, UEFI는 ring0을 이미 들어가서 동작한다고 함.

  1. CPU 리얼모드로 시작, 리셋벡터로 이동
  2. 리셋벡터에서는 바이오스 코드로 점프함. (지금까지 것들은 ROM에 매핑됨)
  3. 바이오스는 미리 지정된 디스크에서 MBR 찾고 로드함. 여기에 GRUB있음
  4. GRUB에서 사용자가 부트할 부트섹터 고름
  5. GRUB은 선택된 부트섹터를 커널 부트 프로토콜에 따라 메모리에 적재함(여기서 로드된 커널 중 실행가능한 코드는 극히 일부분, 압축을 풀고 보호모드에 진입하는 코드, 나머지는 압축된 코드)
  6. 커널 로드가 끝다면 최초의 커널소스인 main함수 로드 접근 (오 예 드디어 C코드!!)
  7. main함수에서 키보드초기화, 힙 초기화, 비디오 모드 초기화...
  8. 압축해제 함수로 넘어가서 압축해제, 해제된 커널의 첫번째 함수 오프셋을 받아옴.
  9. 드디어 start_kernel() 진입..... 멀고 멀었다.

토의한 것

왜 커널을 압축해서 푸는 과정을 거칠까?
=> 커널의 용량이 거의 1GB에 가깝다고 한다? 아니면 real mode에서 동작하기 위해서?

과거에는 realmode에서 곧바로 커널소스를 로드하고, 압축해제하고 메모리로 적재시키려면 용량 한계가 크기 때문이라고 하지만, 리얼모드가 아닌 ring0으로 전환하고 동작하는 UEFI로 로드하는 최근에는 그런 제한이 없는데도 여전히 리눅스 커널 압축을 고수한다. 어떤 글에서는 드라이브에서 바로 메모리로 적재하는 것 보다, 메모리에 적재시켜놓고 압축을 푸는게 더 빠르기 때문이라고 설명한다. 링크

느낀점

능력의 한계를 많이 느꼈다. 우선 x86의 부팅 과정은 오랫동안 개발되어오고 패러다임도 너무 많이 바뀌어서 legacy기능을 지원하기 위한 기능들이 많아 공부할 내용이 굉장히 방대했다. 부팅과정을 완벽하게 어셈블리 단위에서 배우기에는 한주에 몇시간 공부하는것으로는 힘들었다.

언젠가는 로우레벨 단위로 깨우치겠다고 다짐했다. 먼 미래에 혹시 x86이 아닌 임베디드 시스템을 위한 부트로드를 만들어야 할 날이 혹시 있을 수도 있지 않을까??

profile
안녕하세요! 대학생 김민석입니다.

1개의 댓글

comment-user-thumbnail
2024년 4월 20일

좋은 글 유익하게 읽었습니다! 덕분에 리눅스 커널에 대한 더 깊은 이해가 생기게 되었네요.

답글 달기