본문 바로가기 메뉴 바로가기

두찡의 일상

프로필사진
  • 글쓰기
  • 관리
  • 태그
  • 방명록
  • RSS

두찡의 일상

검색하기 폼
  • 분류 전체보기 (129)
    • 개발 (119)
      • 알고리즘 (6)
      • 일상 (50)
      • 병렬프로그래밍 (8)
      • 도트도전기 (12)
      • 코드로 알아보는 ARM 리눅스 커널 TIL (33)
      • arm64 linux 6 분석 (10)
    • 게임근황 (6)
    • 개발 외 일상 (2)
  • 방명록

분류 전체보기 (129)
cpu_uninstall_idmap (setup_arch)

TTBRTranslation Table Base Register가상 주소를 싥제 주소로 매핑시 사용하는 레지스터TTBR0_EL1 : 유저 스페이스Holds the base address of the translation table for the initial lookup for stage 1 of the translation of an address from the lower VA range in the EL1&0 translation regime, and other information for this translation regime.TTBR1: 커널 스페이스Holds the base address of the translation table for the initial lookup for stage..

개발/arm64 linux 6 분석 2025. 6. 1. 14:43
local_daif_restore (setup_arch)

primary cpu 는 커널에 진입할때 모든 exception 이 마스크된 채로 들어옵니다. DAIF = 1111디버깅과(D) SError(A) 를 마스킹 해제 해야 합니다.IF 는 irqchip (gic) 초기화 후 열수 있기 때문에 마스킹 합니다.#define DAIF_PROCCTX_NOIRQ (PSR_I_BIT | PSR_F_BIT)void __init __no_sanitize_address setup_arch(char **cmdline_p){ /* * The primary CPU enters the kernel with all DAIF exceptions masked. * * We must unmask Debug and SError before preemption..

개발/arm64 linux 6 분석 2025. 5. 31. 19:55
SHADOW_CALL_STACK [SCS] (setup_arch)

https://clucle.tistory.com/entry/procS-primaryswitchedhttps://clucle.tistory.com/entry/jumplabel 이전 포스팅에서 다뤘던 scs, jump label 을 사용하여 shadow call stack 을 초기화 합니다.void __init __no_sanitize_address setup_arch(char **cmdline_p){ // scs 초기화 dynamic_scs_init();scs 는 stack pointer 를 레지스터 뿐 아니라, task 구조체에 저장하고 불러옵니다.#ifdef CONFIG_DYNAMIC_SCSDEFINE_STATIC_KEY_FALSE(dynamic_scs_enabled);#endif#ifdef..

개발/arm64 linux 6 분석 2025. 5. 31. 19:42
early_param (setup_arch)

