1.初始化代码
起点:磁盘引导程序需要将内核移入内存运行,并初始化多种模块和硬件
终点:运行第一个应用程序 系统的根文件系统
void init(void) 在0号进程运行的init函数
//获取有关硬件驱动的信息
setup((void *) &drive_info);
//开启一个标准输入控制台
(void) open("/dev/tty0",O_RDWR,0);
//打开标准输出控制台(通过复制标准输入)
(void) dup(0);
//打开标准错误控制台
(void) dup(0);
printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS,
NR_BUFFERS*BLOCK_SIZE);
printf("Free mem: %d bytes\n\r",memory_end-main_memory_start);
//创建了1号进程 如果在0号父进程创建进程成功则fork返回0,如果在子进程中fork则返回父进程pid
if (!(pid=fork())) {
//在1号进程中执行
close(0);//关闭了0号进程创建的标准输入输出
//打开了系统配置文件
if (open("/etc/rc",O_RDONLY,0))
_exit(1);
//挂载文件系统,执行shell程序
execve("/bin/sh",argv_rc,envp_rc);
_exit(2);
}
if (pid>0)
while (pid != wait(&i))
/* nothing */;
while (1) {
if ((pid=fork())<0) {
printf("Fork failed in init\r\n");
continue;
}
if (!pid) {
close(0);close(1);close(2);
setsid();
(void) open("/dev/tty0",O_RDWR,0);
(void) dup(0);
(void) dup(0);
//执行shell脚本
_exit(execve("/bin/sh",argv,envp));
}
//如果还在父进程中,则进行等待子进程退出,并重新开始循环
while (1)
if (pid == wait(&i))
break;
printf("\n\rchild %d died with code %04x\n\r",pid,i);
sync();
}
操作系统移植的过程:
1.进行操作系统初始化的适配,能够让main在你的板卡上跑起来
2.进程驱动的移植
liunx3.4.2内核分析
head.S
比对当前板子的CPU是否支持Linux,不支持就直接退出,支持则继续进行
mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10, r5 @ invalid processor (r5=0)?
THUMB( it eq ) @ force fixup-able long branch encoding
beq __error_p @ yes, error 'p'
//tag 验证参数是否完整 (tag_list参数)
bl __vet_atags
//tag 创建虚拟内存映射表
bl __create_page_tables
//tag 把函数地址装载进r13链接寄存器
ldr r13, =__mmap_switched @ address to jump to after
在__mmap_switched调用start_kernel函数
start_kernel函数在main.c中