프로세스 생성 분석 fork (태스크 복사 및 초기화 부분) - 2
·
Linux
fork가 호출되면 결국 kernel_clone이 호출된다는 사실을 알았다.kernel_clone에서는 kernel_clone_args, pt_regs 등등 구조체를 많이 사용하는데,어떤 구조체인지 알아보자. (코드가 너무 긴건, linux 깃헙 링크로 대체한다) 일단 kernel_clone에서는 전달받은 kernel_clone_args를 다른 함수의 인자로 많이 넘긴다.pid_t kernel_clone(struct kernel_clone_args *args){ u64 clone_flags = args->flags; struct completion vfork; struct pid *pid; struct task_struct *p; int trace = 0; pid_t nr; if ((clone_flags..
프로세스 생성 분석 fork(콜 스택) - 1
·
Linux
fork ↓ call __sys_ret(sys_fork()) ↓ call sys_fork()에서 __NR_clone일때, return my_syscall5(__NR_clone, SIGCHLD, 0, 0, 0, 0); 반환(ARM64는 __NR_fork가 아니라, __NR_clone임) my_syscall5는 이렇게 정의되어있음.#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \({ \ register long _num __asm__ ("x8") = (num); ..
커널에서 static inline 함수선언과 wrapping
·
Linux
static inline드라이버 분석중에특정 함수 호출을 추적해보니 다른 파일에서 static inline으로 선언되어있는걸 알았다. 예를 들어서,mem.c에서 register_chrdev를 호출,register_chrdev를 추적해보니 다른 include/linux/fs.파일에서 static inline으로 선언됨. inline키워드를 붙이면, 컴파일시에 코드 자체를 호출장소에 삽입.즉, register_chrdev가 호출된 장소에 register_chrdev코드 자체를 삽입.이 코드 삽입 자체가 compile time에 이뤄져야해서 .h에 선언됨. static 키워드를 붙이면, 다른 파일에서 사용이 불가능하지만, inline 키워드로 코드 자체를 삽입하기때문에문제 없다.왜?성능 최적화와 코드 안전성..
linux/drivers/char/mem.c 드라이버 분석
·
Linux
https://github.com/Jminu/linux/blob/master/drivers/char/mem.c linux/drivers/char/mem.c at master · Jminu/linuxLinux kernel source tree. Contribute to Jminu/linux development by creating an account on GitHub.github.com일단 mem.c의 코드를 보면그렇게 엄청나게 길지는 않다.그리고 구현이 가장 쉬운 문자 디바이스 드라이버라 분석이 그렇게 까다롭지 않을 것 같다. 일단 마지막 부분에 보이는 코드를 보자fs_initcall은 모듈을 시작하는 함수이다.fs_initcall을 좀 더 들어가보자. grep으로 긁었더니,이렇게 나오고, fs_ini..
objdump활용 vmlinux 분석시 start address의미
·
Linux
objdump로 vmlinux를 분석했을 때,start address가 0xffffffc080000000이다. 즉, 처음 vmlinux가 실행될 메모리 주소가 이미 정해진 것이나 마찬가지인데이게 어떻게 가능할까라는 생각이 들었다. 만약 이미 이 주소를 다른 프로세스가 사용중일 수 있지 않을까?라는 생각이 들었다.간단하게 말하면, 다른 프로세스가 사용중일리가 없다.objdump로 vmlinux를 분석할 때 보이는 start address는 물리 메모리 주소를 의미한다.Kernel은 부팅될 때 부트로더에 의해 약속된 위치에 로드되기 때문이다. 반면, 일반 응용 프로그램의 경우 start address는 가상 메모리 주소를 의미한다.미리 고정된 가상주소를 할당하고, 실제 실행시에 MMU에 의해 실제 메모리의 ..
디바이스 드라이버
·
Linux
종류문자 디바이스 드라이버: 대부분의 디바이스 드라이버, 구현 간편블록 디바이스 드라이버네트워크 디바이스 드라이버버스 디바이스 드라이버디바이스 노드mknod [옵션] 타입c : 문자형b : 블록형주번호 : 드라이버마다 고유의 번호, 커널이 할당해주기도부번호 : 드라이버마다 고유의 번호, 드라이버가 할당을 관리문자 디바이스 드라이버드라이버는 리눅스에서 1바이트 단위로 데이터를 읽고 쓰는 장치를 제어하는 드라이버read(), write()와 같이 바이트 단위로 입출력을 처리하는 드라이버file_operations를 구현하는 드라이버open, read, write, lseek, close 같은 일반적으로 사용하는 파일 함수별도의 시스템콜 없이 새로운 기능 추가 가능 -> 가상 파일 시스템file_oper..