동일한 컴퓨터(4.15.0)에서 동일한 코드에 대해 컴파일된 두 개의 x86_64 커널이 있습니다.Linus의 소스 트리).
구성 파일은 make localmodconfig
각각 Arch 및 Slackware와 같은 다양한 배포판의 서로 다른 더 큰 원본 구성 파일을 사용하여 이 소스에 대해 실행하여 생성됩니다. 나는 그들에게 별명을 줄 것이다
아치 구성
그리고
실크 구성
때문에.
문제: cat /proc/meminfo
일관된 보고서를 실행할 때 MemTotal 필드에 약 55-60MB가 더 있습니다.아치비교하다실크:
MemTotal: 32600808 kB
~을 위한아치
그리고
MemTotal: 32544992 kB
~을 위한실크
내가 "일관되게"라고 말한 이유는 동일한 구성 파일을 사용하여 이전 버전의 소스(한 소스에서 다음 소스로 롤링하는 여러 4.15-rc 커널, 그 이전의 4.14 등)로 실험을 시도했기 때문입니다 make oldconfig
.
이는 htop이 보고한 데이터에 반영되어 있습니다.실크시작 시 사용 비율 보고아치. 이는 다음과 관련이 있습니다.htop 개발자의 설명htop의 사용된 메모리 데이터는 MemTotal
.
내 질문은: 어떤 구성 옵션을 살펴봐야 하는지에 대한 제안이 영향을 미칠 수 있다는 것입니다.
물론 60MB(커널을 실행하는 머신에는 32GB가 있습니다.)는 문제가 되지 않지만 이것은 저에게 흥미로운 퍼즐이며 학습 기회로 사용하고 싶습니다.
Linux에 대한 메모리 보고는 이러한 포럼과 외부에서 널리 논의되지만 이러한 특정 유형의 문제(다른 커널/동일 머신 => 메모리 보고의 다른 결과)를 검색해도 관련성이 있다고 생각되는 항목이 나오지 않았습니다.
편집하다
@ErikF가 링크한 게시물의 조언에 따라 다음 출력을 살펴보았습니다.
journalctl --boot=#
이는 #
각각 현재 및 마지막 시작(두 개의 코어에 해당)을 나타내는 0 또는 -1을 나타냅니다. 선은 차이점을 반영하는 것 같으므로 이제 그 차이가 어디에서 왔는지 더 명확해졌습니다.
아치(더 큰 MemTotal을 보고하는 것):
메모리: 32587752K/33472072K 사용 가능(10252K 커널 코드, 1157K rwdata, 2760K rodata, 1364K init, 988K bss, 884320K 예약됨, 0K cma 예약됨)
실크(더 작은 MemTotal을 보고하는 것):
메모리: 32533996K/33472072K 사용 가능(14348K 커널 코드, 1674K rwdata, 3976K rodata, 1616K init, 784K bss, 938076K 예약됨, 0K cma 예약됨)
예상대로 차이는 약 55MB입니다!
알아요실크/boot/ 폴더에 있는 두 vmlinuz 파일의 크기를 비교하여 커널이 더 크지만 차이점의 주요 부분은 두 각 커널이 예약한 메모리 양에서 비롯되는 것 같습니다.
구성 파일에 미치는 영향을 더 잘 이해하고 싶습니다.저것그것은 어느 정도 사실이지만 어느 정도 밝혀졌습니다.
두 번째 편집
댓글에서 @Tim Kennedy의 질문에 답변합니다.
전용 GPU가 있습니까, 아니면 공유 비디오 메모리를 사용합니까?
전용 GPU가 없습니다. Intel 그래픽이 내장된 노트북입니다.
두 커널 모두 동일한 그래픽 드라이버를 로드합니까?
응, i915.
또한 dmesg | grep BIOS-e820 | grep BIOS-e820 | grep BIOS-e820 grep Reserved의 출력을 비교하십시오.
예상하셨듯이, 아무것도 변하지 않았습니다. 모든 경우에 12줄이며 모든 측면(메모리 주소 등)이 동일합니다.
(최종?) 편집
나는 그것이 그렇게 간단할 것이라고 생각합니다: 커널은 더 적은 MemTotal을 보고합니다.많은더 많은 내장 드라이버 제품군이 이렇게 눈에 띄는 차이를 만들 줄은 몰랐습니다.
나는 비교했다:
du -sh /lib/modules/<smaller-kernel>/modules.builtin
4K로 돌아가는 동안
du -sh /lib/modules/<larger-kernel>/modules.builtin
16K를 반환합니다.
그래서 결국 나는 잘못된 트리를 짖고 있다고 믿습니다. 단일 구성 옵션(또는 소수)이 아니라 더 많은 내장 드라이버의 누적 효과가 될 것입니다.
답변1
나는 사진이 위에서 마지막으로 편집한 것과 같다고 생각합니다. 이 질문을했을 때 나는 그것을 구현하기 위해 메모리를 유지하는 프로세스에 대해 충분히 알지 못했습니다. 모든 것은 더 많은 드라이버가 내장된 더 큰 커널로 귀결됩니다. 모듈성보다.
그런데 저는 이것을 (원격) 실용적인 용도로 활용하고 싶습니다. 가능한 한 간결한 커널을 갖고 싶지만 여전히 initrd 없이 부팅하고 싶습니다. 알아요
더 작은 코어(별명아치위)는 매우 가볍고 부팅이 빠르지만 initramfs 없이는 그렇지 않습니다.
더 큰 코어(실크)~ 할 것이다initramfs 없이도 부팅이 가능하지만 시간이 더 오래 걸립니다.
그래서 타협을 했고 당분간은 그 타협안을 고수할 것 같아요. 두 개의 구성 파일을 가져와서 호출했습니다.큰그리고작은, 설정되지 않은 모든 구성 옵션이작은반영됨큰.
첫 번째,
awk '/^# CO/ {print} small > staging'
모든 행 가져오기작은구성 파일의 형식은 다음과 같습니다.
# CONFIG_BLAH is not set
그리고 그것들을 버려라분할불텍스트 파일. 그 다음에,
for i in $(awk '{print $2}' staging) ; do sed -i "s/^$i=./# $i is not set/" large ; done
구성 파일에서 모든 줄을 가져옵니다.큰=y
또는 를 통해 =m
다음에 포함된 옵션을 설정합니다.분할불설정을 해제합니다.
make oldconfig
그런 다음 생성된 파일을 실행합니다.큰커널 소스 디렉터리에 넣고 컴파일하세요. 모두 제일 좋다:
새 커널은 약 3초 더 빠르게 시작됩니다.
initramfs 없음
/lib/modules/<kernel>/modules.builtin
16K가 8K로 절반으로 줄어든다는 점에서 훨씬 작습니다.
이 중 아무것도 집에 쓸 내용은 아니지만 제가 말했듯이 혼란스러웠습니다. 제 생각에는 이제 그 내용을 이해한 것 같습니다.
아마도 더 직접적인 접근 방식은 한 번에 알아내는 것입니다.정확하게initramfs 없이 부팅하려면 이 시스템에 어떤 드라이버가 필요합니까? 하지만 이에 대해서는 다른 날에 남겨 두겠습니다. 또한 한 구성을 다른 구성과 비교하는 것은 그 자체로 흥미로운 작업입니다.