x86 상 vxworks 시작 분석

전송 주소:http://bbs.2beanet.com/vxworks-f10/vxworks-t3385.html
       VxWorks 의 안내 프로그램 은 VxLd 로 Tornado 도구 vxsys. com 에서 기록 합 니 다.실행 후 현재 디스크 의 루트 디 렉 터 리 에서 BOOTROM. SYS 를 불 러 옵 니 다. (이 파일 은 연속 으로 저장 해 야 합 니 다. Vxld 가 간단 하고 파일 시스템 을 알 지 못 하기 때 문 입 니 다) 로 딩 주 소 는 0x 8000 입 니 다.이 절 차 는 BIOS INT 13 호출 을 통 해 이 루어 집 니 다.로드 완료 후 0x 8000 으로 이동 하여 실행 합 니 다.VxWorks 운영 체제 의 첫 번 째 명령 은 0x 8000 에 저 장 됩 니 다.PC 타 겟 기기 에서 VxWorks 와 BIOS 의 관 계 를 주의 하 세 요.VxWorks 는 BIOS 가 메모리, PCI 버스 등 시스템 하드웨어 를 정확하게 초기 화 했다 고 가정 하기 때문에 pc 386, pc 486 등 BSP 는 많은 작업 을 줄 였 다.그러나 VxWorks 가 시작 되면 BIOS 의 어떤 기능 도 사용 하지 않 습 니 다. 이것 은 DOS 와 다 릅 니 다.VxWorks 는 보호 모드 에서 실행 되 기 때문에 BIOS 기능 은 반드시 실제 모드 에서 호출 되 어야 합 니 다. (보호 모드 에서 BIOS 기능 을 어떻게 호출 하 는 지 알려 줄 수 있 습 니 다. 물론 이것 은 고급 화제 입 니 다)실제 일반적인 정상 적 인 상황 에서 VxWorks 가 실행 되면 BIOS 는 완전히 사라 진다.
       romInit. s: 시스템 입구 romInit 함 수 를 정 의 했 습 니 다. 시스템 에 전 기 를 걸 면 가장 먼저 실행 되 는 코드 입 니 다.romInit 에서 CPU 중단 금지, 초기 스 택 포인터 설정, D 램 컨트롤 러 설정 등 소량의 CPU 설정 을 완료 한 후 첫 번 째 함수 romStart 를 호출 합 니 다.더 나 은 하드웨어 초기 화 는 sysLib. c 에서 정의 하 는 sysHwInit 함수 로 이 루어 집 니 다.BSP 개발 에서 romInit. s 는 RAM 만 작 동 시 키 면 되 며 하드웨어 초기 화 를 많이 하지 않 아 도 됩 니 다.romInit. s 의 하드웨어 초기 화 는 sysLib. c 나 sysALib. c 에서 반복 합 니 다.VxWorks 프로그램 은 BootRom 의 매개 변수 문자열 과 시작 형식 코드 만 필요 하고 BootRom 에 의존 하 는 하드웨어 초기 화 (RAM 초기 화 제외) 를 따 르 지 않 기 때 문 입 니 다.VxWorks 가 시 작 될 때 CPU 와 다른 모든 하드웨어 를 다시 초기 화 합 니 다.RAM 도 VxWorks 에서 다시 초기 화 할 수 있어 프로그램 실행 에 영향 을 주지 않 습 니 다.BootRom 과 VxWorks 의 무관 성 은 기본 원칙 으로 이 원칙 을 따 르 지 않 으 면 VxWorks 와 BootRom 의 관련 수정 이 발생 합 니 다.
/*******************************************************************************
*
* romInit - entry point for VxWorks in ROM
*

* romInit (startType)
*     int startType;   /@ only used by 2nd entry point        ,      ,        @/   
*/

   /* cold start entry point in REAL MODE(16 bits)      VxWorks        。  CPU      ,      1M    ,      16-bit  。     CPU        */

romInit:
_romInit:
   cli            /* LOCK INTERRUPT     */
   jmp   cold         /* offset must be less than 128 */


   /* warm start entry point in PROTECTED MODE(32 bits) */

   .balign 16,0x90
romWarmHigh:            /* ROM_WARM_HIGH(0x10) is offset */
   cli            /* LOCK INTERRUPT */
   movl    SP_ARG1(%esp),%ebx   /* %ebx has the startType */
   jmp   warm

   /* warm start entry point in PROTECTED MODE(32 bits) */
   
   .balign 16,0x90