void __init __no_sanitize_address setup_arch(char **cmdline_p){ parse_early_param();early param 이란 어떤것이고, 어떻게 사용하는지 알아보자.early param.init.setup 섹션에 미리 등록한 parameter 가 early param 으로 사용 가능합니다.__setup_start 에 들어갈 수 있도록 매크로로 정의합니다.extern const struct obs_kernel_param __setup_start[], __setup_end[];/* * Only for really core code. See moduleparam.h for the normal way. * * Force the alignment so t..

개발/arm64 linux 6 분석 2025. 5. 31. 19:06
jump_label (setup_arch)

setup_arch jump_label_init 분석// arch/arm64/kernel/setup.cvoid __init __no_sanitize_address setup_arch(char **cmdline_p){ jump_label_init();}jump_label_init구조체 정의// arch/arm/include/asm/jump_label.htypedef u32 jump_label_t;struct jump_entry { jump_label_t code; jump_label_t target; jump_label_t key; };struct static_key { atomic_t enabled;#ifdef CONFIG_JUMP_LABEL/* * Note: * To ma..

개발/arm64 linux 6 분석 2025. 5. 31. 17:00
start_kernel 2 setup_arch

struct mm_struct init_mm = { .mm_mt = MTREE_INIT_EXT(mm_mt, MM_MT_FLAGS, init_mm.mmap_lock), .pgd = swapper_pg_dir,void __init __no_sanitize_address setup_arch(char **cmdline_p){ // vmlinux.lds.S 에 있는 값을 변수로 옮김 setup_initial_init_mm(_stext, _etext, _edata, _end); *cmdline_p = boot_command_line; // Kernel Address Space Layout Randomization kaslr_init(); // fi..

개발/arm64 linux 6 분석 2025. 5. 24. 19:08
start_kernel 1

kernel 을 초기화하는 start_kernel 는 여러 함수로 이루어져있다.우선은 하나씩 분석을 해보자 // stack 의 끝에 overflow detection 을 위해 magic 값을 설정 set_task_stack_end_magic(&init_task); // 시작 cpu 의 (0번) id 를 지정 smp_setup_processor_id(); // 디버그를 위한 lock 과 리스트 초기화 (간단해서 분석 x) debug_objects_early_init(); // notes 영역에서 빌드 id 를 획득해서 변수에 저장 init_vmlinux_build_id(); // cgroup subsystem 초기화 cgroup_init_early();..

개발/arm64 linux 6 분석 2025. 5. 24. 15:20
proc.S __primary_switch

primary_switchprimary_switchSYM_FUNC_START_LOCAL(__primary_switch) // vmlinux.lds.S 에 미리 위치가 정해져있는 reserved_pg_dir, init_idmap_pg_dir 을 x1, x2 인자로 설정 // init_idmap_pg_dir 은 초기에 사용할 페이지 테이블 // reserved_pg_dir 는 나중에 사용할 페이지 테이블 adrp x1, reserved_pg_dir adrp x2, init_idmap_pg_dir bl __enable_mmu adrp x1, early_init_stack mov sp, x1 mov x29, xzr mov ..

개발/arm64 linux 6 분석 2025. 5. 17. 15:59
proc.S __cpu_setup

| mov_q | move an immediate constant into a 64-bit register |arch/arm64/mm/proc.Sisb : 인스트럭션 fetch 됐던걸, 이전 명령 실행 전까지 미룸msr SCTLR_EL1, x0 ; 시스템 제어 레지스터 변경// 파이프라인에는 다음 명령들이 이미 들어왔음!add x1, x1, #1 // 엔디안값이 SCTLR 에서 바뀌었다면?? (정확한 예시인지는 잘 모르겠음) 확인해보고 싶다->msr SCTLR_EL1, x0isbdsb nshdsb: data synchronization barrier: 모든 이전 명령이 끝날때까지 대기nsh: non-shareable: 현재 코어내에서만 동기화tlbi vmalle1가상 주소를 물리 주소로 바꾸기 위해 ..

개발/arm64 linux 6 분석 2025. 5. 10. 15:39
250503 head.S

| 명령어 | 설명 || adr | 현재 코드 위치 기준으로 label 주소를 저장 || adrp | 4kb page 만큼 포인터를 설정. 따라서 12비트만큼 0가 설정됨 || adr_l | adrp + add 로 오프셋을 더해 실제 주소 구함 || cbnz | 조건이 0이 아니라면 점프 || dmb | data memory barrier. 여러 옵션들이 존재함 || bl | 고정된 함수 주소로 점프 || blr | 레지스터 같은 동적 함수 주소로 점프 || mrs | Move from system register. || cmp | CPSR (Current Program Status Register) 레지스터에 비교된 값 설정 || tbnz | Test bit and Branch if Nonzero. |..

개발/arm64 linux 6 분석 2025. 5. 3. 15:34
이전 1 2 3 4 ··· 13 다음
이전 다음
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
  • 링크드인
  • 깃허브
TAG
  • ad skip
  • Visual Studio
  • 에러 위치 찾기
  • mysql
  • chrome-extension
  • vrpit
  • hole-punching
  • 코어 남기기
  • 영상 픽셀화 하기
  • Reciprocal n-body Collision Avoidance
  • Golang
  • RVO
  • 면접
  • 봄날에 스케치
  • shared_from_this
  • red underline
  • 클래스 맴버 변수 출력하기
  • 카카오
  • cockroach db
  • Quest2
  • vr핏
  • set value
  • boost
  • C++
  • SuffixArray
  • 우리는 vr핏이라고 부릅니다
  • Obstacle Avoidance
  • 잘못된 빨간줄
  • it's called a vrpit
  • print shared_ptr class member variable
more
«   2025/06   »
일 월 화 수 목 금 토
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
글 보관함

Blog is powered by Tistory / Designed by Tistory

티스토리툴바