day8-操作系统初始化函数init

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中

你可能感兴趣的:(linux内核,java,服务器,前端)