uboot 2 단계 분석

7221 단어 플랫폼
uboot 2 단계 분석:
start 에서armboot 분석 시작: 1. gdt 와 bdt 포인터
gd_t 와 bdt 는 u - boot 에서 두 가지 중요 한 데이터 구조 로 초기 화 작업 은 이 두 데이터 구조 로 저장 하거나 전달 해 야 합 니 다.각각 정의.../include/asm - arm/globaldata. h 와./include/asm - arm/u - boot. h
 
1、gd_t: global data 데이터 구조 정의, 파일 include/asm - arm/globaldata.h.그 구성원 들 은 주로 전역 적 인 시스템 초기 화 매개 변수 이다.gd 사용 시t 시 매크로 정의 로 설명 해 야 합 니 다:
DECLARE_GLOBAL_DATA_PTR, 점용 레지스터 R8 을 지정 합 니 다.
DECLARE_GLOBAL_DATA_PTR 의 정 의 는 include\asm - arm\Globaldata.h
#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t * gd asm ("r8") 문제: 1. register 는 어떤 키워드 입 니까?
답: register 키워드: 함수 내부 에서 변 수 를 정의 할 때 기본 값 은 auto 형식 입 니 다. 즉, 변수 메모리 에 분 배 됩 니 다.변 수 를 register 키 로 정의 하면 컴 파일 러 는 가능 한 한 변 수 를 CPU 내부 레지스터 에 저장 합 니 다. 그러면 메모리 주 소 를 통 해 변 수 를 방문 하지 않 아 도 되 고 접근 효율 을 높 일 수 있 습 니 다.
2. asm (r8) 은 무슨 문법 입 니까?
이 문장 은 레지스터 r8 을 사용 하여 저장 한 다 는 뜻 이다.
온전한 것 을 가 져 옵 니 다: register volatile gdt * gd asm ("r8"), 이 성명 은 컴 파일 러 에 gd 를 저장 하기 위해 레지스터 r8 을 사용 하 라 고 알려 줍 니 다.t 형식의 포인터 gd, 즉 이 정 의 는 포인터 하 나 를 설명 하고 저장 위 치 를 가 리 킵 니 다.
다음은 gdt 는 어떤 유형 입 니까?
typedef	struct	global_data {
	bd_t		*bd;            // board     
	unsigned long	flags;          ////    ,           
	unsigned long	baudrate;       //      
	unsigned long	have_console;	/* serial_init() was called        serial_init()        */
	unsigned long	reloc_off;	/* Relocation Offset */
	unsigned long	env_addr;	/* Address  of Environment struct */
	unsigned long	env_valid;	/* Checksum of Environment valid? */
	unsigned long	fb_base;	/* base address of frame buffer */
	void		**jt;		/* jump table */
} gd_t;
bd_t 의 정의:
typedef struct bd_info {
    int			bi_baudrate;	/* serial console baudrate           */
    unsigned long	bi_ip_addr;	/* IP Address IP  */
    unsigned char	bi_enetaddr[6]; /* Ethernet adress */
    struct environment_s	       *bi_env;
    ulong	        bi_arch_number;	/* unique id for this board   ID*/
    ulong	        bi_boot_params;	/* where this board expects params uboot   kernel        */
    struct				/* RAM configuration      ,        */
    {
	ulong start;
	ulong size;
    } 			bi_dram[CONFIG_NR_DRAM_BANKS];

} bd_t;
아래 코드 는 gdt 와 bdt. 공간 분배;
	/* Pointer is writable since we allocated a register for it */
	gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
	/* compiler optimization barrier needed for GCC >= 3.4 */
	__asm__ __volatile__("": : :"memory");

	memset ((void*)gd, 0, sizeof (gd_t));
	gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
	memset (gd->bd, 0, sizeof (bd_t));

질문: 이 단락asm__ __volatile__("": : :"memory");지령 은 무엇 을 표시 합 니까?
이것 은 내장 어 셈 블 리 입 니 다.asm__뒤에 있 는 것 은 어 셈 블 리 프로그램 임 을 나타 낸다.vilatile__최적화 되 지 않 음 을 나타 낸다.구체 적 으로 는 아직 밝 혀 지지 않 았 다.참조: gcc 내장 어 셈 블 리
아래 그림 에서 gd 를 직관 적 으로 볼 수 있 습 니 다.t 와 bdt 가 있 는 주소 공간:
2. 판 위의 기본 하드웨어 에 대해 초기 화 작업 을 한다.
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
		if ((*init_fnc_ptr)() != 0) {
			hang ();
		}
	}