romWarmLow:            /* ROM_WARM_LOW(0x20) is offset */
   cli            /* LOCK INTERRUPT */
   cld            /* copy itself to ROM_TEXT_ADRS */
   movl   $ RAM_LOW_ADRS,%esi   /* get src addr (RAM_LOW_ADRS) */
   movl   $ ROM_TEXT_ADRS,%edi   /* get dst addr (ROM_TEXT_ADRS) */
   movl   $ ROM_SIZE,%ecx      /* get nBytes to copy */
   shrl   $2,%ecx         /* get nLongs to copy */
   rep            /* repeat next inst ECX time */
   movsl            /* copy nLongs from src to dst */
   movl    SP_ARG1(%esp),%ebx   /* %ebx has the startType */
   jmp   warm         /* jump to warm */

   /* copyright notice appears at beginning of ROM (in TEXT segment) */

   .ascii   "Copyright 1984-2002 Wind River Systems, Inc."


   /* cold start code in REAL MODE(16 bits) */

   .balign 16,0x90
cold:
   .byte   0x67, 0x66      /* next inst has 32bit operand */
   lidt   %cs:(romIdtr - romInit)   /* load temporary IDT */

   .byte   0x67, 0x66      /* next inst has 32bit operand */
   lgdt   %cs:(romGdtr - romInit)   /* load temporary GDT */

   /* switch to protected mode */

   mov   %cr0,%eax      /* move CR0 to EAX */
   .byte   0x66         /* next inst has 32bit operand */
   or   $0x00000001,%eax   /* set the PE bit */
   mov   %eax,%cr0      /* move EAX to CR0 */
   jmp   romInit1      /* near jump to flush a inst queue */

romInit1:
   .byte   0x66         /* next inst has 32bit operand */
   mov   $0x0010,%eax      /* set data segment 0x10 is 3rd one */
   mov   %ax,%ds         /* set DS */
   mov   %ax,%es         /* set ES */
   mov   %ax,%fs         /* set FS */
   mov   %ax,%gs         /* set GS */
   mov   %ax,%ss         /* set SS */
   .byte   0x66         /* next inst has 32bit operand */
   mov   $ ROM_STACK,%esp    /* set lower mem stack pointer */
   .byte   0x67, 0x66      /* next inst has 32bit operand */
   ljmp   $0x08, $ ROM_TEXT_ADRS + romInit2 - romInit


   /* temporary IDTR stored in code segment in ROM */

romIdtr:
   .word   0x0000         /* size   : 0 */
   .long   0x00000000      /* address: 0 */


   /* temporary GDTR stored in code segment in ROM */

romGdtr:
   .word   0x0027         /* size   : 39(8 * 5 - 1) bytes */
   .long   (romGdt   - romInit + ROM_TEXT_ADRS) /* address: romGdt */


   /* temporary GDT stored in code segment in ROM */

   .balign 16,0x90
romGdt:
   /* 0(selector=0x0000): Null descriptor */
   .word   0x0000
   .word   0x0000
   .byte   0x00
   .byte   0x00
   .byte   0x00
   .byte   0x00

   /* 1(selector=0x0008): Code descriptor */
   .word   0xffff         /* limit: xffff */
   .word   0x0000         /* base : xxxx0000 */
   .byte   0x00         /* base : xx00xxxx */
   .byte   0x9a         /* Code e/r, Present, DPL0 */
   .byte   0xcf         /* limit: fxxxx, Page Gra, 32bit */
   .byte   0x00         /* base : 00xxxxxx */

   /* 2(selector=0x0010): Data descriptor */
   .word   0xffff         /* limit: xffff */
   .word   0x0000         /* base : xxxx0000 */
   .byte   0x00         /* base : xx00xxxx */
   .byte   0x92         /* Data r/w, Present, DPL0 */
   .byte   0xcf         /* limit: fxxxx, Page Gra, 32bit */
   .byte   0x00         /* base : 00xxxxxx */

   /* 3(selector=0x0018): Code descriptor, for the nesting interrupt */
   .word   0xffff         /* limit: xffff */
   .word   0x0000         /* base : xxxx0000 */
   .byte   0x00         /* base : xx00xxxx */
   .byte   0x9a         /* Code e/r, Present, DPL0 */
   .byte   0xcf         /* limit: fxxxx, Page Gra, 32bit */
   .byte   0x00         /* base : 00xxxxxx */

   /* 4(selector=0x0020): Code descriptor, for the nesting interrupt */
   .word   0xffff         /* limit: xffff */
   .word   0x0000         /* base : xxxx0000 */
   .byte   0x00         /* base : xx00xxxx */
   .byte   0x9a         /* Code e/r, Present, DPL0 */
   .byte   0xcf         /* limit: fxxxx, Page Gra, 32bit */
   .byte   0x00         /* base : 00xxxxxx */


   /* cold start code in PROTECTED MODE(32 bits) */

   .balign 16,0x90
