저는 임베디드 Linux 시스템(5.10.24)을 개발 중이고 이제 구축할 수 있는 가장 작은 커널이 무엇인지 확인하고 싶습니다. 따라서 커널 구성이 많아 이제 다음과 같은 커널이 생겼습니다.
# dmesg | grep 'Memory:'
Memory: 12620K/16384K available (1933K kernel code, 128K rwdata, 236K rodata, 192K init, 55K bss, 3764K reserved, 0K cma-reserved)
# free
total used free shared buff/cache available
Mem: 12812 2624 8808 0 1380 8928
Swap: 0 0 0
sysfs
드라이버 와 같은 일부 중요한 커널 코드를 비활성화했습니다 .
따라서 현재 커널 메모리 사용량을 줄이기 위해 커널 구성을 최적화할 수 없습니다.
이것은 MMU가 있는 MPU에서 실행되는 일반적인 커널이므로 현재로서는 uCLinux로 이동하지 않을 것입니다.
다음으로 커널 코드를 비활성화하거나 단순화하여 코드를 수동으로 변경할 수 있습니다. 하지만 그 전에 먼저 다른 기능보다 메모리를 많이 사용하는 커널 기능을 좁혀보고 싶습니다.
그럼 어떤 코드에 먼저 집중해야 할지 제안해 주실 수 있나요? 커널의 어느 부분이 더 많은 메모리를 차지하고 주의를 기울여야 하는지 파악하는 데 도움이 되는 도구가 있습니까?
답변1
최소한의 Linux 커널을 생성하는 방법을 찾았습니다.
여기있어.
make menuconfig
많은 구성을 완료하고 사용하지 않거나 필요하지 않은 것을 비활성화하려면 일반적이고 일반적인 방법으로 실행하십시오risk-less
. 변경 사항이 예상대로 작동하는지 확인하려면 커널을 빌드하고 시작하는 것을 잊지 마십시오.sysfs
,procfs
및 와 같은 메모리 집약적 커널 구성 요소를 비활성화합니다printk
. 이 변경으로 인해 커널 공간이 크게 줄어들지만 이로 인해 특정 기능이 제대로 작동하지 못할 수 있습니다free
.ps
mount
procfs
부트로더에서 커널 매개변수를 사용자 정의하여 메모리를 덜 사용하도록 특정 커널 기능을 비활성화하거나 설정합니다.
readelf
어떤 기능과 데이터가 메모리를 차지하고 있는지 확인하는 데 사용됩니다 . IRQ 수 등 특정 하드웨어 플랫폼에 따라 일부 기능을 단순화하도록 커널 코드를 변경합니다.
커널 이미지는 변경이 있을 때마다 빌드하고 테스트해야 합니다.
반복적인 시도를 거친 후 최종 커널 이미지는 다음과 같습니다.
-rw-rw-r-- 1 t t 972961 Nov 29 22:09 vmlinuz
text data bss dec hex
1860928 242232 28032 2131192 2084f8
# free
total used free shared buff/cache available
Mem: 5620 2140 2188 0 1292 2660
Swap: 0 0 0
sh가 비활성화된 경우
paladin의 의견에 따라 커널에서 "sh"를 비활성화하고 결과를 비교했습니다.
변경 전.
text data bss dec hex
7905846 1791740 135872 9833458 960bf2
변경 후
text data bss dec hex
7905026 1787608 135872 9828506 95f89a
따라서 .txt 파일에는 약 800Bytes text
, 약 3KB 정도가 저장된다 data
.