< h3 data -tool="mdnice editor" style="margin-top: 30px;margin-bottom: 15px;font-weight:bold;font-size: 20px;">< /span>initcall_debug🎜우리 모두 알고 있듯이 커널은 initcall 및 각 initcall시간 소모도 계산할 수 있습니다. 🎜
Bootchart는 Linux 시작 프로세스의 성능 분석에 사용되는 오픈 소스 소프트웨어 도구입니다. 시스템 시작 프로세스 중에 CPU 사용량, 프로세스 및 기타 정보를 자동으로 수집하고 분석 결과를 그래픽으로 표시하여 안내하고 최적화하는 데 사용할 수 있습니다. 시스템 시작 프로세스.
정보를 수집하세요. bootchartd는 /proc/stat,/proc/diskstat,/proc/[pid]/stat는 정보를 수집하여 bootchart.tgz 파일 🎜🎜그림을 변환합니다. PCpybootchartgui.py이 도구는 bootchart.tgz로 변환bootchart.png, 분석에 편리합니다🎜🎜🎜🎜마지막으로 그림으로도 변환됩니다. 예를 들면 다음과 같습니다.🎜
bootchar가 주로 사용됩니다. 기본 애플리케이션 시작 프로세스에 파일 시스템을 마운트하는 데 걸리는 시간을 측정하세요bootchar主要用来测量挂载文件系统到主应用程序启动过程中的耗时
gpio+示波器
可以找一个在系统启动过程中空闲的GPIO,在适当位置设置GPIO电平。
通过示波器抓取波形可以得到各阶段耗时。
通常该方法被用来测量整个启动的耗时,或者各阶段的耗时,该方法也是用的比较多的。
二、内核优化方法
kernel压缩方式
kernel有不同的压缩格式,常见的如gz、xz、lzma
gpio+오실로스코프
찾을 수 있습니다 시작 중 시스템 유휴 상태GPIO, 여기서 적절한 위치 설정GPIO 수준.
🎜오실로스코프로 파형을 캡쳐하여 각 단계의 소요시간을 알 수 있습니다. 🎜🎜보통 이 방법은 🎜전체 스타트업의 시간, 또는 각 단계의 시간을 측정🎜하는 데 사용됩니다. 🎜
2. 커널 최적화 방법
커널 압축 방법
🎜커널에는 다양한 압축 형식이 있으며, 일반적인 압축 형식은 gz, xz< /code>, <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31 , 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">lzma등. . 🎜🎜🎜압축 형식마다 압축 해제 속도가 다릅니다🎜 다양한 압축 방법의 시작 시간과 플래시 사용량을 비교하여 실제 상황에 맞는 것을 선택하고 최적화하세요. 🎜
커널 자동 추출 상황, 압축된 경우 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">커널 및 압축 해제 커널 주소 충돌이 발생하면 먼저 넣습니다. 자체 덮어쓰기를 방지하려면 안전한 장소에 복사한 후 압축을 풀어주세요. 이를 위해서는 시간이 많이 걸리는 복사가 필요합니다. 🎜🎜로드 주소와 실행 주소를 서로 다른 주소로 설정하면 시간 소모를 줄일 수 있습니다. 🎜🎜🎜🎜커널 자르기🎜🎜🎜🎜커널 자르기는 필요합니다. 커널 이미지가 너무 크면 커널 압축을 푸는 데 시간이 오래 걸리므로 커널을 최대한 자르는 것이 좋습니다. 🎜🎜압축 해제 시간을 줄이기 위해 커널을 자릅니다. 초기화 내용이 줄어들면 시간 소모도 줄어듭니다. 🎜🎜따라서 커널을 다듬을 때 불필요한 기능을 모두 제거하는 것을 고려하세요. 🎜🎜🎜🎜사전 설정 lpj 값🎜🎜🎜🎜LPJ < /code>즉, <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">loops_per_jiffy, 모든 시작할 때마다 한 번씩 계산되지만, 수정하지 않으면 시작할 때마다 값이 동일합니다. 값을 직접 제공하여 계산을 건너뛸 수 있습니다. 🎜
如下log所示,有skipped,lpj由timer计算得来,不需要再校准calibrate了。
[ 0.019918] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[ 0.021772] initcall sunxi_pinctrl_init+0x0/0x44 returned 0 after 9765 usecs
[ 0.067694] initcall param_sysfs_init+0x0/0x198 returned 0 after 29296 usecs
[ 0.070240] initcall genhd_device_init+0x0/0x88 returned 0 after 9765 usecs
[ 0.080405] initcall init_scsi+0x0/0x90 returned 0 after 9765 usecs
[ 0.090384] initcall mmc_init+0x0/0x84 returned 0 after 9765 usecs
로그인 후 복사
根据打印信息,可以对耗时较多的initcall进行优化。
内核initcall_module并行
initcall有很多等级,但比较耗时的是module。
如果是多核,可以考虑将module_initcall并行执行来节省时间。
目前内核do_initcalls是一个一个按照顺序来执行,可以修改成新建内核线程来执行
减少pty/tty个数
加入initcall打印之后,发现pty/tty init耗时很多,可减少个数来缩短init时间。
initcall pty_init+0x0/0x3c4 returned 0 after 239627 usecs
initcall chr_dev_init+0x0/0xdc returned 0 after 36581 usecs
로그인 후 복사
内核module
只把必须要加进内核的才编译进内核,其他的编译成模块。
例如将必要的clock、tty、pinctrl等编译进内核
三、其他优化
uboot
如果是RISC-V架构,可以考虑去掉uboot。RISC-V架构,可以考虑去掉uboot。
XIP
xip:eXecute In Place。即芯片内执行,是指CPU直接从存储器中读取程序代码执行,而不用再读到内存中。