romInit2:
   cli            /* LOCK INTERRUPT */
   movl   $ ROM_STACK,%esp   /* set a stack pointer */

#if   defined (TGT_CPU) && defined (SYMMETRIC_IO_MODE)

        movl    $ MP_N_CPU, %eax
        lock
        incl    (%eax)

#endif   /* defined (TGT_CPU) && defined (SYMMETRIC_IO_MODE) */

   /* WindML + VesaBIOS initialization */
   
#ifdef   INCLUDE_WINDML   
   movl   $ VESA_BIOS_DATA_PREFIX,%ebx   /* move BIOS prefix addr to EBX */
   movl   $ VESA_BIOS_KEY_1,(%ebx)   /* store "BIOS" */
   addl   $4,%ebx            /* increment EBX */
   movl   $ VESA_BIOS_KEY_2,(%ebx)   /* store "DATA" */
   movl   $ VESA_BIOS_DATA_SIZE,%ecx   /* load ECX with nBytes to copy */
   shrl    $2,%ecx            /* get nLongs to copy */
   movl   $0,%esi            /* load ESI with source addr */
   movl   $ VESA_BIOS_DATA_ADDRESS,%edi   /* load EDI with dest addr */
   rep
   movsl               /* copy BIOS data to VRAM */
#endif   /* INCLUDE_WINDML */

   /*
         * Don't call romA20on if booted through SFL. romA20on does ISA
         * I/O port accesses to turn A20 on. In case of SFL boot, ISA
         * I/O address space will not be initialized by properly by the
         * time this code gets executed. Also, A20 comes ON when booted
         * through SFL.
         */

#ifndef INCLUDE_IACSFL   
   call   FUNC(romA20on)      /* enable A20 */
   cmpl   $0, %eax      /* is A20 enabled? */
   jne   romInitHlt      /*   no: jump romInitHlt */
#endif   /* INCLUDE_IACSFL */

   movl    $ BOOT_COLD,%ebx   /* %ebx has the startType */

   /* copy bootrom image to dst addr if (romInit != ROM_TEXT_ADRS) */

warm:
   ARCH_REGS_INIT         /* initialize DR[0-7] CR0 EFLAGS */

#if   (CPU == PENTIUM) || (CPU == PENTIUM2) || (CPU == PENTIUM3) || /
   (CPU == PENTIUM4)

   /* ARCH_CR4_INIT      /@ initialize CR4 for P5,6,7 */

   xorl   %eax, %eax      /* zero EAX */
   movl   %eax, %cr4      /* initialize CR4 */
#endif   /* (CPU == PENTIUM) || (CPU == PENTIUM[234]) */

   movl   $romGdtr,%eax      /* load the original GDT */
   subl   $ FUNC(romInit),%eax
   addl   $ ROM_TEXT_ADRS,%eax
   pushl   %eax   
   call   FUNC(romLoadGdt)

   movl   $ STACK_ADRS, %esp   /* initialise the stack pointer */
   movl    $ ROM_TEXT_ADRS, %esi   /* get src addr(ROM_TEXT_ADRS) */
   movl    $ romInit, %edi      /* get dst addr(romInit) */
   cmpl   %esi, %edi      /* is src and dst same? */
   je   romInit4      /*   yes: skip copying */
   movl    $ FUNC(end), %ecx   /* get "end" addr */
   subl    %edi, %ecx      /* get nBytes to copy */
   shrl    $2, %ecx      /* get nLongs to copy */
   cld             /* clear the direction bit */
   rep            /* repeat next inst ECX time */
   movsl                           /* copy itself to the entry point */

   /* jump to romStart(absolute address, position dependent) */

romInit4:
   xorl   %ebp, %ebp      /* initialize the frame pointer */
   pushl   $0         /* initialise the EFLAGS */
   popfl
   pushl   %ebx         /* push the startType */
   movl   $ FUNC(romStart),%eax   /* jump to romStart */
   call   *%eax

   /* just in case, if there's a problem in romStart or romA20on */

romInitHlt:
   pushl   %eax
   call   FUNC(romEaxShow)   /* show EAX on your display device */
   hlt   
   jmp   romInitHlt