추적 발견 initsequence 의 정 의 는 다음 과 같 습 니 다.
init_fnc_t *init_sequence[] = {
	cpu_init,		/* basic cpu dependent setup */
	board_init,	/* basic board dependent setup */
	interrupt_init,	/* set up exceptions */
	env_init,		/* initialize environment */
	init_baudrate,	/* initialze baudrate settings */
	serial_init,	/* serial communications setup */
	console_init_f,	/* stage 1 init of console */
	display_banner,	/* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
	print_cpuinfo,	/* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
	checkboard,	/* display board info */
#endif
	dram_init,	/* configure available RAM banks */
	display_dram_config,
	NULL,
};
사실 이 순환 은 포인터 배열 의 각 함 수 를 각각 호출 하 는 것 이다. 다음은 이 함수 들 을 구체 적 으로 분석 하 는 것 이다.
cpu_init:
이 함 수 는 실질 적 인 작업 을 하지 않 고 스 택 을 초기 화 하 는 CONFIGUSE_IRQ, 직접 return 0; 
board_init: 구체 적 인 판 자 를 초기 화 합 니 다. 즉, 이것 은 하드웨어 플랫폼 과 관련 된 함수 입 니 다.이 작업 은 매우 뚜렷 하 다. 리드 IO 포트 의 설정, 기계 ID 와 시작 매개 변수 의 주소 설정, 그리고 여기 서 데이터 cache 와 명령 cache 도 열 었 다.이상 의 작업 의 완성 은 판자 가 이미 일 을 준비 했다 는 것 을 상징 한다.리드 IO 포트 설정:
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

	/* set up the I/O ports */
	gpio->GPACON = 0x007FFFFF;
	gpio->GPBCON = 0x00055555;
	gpio->GPBUP = 0x000007FF;
	gpio->GPCCON = 0xAAAAAAAA;
	gpio->GPCUP = 0x0000FFFF;
	gpio->GPDCON = 0xAAAAAAAA;
	gpio->GPDUP = 0x0000FFFF;
	gpio->GPECON = 0xAAAAAAAA;
	gpio->GPEUP = 0x0000FFFF;
	gpio->GPFCON = 0x000055AA;
	gpio->GPFUP = 0x000000FF;
	gpio->GPGCON = 0xFF94FFBA;
	gpio->GPGUP = 0x0000FFEF;
	gpio->GPGDAT = gpio->GPGDAT & ((~(1<<4)) | (1<<4)) ;
	gpio->GPHCON = 0x002AFAAA;
	gpio->GPHUP = 0x000007FF;
	gpio->GPJCON = 0x02aaaaaa;
	gpio->GPJUP = 0x00001fff;
기기 ID 와 시작 매개 변수의 주소 설정:
	/* arch number of TQ2440-Board */
	gd->bd->bi_arch_number = MACH_TYPE_S3C2440;//  ID

	/* adress of boot parameters */
	gd->bd->bi_boot_params = 0x30000100;   //                  ?????
데이터 cache 와 명령 cache 열기
icache_enable();
dcache_enable();

interrupt_init:
이 함수 가 초기 화 된 목적 은 시스템 이 예상 치 못 하 게 중단 되 는 것 을 방지 하 는 것 입 니 다.이 함수 의 초기 화 는 사실상 타이머 의 중단 초기 화 입 니 다.(
이 함 수 는 나중에 분석 해 야 한다)
env_init:
잠시 이 함수 의 실현 을 찾 지 못 했 습 니 다. 자 료 를 찾 는 역할 은 우리 판 의 환경 을 초기 화 하 는 것 입 니 다. 즉, 명령 pri 를 입력 하여 인쇄 한 값 입 니 다.
init_baudrate:
초기 화 console 의 포트 율, gd -> bd -> bibaudrate 에서 값 을 부여 합 니 다.포트 율 을 초기 화 합 니 다. 목적 은 하나 입 니 다. 직렬 로 디 버 깅 정 보 를 인쇄 합 니 다.우 리 는 디 버 깅 할 때 먼저 포트 율 의 값 을 계산 하여 gd -> bd -> bi 에 직접 할당 할 수 있 습 니 다.baudrate, 이 함수 의 다른 코드 를 주석 합 니 다.
serial_init
serial 통과 하기setbrg 함수 가 직렬 레지스터 와 관련 된 초기 화 를 진행 합 니 다.
console_init_f
gd -> haveconsole 할당 값 은 1 로 직렬 포트 가 초기 화 되 었 음 을 표시 합 니 다.
display_banner
OK, 이제 직렬 포트 가 초기 화 되 었 습 니 다. 정 보 를 인쇄 할 수 있 습 니 다.
여기에 더 할 수 있다.
 printf("****************************
"); printf("* *
"); printf("*   Welcome to uboot *
"); printf("* *
"); printf("****************************
");
uboot 가 시 작 될 때 이 켜 진 정 보 를 인쇄 합 니 다.이 함 수 를 사용 하여 디 버 깅 에 도 사용 할 수 있다.
Nor:Flash_init
Nand:nand_init
위의 두 함수 호출 이 있 으 면 uboot 는 이제 norflash 나 nandflash 를 읽 고 쓸 수 있 습 니 다.  환경 변수: envrelocate ();함수 초기 화.uboot 에 pri 를 입력 하면 인쇄 할 수 있 습 니 다.uboot 에 두 가지 환경 변수 가 있 습 니 다. 1. 기본 2. Flash 에 저 장 된 uboot 는 시작 할 때 플래시 에 저 장 된 환경 변 수 를 먼저 읽 습 니 다. 플래시 에 저장 되 지 않 으 면 기본 값 을 사용 합 니 다. include\configs\Embedsky. h 는 2440 판 의 기본 설정 을 초기 화하 기 전에 분석 하지 않 고 나중에 시간 이 있 으 면 다시 분석 합 니 다.
모두 초기 화 후 입장: mainloop 의 사순환 아래 분석 mainloop
분석 을 거 쳐 핵심 은 runcommand
요약:
1. 커 널 시작: 1. s = getenv ("bootcmd");2.run_command (s,...) 2. Uboot 인터페이스 1. readline (직렬 데이터 읽 기);2.run_command uboot 의 핵심 은 run 입 니 다.command

좋은 웹페이지 즐겨찾기