본문 바로가기

IT 기술/리눅스 커널8

[C] _Generic keyword 너무나 오랜만에 커널을 다시 보게 되었다. 8년쯤 되었나보다. 그 때는 3.x 의 커널버전이었는데, 이제는 5.x 가 되었다. 소스를 들여다보니, 이런! 커널의 진입장벽은 더 높아졌고, 모르는 내용이 너무 많아서 차근히 정리해보기로 했다. 우선 _Generic keyword 부터 시작해보자! (커널은 5.4 를 기준으로 하였다) 이 코드를 보게 된 것은 sequence lock 을 보게 되면서이다. sequence lock (seqlock) 은 이후에 다시 설명하도록 한다. sequence lock 의 read 를 위해서 read_seqcount_begin() 이라는 매크로를 사용하는데, 여기서 코드를 따라가다보면, _Generic keyword 를 만나게 된다. 안녕? (__seqprop() 에서 _G.. 2021. 8. 26.
[linux] find_first_zero_bit() 분석 find_first_zero_bit(unsigned long *addr, unsigned long size) 함수는 addr 부터 시작해서 size(size 의 단위는 byte 가 아니라, bit 단위이다) 만큼 검색하면서 첫번째 cleared bit 을 찾는 함수이다. 함수가 정의한 대로 사용하면 그만이지만, 그 안에서 어떻게 구현했는지 궁금해졌다. 이 함수는 다음 파일에서 config 에 따라 다음과 같이 정의된다. 즉 CONFIG_GENERIC_FIND_FIRST_BIT 이 정의되어 있는 경우 _find_first_zero_bit_le() 함수가 호출되고, 정의되어 있지 않으면, find_next_bit() 이 호출된다. 각각에 대해서 알아보자 #ifdef CONFIG_GENERIC_FIND_FIR.. 2013. 5. 14.
sparse : kernel static analysis tool 커널 코드를 보다 보니 이상한 문법의 코드가 있어서 확인해보았다. 203 static int expand_fdtable(struct files_struct *files, int nr) 204 __releases(files->file_lock) 205 __acquires(files->file_lock) 206 { expand_fdtable() 함수를 보면, 파라미터 정의 다음 줄에 __releases / __acquires 라는 함수 비슷한 것이 정의되어있다. 이를 찾아보면 include/linux/compiler.h 파일에 다음과 같이 정의되어 있다. 6 #ifdef __CHECKER__ 7 # define __user __attribute__((noderef, address_space(1))) 8 # .. 2013. 2. 12.
커널 로컬 버전 세팅 리눅스 커널 버전을 나타내는 파일은 다음과 같이 2가지가 존재한다. 파일은 모두 컴파일시에 생성된다.include/config/kernel.releaseinclude/generated/utsrelease.h위 파일중 utsrelease.h 내에 정의된 UTS_RELEASE 의 값이 실제 uname 에서 보여지는 커널의 버전이 된다.systemTap 을 사용해서 특정 모듈을 올리는데, kernel.release 와 UTS_RELEASE 가 다르다고 해서 모듈로딩이 실패하는 상황이 발생하였다.코드를 찾아보니 Makefile 에서 KERNEL_RELEASE 대신 KERNEL_VERSION 을 UTS_RELEASE 에 넣도록 수정을 해놓은 상황.. 이렇게 되어서 kernel.release 와 utsrelease.. 2012. 11. 9.