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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * Record.c * * Created on: 2014-5-26 * Author: zdl */ #include "includes.h" char *const Display_Name[]={ "Music List", "1-Beyond.wav", "2-LetItG.wav", "3-WeAreO.wav", "4-FanFan.wav", "5-OldBoy.wav", "6-Sodagr.wav", "7-WangF1.wav", "8-WangF2.wav", "9-Mayday.wav", "10-StevC.wav", }; void Music_Graph() { SysTickDisable(); //---------Draw Title---------- ui8Flush_Flag=FLUSH_ON; GrClearDisplay(&g_sContext); GrFlush(&g_sContext); } void Music_Begin() { DSTATUS i=1; SystemClock=SysCtlClockGet(); //----------------硬件初始化--------------- DAC_Init(); //初始化DAC //-------------------初始化SD卡-------------------- while(i==1)// 使用文件系统初始化SD卡 i=disk_initialize(0); //-------------------初始化Timer------------------- SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); TimerDisable(TIMER1_BASE, TIMER_A); TimerConfigure(TIMER1_BASE, TIMER_CFG_A_PERIODIC_UP); TimerIntRegister(TIMER1_BASE,TIMER_A,Timer1IntHandler); TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); MAP_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_6); MAP_GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_6,GPIO_PIN_6); SysTickEnable(); } void Music_Main() { static uint8_t preDisplay_Num=255,Display_Num=0; while((ui8ButtonKeyValue&KEY_LEFT_ENTER) == 0 &&(ui8ButtonKeyValue&KEY_RIGHT_EXIT)==0) { Display_Num = GetWheelKey(); _nop(); if(Display_Num != preDisplay_Num) { DrawMenu(Display_Num,Display_Name); preDisplay_Num = Display_Num; } SysCtlDelay(SystemClock/100); } if(Music_Enter==1) { GrClearDisplay(&g_sContext); GrStringDrawCentered(&g_sContext, Display_Name[Display_Num], AUTO_STRING_LENGTH, 63, 20, OPAQUE_TEXT); GrContextFontSet(&g_sContext, &g_sFontFixed6x8); GrStringDraw(&g_sContext,"Time:",4,0,53,1); GrStringNumberCentered(&g_sContext,0,0,35+22,57); GrStringDraw(&g_sContext,"-",1,35+9,53,1); GrStringNumberCentered(&g_sContext,0,0,35+2,57); GrStringDraw(&g_sContext,"/",1,35+34,53,1); GrStringNumberCentered(&g_sContext,0,0,35+48,57); GrStringDraw(&g_sContext,"-",1,35+55,53,1); GrStringNumberCentered(&g_sContext,0,0,35+70,57); GrFlush(&g_sContext); ui8Flush_Flag=FLUSH_OFF; WaveOpen(Display_Name[Display_Num],MONO); ui8Flush_Flag=FLUSH_ON; preDisplay_Num=255; ui8ButtonKeyValue&=~(KEY_LEFT_ENTER+KEY_RIGHT_EXIT); } else { preDisplay_Num=255; rcd_ply_sel = 255; } } void Music_Quit() { MAP_GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5,0); TimerDisable(TIMER1_BASE, TIMER_A); ui8Flush_Flag=FLUSH_ON; }
07-11

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值