1000sj
SJ CODE
1000sj
전체 방문자
오늘
어제
  • 분류 전체보기
    • Algorithms
      • Crypto
      • Formal Methods
    • Security
      • Fuzzing
      • Exploit
    • System Programming
      • Kernel
      • Compiler
      • Device Driver
      • Emulator
      • Assembly
      • Memory
      • Network
    • Architecture
      • ARM
      • RISC-V
    • Cloud Computing
      • Infrastructure
      • SDN
    • TroubleShooting
    • Performance improvements
      • Parrelel Processing
      • HPC
    • ETC
      • 문화 생활
      • 커뮤니티

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
1000sj

SJ CODE

System Programming/Kernel

xv6 #1 booting in xv6

2025. 5. 5. 23:20

 

커널 시작 과정

 

linker와 entry 설정

kernel.ld 파일은 링커 스크립트로 커널 코드를 메모리에 어떻게 배치할지 알려준다. 

  • kernel.ld 에서는 대상 아키텍쳐 와 Entry point (코드 실행 시작 지점)을 지정한다.
  • CPU가 실행하는 첫 번째 코드 블럭은 _entry 로 entry.S에 정의되어있다.
  • 이 _entry 섹션의 시작 주소는 0x80000000 다.

주소 0x00000000 ~ 0x80000000 영역은 QEMU/RISC-V 구조 상 디바이스 IO 용 영역으로 사용되고 실제 커널 코드는 0x80000000 부터 시작된다.

 

커널 코드 블럭 종류

다음과 같은 4가지 세그먼트가 커널에 포함된다.

  • text: kernel code
  • rodata: 읽기 전용 상수 데이터
  • data: 읽기/쓰기 가능한 초기화된 변수들
  • bss: 초기화 되지 않는 변수들 (0으로 초기화됨)

 

멀티 코어(Multi Core) 환경 준비

xv6 멀티 코어 시스템을 지원하며 모든 CPU는 고유한 ID (hartid) 를 가진다. 이 hartid는 control status register (CSR) 를 통해 확인할 수 있다.

 

각 CPU 의 스택 설정

모든 CPU 는 _entry 코드로부터 시작하며 실행 전 자신만의 스택을 갖도록 설정해야 한다.

#define NCPU 8

 

최대 8개의 CPU가 있다고 가정하며 총 4096 * NCPU 바이트의 스택 공간을 확보한다.

__attribute__((aligned(16))) char stack[4096 * NCPU];

 

스택 포인터 계산 방식

 

References

  • https://oslab.kaist.ac.kr/ee488-fall-2022-homework-1/
  • https://xiayingp.gitbook.io/build_a_os/labs/lab-1-xv6-and-unix-utilities
  • sdfsdf

'System Programming > Kernel' 카테고리의 다른 글

sanitizer interceptor의 구현 원리  (0) 2026.01.19
    'System Programming/Kernel' 카테고리의 다른 글
    • sanitizer interceptor의 구현 원리
    1000sj
    1000sj

    티스토리툴바