uboot 2 단계 분석
7221 단어 플랫폼
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
개발 서버 k8s 설정 사용자 정의 dns 분석문제 설명: 개발 서버는 내망에 있고 개발자는 때때로 집에서나 다른 곳에서 개발을 하고 사용하는 서버 포트를 내망에 전송하며 더 많은 경우 같은 곳에서 개발을 한다. 해결 방법: 도메인 주소를 도메인 주소로 통일하여...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.