[ Section 0 ] 리눅스와 리눅스 커널 Overview

hyejinkwon·2024년 4월 18일

Linux Kernel

목록 보기
1/11
post-thumbnail

리눅스는 왜 배워야 할까?

  • 리눅스는 IT 산업 전반에서 쓰는 운영체제
  • 휴대폰, 클라우드 서버, 네트워크 장비
  • 전기 자동차와 IoT 디바이스
  • 네트워크, 브라우저, 보안 유틸리티 등 수많은 프로그램이 리눅스 기반 환경에서 동작
  • 운영체제 핵심 기능, 메모리 시스템, 파일 시스템과 SD카드 각종 보안 기술과 같은 IT 제반 기술을 소스 코드로 분석

리눅스 커널은 왜 배워야 할까?

  • Device Driver는 커널 함수를 호출하는 방식으로 구현되어 있기 때문에 임베디드 리눅스 혹은 BSP(Board Support Package)개발자로 Device Driver 개발을 잘 하려면 리눅스 커널을 배워야 함
  • 시스템 SW 개발자의 스택 : BootLoader + Device Driver
  • 고급 리눅스 시스템 프로그래머(문제해결능력)가 되려면 리눅스 커널을 알아야 함
  • 운영체제의 핵심 원리를 소스코드 분석으로 배울 수 있음
  • IT 산업을 이루는 제반 기술의 세부 구현 방식을 알 수 있음

  • 리눅스 Device Driver

리눅스 커널에서 제공하는 표준 API 사용 Device 파일


  • 프로세스는 자신의 스택 공간에서 실행
    프로세스는 자신의 속성 정보를 task descriptor 구조체에 저장함
    그 task descriptor를 리눅스 커널에서 할당해줌
    고정된 사이즈의 stack공간을 할당해줌
    함수 호출을 하게되면 프로세스는 자신의 stack공간을 사용하는데,
    이때 함수가 깊어지면, (함수 호출이 많아지면) stack overflow 발생할 수도!
kenel/fork.c
static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
{
	struct task_struct *tsk;
    unsigned long *stack;
    struct vm_struct *stack_vm_area _maybe_unused;
    int err;
    
    if(node == NUMA_NO_NODE)
    	node = fsk_fork_get_node(orig);
        
    // task descriptor struct 할당
    tsk = alloc_task_struct_node(node); 
    if(!tsk)
   		return NULL;
        
    // stack 할당
    stack = alloc_thread_stack_node(tsk,node);
    if(!stack)
    	goto free_tsk;
        
    stack_vm_Area = task_stack_vm_area(tsk);
	err = arch_dup_task_struct(tsk,orig);
    tsk->stack = stack;
}
  • _arm64_sys_clone()함수
    리눅스 커널에서 process type은 1. user 프로세스 2. kernel 프로세스
    프로세스는 부모, 자식, 형제관계를 이룸
    user 프로세스는 부모 process의 도움을 받아 clone(복제)가 됨
    kernel 프로세스는 부팅 과정 시 생성되는데 이도 부모 process를 clone함
kernel.fork.c
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, int _user *, parent_tidptr, unsigned long, tis, int _user *, child_tidptr)
{
	struct kernel_clone_args args = {
		.flags		= (lower_32_bits(clone_flags) & ~CSIGNAL),
		.pidfd		= parent_tidptr,
		.child_tid	= child_tidptr,
		.parent_tid	= parent_tidptr,
		.exit_signal	= (lower_32_bits(clone_flags) & CSIGNAL),
		.stack		= newsp,
		.tls		= tls,
	};

	return kernel_clone(&args);
}
  • copy_process() 함수 part1
    부모 프로세스의 resource가 자식 process에 복사되는 과정을 통해 프로세스가 생성됨
kernel/fork.c
static _latent_entropy struct task_struct *copy_process(struct pid *pid, int trace, int node, struct kernel_clone_args *args)
{
	p = dup_task_struct(current, node);
    if(!p) goto fork_out;
// ...
	retval = copy_creds(p, clone_flags);
// ...
	/* Perform scheduler related setup. Assign this task to a CPU.*/
	retval = sched_fork(clone_flags, p);
// ...
	retval = security_task_alloc(p, clone_flags);
// ...
}

시스템 반도체 개발 과정의 이해

  • 개발 과정
1단계2단계3단계4단계5단계
Spec 확정FPGA 검증공정개발PackagingBSP 개발
RTL 설계(VeriLog)👣Code FreezeBack-End 개발👣DB Out공정개발👣Sample OutBring-upSystem👣Engineering Sample
합성/검증특성 평가Integration
  • IP란?
    Intellectual Property의 약자로 재사용 가능하도록 기능을 모듈화해 설계한 Core Design
    Digital IP / Mixed IP

[1] IP 로직 설계

  • 로직 설계 단계에서 로직 설계 개발자와 시스템 소프트웨어 개발자가 관련 내용
  • 중요한 개발 단계 ( DB Out )

[2] 파운드리에서 공정 개발

  • 펩리스 업체는 대부분 로직 설계만 담당
  • 파운드리 업체에서 chip 공정 개발

[3] 시스템 소프트웨어 개발

  • Bring-Up
  • 전원이나 클럭을 조정하며 특성 평가 테스트
  • IP를 안정화하거나 시스템을 안정화하는 디버깅 수행

    Linux Device Driver를 이용해 IP 제어

리눅스가 인기 있는 이유

  • 커널은 물론 리눅스를 구성하는 대부분의 유틸리티 프로그램은 오픈소스라 누구나 소스코드를 볼 수 있음
  • 리눅스의 가장 큰 매력은 누구나 리눅스 프로젝트에 참가해 자신이 작성한 코드를 배포할 수 있음
  • 리눅스 커뮤니티의 힘이 막강함
  • 리눅스는 다양한 CPU 아키텍처를 지원
  • 리눅스를 제대로 배우면 다양한 산업군에서 활용

1개의 댓글

comment-user-thumbnail
2024년 5월 6일

잘 보고 갑니다. 감사합니다.

답글 달기