[리눅스 커널] 유저 레벨 프로세스란
By Guillermo Austin Kim | 2018년 10월 15일 |
유저 레벨 프로세스에 대해 알아보기 전에 유저 모드가 무엇인지에 대해서 먼저 살펴봅시다. 우리가 라즈베리파이에서 바탕 화면에 있는 아이콘을 클릭해서 어떤 프로그램을 실행하고 있다고 가정합시다. 이 때 프로그램은 유저 모드나 커널 모드 중 하나로 동작합니다. ftrace 로그로 이 커널이 동작을 확인하면 정확히 유저 모드와 커널 모드를 자주 스위칭합니다. 유저 모드와 커널 모드로 나누는 기준은 무엇일까요? 이는 메모리 접근과 실행 권한으로 두 모드로 분류합니다. 실행 모드를 유저 모드와 커널 모드로 나누는 이유를 알기 위해 예를 들겠습니다. 어떤 시스템 메모리 공간을 0~4G까지 가상 메모리에서 연속으로 쓰고 있다고 가정합시다. 이 때 커널 코드와 전역 변수가 0~4G 메모리 구간에 메모리 주소로 매핑
리눅스에서 PDF 파일을 텍스트(txt) 파일로 변환
By 반달가면 | 2023년 1월 11일 |
리눅스에서 PDF 파일을 텍스트 파일로 변환하는 방법이다. 데비안/우분투 기준으로 poppler-utils 패키지에 포함된 pdftotext를 이용하면 된다. 만약 해당 패키지가 없다면 설치해 주면 되겠다. # S/W 저장소 정보 갱신 sudo apt-get update # 패키지 설치 sudo apt-get install poppler-utils 이제 변환을 해 보자. 예를 들어 my_text.pdf 파일을 텍스트 파일로 변환하여 my_text.txt로 저장하고 싶다면 아래와 같이 하면 된다. pdftotext my_text.pdf my_text.txt
[리눅스커널] 메모리관리/디버깅: kmalloc() 함수로 메모리 할당 후 슬랩 캐시 종류 확인하기
By Guillermo Austin Kim | 2019년 9월 3일 |
이번 소절에서는 가상주소를 물리주소로 변환하는 과정을 실습으로 알아봅시다. 3장 3.6 절에 소개한 rpi_debugfs.c 소스를 활용해 실습을 진행합니다. 먼저 rpi_debugfs.c 소스를 입력하고 커널 빌드를 하시기 바랍니다. 패치 코드 입력 방법 알아보기 먼저 입력할 패치 코드부터 소개합니다.[drivers/soc/bcm/rpi_debugfs.c] 01 static int rpi_kernel_debug_stat_set(void *data, u64 val)02 {03 int ret;04 05 raspbian_debug_state = (uint32_t)val;06 07 if ( raspbian_debug_state == 1402 ) {08 unsigned long ph
[리눅스커널] 워크큐(workqueue): __queue_work() 함수 분석하기
By Guillermo Austin Kim | 2019년 9월 16일 |
워크를 워크큐에 큐잉하는 핵심 동작은 __queue_work() 함수에서 수행합니다. 코드 분석을 통해 워크를 워크큐에 어떤 방식으로 큐잉하는지 살펴보겠습니다. 코드 분석에 앞서 __queue_work() 함수 선언부와 인자를 점검합시다.static void __queue_work(int cpu, struct workqueue_struct *wq, struct work_struct *work); queue_work() 함수에서 첫 번째 인자로 WORK_CPU_UNBOUND, 두 번째 인자로 system_wq 를 전달했으니 cpu는 WORK_CPU_UNBOUND, wq는 system_wq 시스템 워크큐 전역 변수 주소입니다. 함수 인자 목록을 정리하면 다음과 같습니다. int cpu: WORK_CP