x86 상 vxworks 시작 분석
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 순서 와 같 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.