유저공간

Category
아이템: 유저(70)
포스트 갯수6

[리눅스커널] 시스템 콜: 유저 공간에서 전달한 문자열 처리 방법

By Guillermo Austin Kim | 2019년 7월 12일 | 
유저 공간에서 시스템 콜 아규먼트로 지정한 파일 이름은 커널 공간에 그대로 전달됩니다. 한 가지 예를 들어볼까요?[https://elixir.bootlin.com/linux/v4.19.30/source/fs/open.c]SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode){ if (force_o_largefile()) flags |= O_LARGEFILE; return do_sys_open(AT_FDCWD, filename, flags, mode);} 위 sys_open() 함수 첫 번째 아규먼트로 filename이 전달됩니다.이번에는 다른 예시를 들겠습니다.[https://elixir.bootlin.com/l

[라즈베리파이] 시스템 콜 - 유저 공간 시스템 콜 발생 어셈블리 코드 분석

By Guillermo Austin Kim | 2018년 11월 18일 | 
아키텍처별로 시스템 콜을 실행하는 동작은 다릅니다. 시스템 콜을 실행하는 동작은 어셈블리 코드로 구현되어 있습니다. 라즈베리파이가 탑재한 ARM(ARM32) 아키텍처에서는 시스템 콜은 다음과 같이 구현돼 있습니다.1. r0 ~ r5 레지스터에 시스템 콜로 전달할 인자 지정2. r7 레지스터에 시스템 콜 번호 저장3. "svc 0x00000000" 명령어 실행 GNU C 라이브러리 파일에서 실제 시스템 콜을 실행하는 어셈블리 코드를 봅시다. write() 함수에 대한 시스템 콜을 실행하는 코드를 소개합니다.00000020 <__libc_write>:1 20: e59fc060 ldr ip, [pc, #96] ; 88 <__libc_write+0x68>2 24: e79fc00c

[라즈베리파이] 시스템 콜 - 유저 공간에서 시스템 콜 발생

By Guillermo Austin Kim | 2018년 11월 14일 | 
유저 공간에서 커널 공간까지 어떤 코드로 시스템 콜을 구현했는지 분석을 시작합니다. 유저 모드에서 시스템 콜을 발생하면 커널 모드로 어떻게 스위칭하고 이후 시스템 콜 핸들러가 실행하는지 파악하는 것입니다. 가장 먼저 이런 의문이 생깁니다. 시스템 콜은 실행 시작점은 어디일까요? 유저 공간에서 리눅스 저수준 함수를 호출했을 때가 시스템 콜 실행의 출발점입니다. 다음 전체 시스템 콜 흐름도에서 검은색으로 된 부분입니다. 리눅스 저수준 함수를 호출하면 실행하는 GNU C 라이브러리(glibc)가 어떤 흐름올 시스템 콜을 호출하는지 알아봅시다. GNU C 라이브러리 실행 흐름유저 공간에서 시스템 콜을 실행하기 위해서는 저수준 표준 함수를 호출해야 합니다.저수준 표준 함수는 glibc 라이브러리에 구현돼 있어 실

[라즈베리파이] 시스템 콜 - 소프트웨어 인터럽트란

By Guillermo Austin Kim | 2018년 11월 8일 | 
소프트웨어 인터럽트를 한 문장으로 정의해 봅시다. 소프트웨어 인터럽트는 인터럽트가 아닙니다. 인터럽트는 하드웨어서 올려주는 전기 신호로 언제 발생할지 모르는 비동기적인 이벤트이나 통지입니다. 그런데 소프트웨어 인터럽트는 ARM 프로세서에서 제공하는 “svc” 어셈블리 명령어를 실행하면 동작합니다. 소프트웨어 인터럽트를 발생하는 주체는 소프트웨어 관점으로 프로세스입니다. 소프트웨어 인터럽트란 용어의 인터럽트는 하드웨어 디바이스에서 비동기적으로 전달하는 신호는 아닙니다. 실제 인터럽트가 발생하면 ARM 프로세서는 인터럽트를 익셉션의 한 종류로 처리합니다. 리눅스 커널에서 다음은 같이 동작합니다.1. 익셉션 발생(인터럽트는 비동기적인 신호)2. 익셉션 벡터로 ARM 프로그램 카운터를 이동3. 익셉션 벡터에서