本文以嵌入式linux下的板卡为例进行解释
一、延时/按需加载的概念
linux下程序运行时不是把程序全部加载到内存再执行,而是边加载边运行,参考书籍《操作系统导论》中的延时加载;
二、涉及的知识延伸
1、缺页中断
网上参考资料有很多关于此概念的解释
2、内存管理
网上参考资料有很多关于此概念的解释
3、linux下程序执行的过程
strace ./可执行程序 可以看到系统调用的执行,查看内核源代码
三、量化延时/按需加载的概念
1、测试程序
在ubuntu下使用arm交叉工具链编译一个测试,测试test.c程序内容如下:
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
unsigned char array[20]={100};
int main()
{
system("pidof test | xargs pmap -x > pmap.txt");//显示进程的虚拟地址范围
while(1)
{
for(char i=0;i<2;i++)
{
printf("#####i=%d\r\n",i);
for(char j=0;j<20;j++)
printf("address:%p,value:%d",&array[j],array[j]);
}
}
}
2、修改内核源码添加调试代码
修改arch/arm64/mm/fault.c文件中函数
static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, struct pt_regs *regs);
添加
if(current->comm)
{
static long cnt=0;
if(strcmp(current->comm,"test")==0)
{
pr_notice("fault:%ld,vaddr 0x:%lx\r\n",++cnt,addr); //vaddr为缺页中断时的虚拟地址和值在pmap生成的当前虚拟地址范围内
}
}
3、运行结果
可以看到数组会循环打印三遍,第一遍由于虚拟地址还没映射到实际的物理地址,所以可以看到i=0时,会有缺页中断产生,第二遍之后不会有缺页中断;