sysALib. s: 이것 은 VxWorks 의 또 다른 어 셈 블 리 코드 파일 로 RAM 에서 VxWorks 의 입구 함수 인 sys Init 를 실현 합 니 다.이 함수 코드 는 VxWorks 프로그램 이미지 의 시작 에 위치 하여 BootRom 에서 VxWorks 로 의 성공 적 인 전환 을 보장 합 니 다.스 택 중단 과 초기 화 금지 등 romInit 의 일부 기능 을 반복 한 다음 usrInit 로 이동 합 니 다.
sysLib. c: 이 파일 은 BSP 의 주요 소스 코드 파일 입 니 다. 이전 두 시스템 에서 파일 을 초기 화 하 는 것 과 달리 sysLib. c 는 절 차 를 뚜렷하게 실행 하지 않 고 상부 코드 에 하드웨어 와 관련 된 서비스 인 터 페 이 스 를 제공 합 니 다.주요 함수:
sysHwInit: 대상 기기 의 핵심 하드웨어 초기 화, 예 를 들 어 선택, 중단, 시스템 시계 등;
sysHwInit 2: 보조 시계 등 대상 기기 의 추가 하드웨어 초기 화;
sysPhysMemTop: 물리 RAM 메모리 의 최대 주 소 를 가 져 옵 니 다.
sysMemTop: VxWorks 가 사용 할 수 있 는 메모리 의 최대 주 소 를 가 져 와 물리 RAM 꼭대기 에 공간 을 유지 할 수 있 도록 합 니 다.
sysToMonitor: 시스템 열 복원 에 사용 합 니 다.
VxWorks 시작 순서: 거시적 으로 볼 때 보통 BootRom 을 먼저 불 러 옵 니 다.BootRom 에서 VxWorks 응용 프로그램 을 다시 불 러 오고 VxWorks 의 입구 sys Init 로 이동 합 니 다.VxWorks 는 시작 스 크 립 트 파일 에 따라 응용 모듈 을 불 러 올 수 있 습 니 다.전체 시작 과정 이 끝 난 후 시스템 은 다 중 작업 환경 에 들 어가 운행 한다.
파일 의 측면 에서 볼 때 시작 과정 은 시작 순서에 따라 관련 파일 을 다음 과 같이 보 여 줍 니 다.
BootRom
romInit. s: 시스템 초기 화 입구 romInit 를 실현 하고 가장 기본 적 인 CPU 초기 화 를 완료 합 니 다. 예 를 들 어 중단 금지 와 선택 초기 화 등 후속 시작 을 위 한 준비 가 되 어 있 습 니 다.완료 후 romStart 로 이동 하여 실행 합 니 다.
bootInit. c: 시스템 의 첫 번 째 C 함수 입구 romStart 를 실현 합 니 다.주로 프로그램 이미지 의 각 단락 에서 RAM 으로 복사 되 며, 각종 프로그램 이미지 가 이 지점 에 있 습 니 다. 완 료 된 후에 usrInit 함 수 를 호출 합 니 다.
bootConfig. c: usrInit 함 수 를 실현 하고 다 중 작업 환경 에 들 어가 기 전의 모든 초기 화 작업 을 완성 합 니 다. 완료 후 다 중 작업 환경 에 들 어가 면 usrRoot 는 첫 번 째 시스템 작업 으로 tBoot 작업 을 만 들 고 tBoot 작업 은 VxWorks 이미지 로 딩 을 완성 합 니 다.
VxWorks
sysALib. s: VxWorks 전용 입구 sysInit 구현.CPU 기반 하드웨어 초기 화가 완료 되 었 다 고 가정 하고 CPU 를 간단하게 초기 화한 후 usrInit 로 이동 합 니 다.
prjConfig. c: usrInit 함 수 를 실현 하고 다 중 작업 환경 에 들 어가 기 전에 모든 초기 화 작업 을 완성 합 니 다.
usrKernel. c: usrKernelInit 함 수 를 실현 하여 시스템 을 다 중 작업 환경 에 들 어가 게 합 니 다.
prjConfig. c: usrRoot 작업 함 수 를 실현 하고 운영 체제 의 일부 상부 초기 화 를 완성 한 후에 usrAppInit 를 호출 하여 응용 코드 에 필요 한 초기 화 를 완성 합 니 다. 응용 코드 는 여기 서 여러 작업 을 만 들 수 있 습 니 다.
ROM 시작 VxWorks
romInit. s: 시스템 초기 화 입구 romInit 를 실현 하고 가장 기본 적 인 CPU 초기 화 를 완료 합 니 다. 예 를 들 어 중단 금지 와 선택 초기 화 등 후속 시작 을 위 한 준비 가 되 어 있 습 니 다.완료 후 romStart 로 이동 하여 실행 합 니 다.
romStart. c: c: 시스템 의 첫 번 째 C 함수 입구 romStart 를 실현 합 니 다.주로 프로그램 이미지 의 각 단락 에서 RAM 으로 복사 되 며, 각종 프로그램 이미지 가 이 지점 에 있 으 며, 완료 후 sysInit () 로 이동 하여 실 행 됩 니 다.
후속 절 차 는 앞의 VxWorks 순서 와 같 습 니 다.

좋은 웹페이지 즐겨찾기