커널 스터디 1주차에는 start_kernel 함수가 불러오는 과정을 간략하게 살펴보았고, 커널 공부에 도움이 되는 사이트를 여러개 찾아보았다. 공부한 내용 까지 전부 정리하면 좋을텐데, 시간의 압박으로 이번 주차에는 일단 살펴보았던 자료만 정리한다.
팀원분들이 좋은 자료를 많이 가져오신 덕분에 살펴볼 사이트들이 많았다.
보통 리눅스 배포판을 설치하면, /usr/src에 커널의 소스를 일부 혹은 전부가 저장되어있다. 실제로 우분투 배포판을 뜯어보니 c코드는 없고 헤더파일하고 makefile이 존재했다. 일단 왜 커널 자신의 소스코드를 /usr/src에 저장하는건지 처음에 궁금했다. 아마도 뭔가 하드웨어에 맞는 커널을 빌드 makefile나 헤더 정보가 필요하기 때문이지 않을까 하는 생각이 들었다.
-> 그 추측이 얼추 맞았다. 다음 글에 따르면 헤더파일들은커널과 함께 동작하는 드라이버나 커널 모듈(?) 등을 쉽게 컴파일하기 위해 있다고 설명하고 있다. 글 링크
Ubuntu Desktop 22.04 LTS 에서 /usr/src에 헤더파일이 있는 모습
참고로 generic은 일반적인 커널소스, hwe는 최신하드웨어지원을 포함한 커널소스라고 한다.
https://youtu.be/qUdrtNdwQZ4?si=xadPl0_jCjrG_7Ul
컴퓨터가 부팅되는 과정을 시각적으로, 간략하게 나타냈다.
국내에서 커널의 소스코드를 연구하는 스터디 그룹. 옛날 자료도 많이 있지만 아주 좋은 자료를 국어로 찾아볼 수 있어서 좋다.
http://www.iamroot.org/xe/
소스를 분석하고 총 정리 해주신것 (커널버전 3.9.11)
http://www.iamroot.org/ldocs/linux.html
이건 옛날 방식(BIOS를 사용하는 x86 32비트 시스템)이라, 현재 x64과 UEFI를 사용하는 방식과는 다르다고 함. BIOS는 리얼모드에서만 동작하고 제한된 기능을 가지지만, UEFI는 ring0을 이미 들어가서 동작한다고 함.
왜 커널을 압축해서 푸는 과정을 거칠까?
=> 커널의 용량이 거의 1GB에 가깝다고 한다? 아니면 real mode에서 동작하기 위해서?
과거에는 realmode에서 곧바로 커널소스를 로드하고, 압축해제하고 메모리로 적재시키려면 용량 한계가 크기 때문이라고 하지만, 리얼모드가 아닌 ring0으로 전환하고 동작하는 UEFI로 로드하는 최근에는 그런 제한이 없는데도 여전히 리눅스 커널 압축을 고수한다. 어떤 글에서는 드라이브에서 바로 메모리로 적재하는 것 보다, 메모리에 적재시켜놓고 압축을 푸는게 더 빠르기 때문이라고 설명한다. 링크
능력의 한계를 많이 느꼈다. 우선 x86의 부팅 과정은 오랫동안 개발되어오고 패러다임도 너무 많이 바뀌어서 legacy기능을 지원하기 위한 기능들이 많아 공부할 내용이 굉장히 방대했다. 부팅과정을 완벽하게 어셈블리 단위에서 배우기에는 한주에 몇시간 공부하는것으로는 힘들었다.
언젠가는 로우레벨 단위로 깨우치겠다고 다짐했다. 먼 미래에 혹시 x86이 아닌 임베디드 시스템을 위한 부트로드를 만들어야 할 날이 혹시 있을 수도 있지 않을까??
좋은 글 유익하게 읽었습니다! 덕분에 리눅스 커널에 대한 더 깊은 이해가 생기게 되었네요.