-
10. 커널 동기화 방법Operating System 2019. 12. 14. 00:49
원자적 동작 동기화 방법들 중 다른 동기화 방법의 기반이 되는 것이 바로 원자적 동작이다. 원자적 동작은 중단 없이 한 단위로 실행되는 명령이다. 더 이상 쪼갤 수 없는 입자를 원자라고 하듯이, 원자적 동작은 더 이상 나눌 수 없는 명령이다. 커널은 두 종류의 원자적 동작 인터페이스를 제공한다. 첫 번째는 정수 연산을 위한 것이고 두번째는 개별 비트 연산을 위한 것이다. 1. 원자적 정수 연산 원자적 정수 연산은 특별한 자료구조인 atomic_t를 사용한다. 일반적인 C의 int형 대신 특별한 자료구조를 사용하는 데는 몇 가지 이유가 있다. 우선 원자적 함수의 인자로 atomic_t 형을 사용함으로써 다른 자료형에 원자적 함수를 잘못 사용하는 것을 막을 수 있다. 또한 비 원자적 함수에 원자적 정수를 잘..
-
순서도ARM Linux Kernel/ARM32 Linux Kenrel 2019. 10. 2. 13:22
부트로더에서 arch/arm/boot/compressed/head.s의 start 레이블로 점프한다. 일단 압축된 커널은 조금이라도 용량을 줄이기 위해서 사용하는데 요즘들어서 사용할 필요가 있나라고 생각한다. 다른 이유가 있나?? 단계 1 커널 압축 해제 준비하기 커널이 압축이 되어있으면 커널 압축을 해제 해야된다. 압축 해제 준비 단계로는 1. 인터럽트 비활성화 2. 동적 메모리 할당 3. BSS 영역 초기화 4. 페이지 디렉토리 초기화 5. 캐시 켜기 이다. 그럼 왜 위와 같은 준비를 해야될까? 동적메모리를 이용해서 압축 풀기를 수행한다고 한다.. 캐시는 재배치를 조금이라도 빠르게 수행하기 위해 MMU를 켜고 캐시를 사용한다. 페이지 디렉터리의 위치에 해당하는 엔트리에 cacheable과 buffer..
-
static int initf_dm(void)Boot Loader/U-BOOT 2019. 9. 30. 15:38
/common/board_f.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 static int initf_dm(void) { #if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN) int ret; ret = dm_init_and_scan(true); if (ret) return ret; #endif #ifdef CONFIG_TIMER_EARLY ret = dm_timer_init(); if (ret) return ret; #endif return 0; } /drivers/core/root.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28..
-
환경변수 Environment VariablesBoot Loader/U-BOOT 2019. 9. 29. 23:18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 12..
-
int arch_cpu_init(void)Boot Loader/U-BOOT 2019. 9. 27. 15:03
/arch/arm/cpu/armv7/s5p-common/cpu_info.c 1 2 3 4 5 6 7 8 #ifdef CONFIG_ARCH_CPU_INIT int arch_cpu_init(void) { s5p_set_cpu_id(); return 0; } #endif /arch/arm/mach-exynos/include/math/cpu.h 맞나? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 static inline void s5p_set_cpu_id(void) { unsigned int pro_id = readl(EXYNOS4_PRO_ID); unsigned ..
-
static int initf_console_record(void)Boot Loader/U-BOOT 2019. 9. 26. 22:06
/common/board_f.c 1 2 3 4 5 6 7 8 static int initf_console_record(void) { #if defined(CONFIG_CONSOLE_RECORD) && defined(CONFIG_SYS_MALLOC_F_LEN) return console_record_init(); #else return 0; #endif } CONFIG_CONSOLE_RECORD가 정의되어있지 않아 return 0;
-
int initf_malloc(void)Boot Loader/U-BOOT 2019. 9. 26. 22:03
/common/dlmalloc.c 1 2 3 4 5 6 7 8 9 10 int initf_malloc(void) { #ifdef CONFIG_SYS_MALLOC_F_LEN assert(gd->malloc_base); /* Set up by crt0.S */ gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN; gd->malloc_ptr = 0; #endif return 0; } CONFIG_SYS_MALLOC_F_LEN=0x400으로 정의되어있다. assert()는 false이면 프로그램을 중단시켜준다. board_init_f_init_reserve에서 gd->malloc_base에 값을 지정해주므로 중지되지않고 흘러간다.