Start_Kernel (Week 4)
Start_Kernel (Week 4)

Start_Kernel (Week 4)

카테고리
⚙️ Start Kernel
작성자
박용성박용성
작성일
2024년 06월 02일
태그
C
Linux
Slug
start-kernel-4

번외!

asmlinkage

  • 함수가 호출될 때 인자들이 레지스터가 아닌 스택을 통해 전달되어야 함을 나타낸다.
  • 주로 시스템 콜이나 인터럽트 핸들러와 같이 어셈블리 언어와의 인터페이스에서 사용됨
 

__visible

  • 함수가 다른 파일에서도 보이게 해야 함을 나타냄
  • 주로 모듈 간에 함수가 공유될 필요가 있을 때 사용됨, 이는 정적 링킹(static linking) 시에 해당 함수가 외부에서 접근 가능하도록 함
 

__init

  • 이 매크로는 함수가 초기화 코드의 일부임을 나타냄
  • 초기화가 완료된 후에는 메모리에서 해당 함수를 해제할 수 있음을 컴파일러에게 알림
    • → 효율적인 커널 메모리 활용
 

__no_sanitize_address

  • 주소 산정 오류 검사(Address Sanitizer, ASan)를 비활성화
  • ASan은 메모리 오류를 탐지하는 도구로, 런타임에 메모리 접근을 확인하여 오류를 찾아냄
  • 일부 낮은 수준의 커널 코드에서는 이 기능을 비활성화할 필요가 있음
 

__noreturn

  • 함수가 반환되지 않음을 나타냄
    • 즉 종료 함수를 호출하거나, 시스템을 재부팅 하거나, 아니면 계속 다른 코드를 실행함

__no_stack_protector

  • 스택 보호기능(Stack Protector)을 비활성화
  • 스택 보호기능은 함수의 반환 주소나 로컬 변수들이 버퍼 오버플로우 공격에 의해 손상되는 것을 방지하기 위해 사용되는 보안 기능
  • 그러나, 커널의 특정 부분에서는 이 기능이 성능 저하를 일으킬 수 있으므로 비활성화가 필요할 수 있음
 

boot_cpu_init()

💡
첫 번째 프로세서 활성화 수행

/* * Activate the first processor. */ void __init boot_cpu_init(void) { int cpu = smp_processor_id(); /* Mark the boot cpu "present", "online" etc for SMP and UP case */ set_cpu_online(cpu, true); set_cpu_active(cpu, true); set_cpu_present(cpu, true); set_cpu_possible(cpu, true); #ifdef CONFIG_SMP __boot_cpu_id = cpu; #endif }
  1. smp_processor_id() 를 사용해 현재 CPU의 ID를 가져옴
  1. set_cpu_online(), set_cpu_active(), set_cpu_present(), set_cpu_possible() 를 사용해 CPU의 상태를 설정.
    1. SMP (Symmetric Multiprocessing)UP (Uniprocessor) 시스템 모두를 고려한다.
  1. SMP 환경에서는 부팅 CPU의 ID를 __boot_cpu_id 변수에 설정
 
 

page_address_init()

💡
페이지 주소의 해시 테이블을 초기화

void __init page_address_init(void) { int i; for (i = 0; i < ARRAY_SIZE(page_address_htable); i++) { INIT_LIST_HEAD(&page_address_htable[i].lh); spin_lock_init(&page_address_htable[i].lock); } }
  1. page_address_htable 배열의 각 항목에 대해 루프를 실행
  1. 각 항목에 대해 INIT_LIST_HEAD() 매크로를 사용하여 연결 리스트 헤드를 초기화
    1. → 동일한 해시 버킷에 속하는 페이지 주소들을 저장하는 데 사용됨
  1. spin_lock_init() 함수를 사용하여 해당 버킷의 락을 초기화
    1. → 다중 스레드 환경에서 동시에 여러 스레드가 해당 버킷에 접근하는 것을 방지하기 위해 사용됨
 

버킷 (bucket)

해시 테이블에서 사용되는 용어로, 해시 함수에 의해 결정된 위치를 말함
 

pr_notice("%s", linux_banner);

💡
시스템 부팅 메세지 출력
/** * pr_notice - Print a notice-level message * @fmt: format string * @...: arguments for the format string * * This macro expands to a printk with KERN_NOTICE loglevel. It uses pr_fmt() to * generate the format string. */ #define pr_notice(fmt, ...) \ printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
 
 

cat /proc/cmdline → command_line
 
마운트 : 파일 시스템과 연결해서 씀 , virtual file system에 얹어서 마운트라 함
 
 
kernel_init부터

댓글

guest