Linux/kernel
-
[리눅스 커널] Symmetric Multi-Processing(SMP)Linux/kernel 2023. 8. 3. 02:32
글의 참고 - https://linux-kernel-labs.github.io/refs/heads/master/lectures/smp.html - https://en.wikipedia.org/wiki/Symmetric_multiprocessing - https://we.riseup.net/riseup+tech/balancing-hardware-interrupts - https://www.kernel.org/doc/Documentation/preempt-locking.txt - https://archive.kernel.org/oldlinux/htmldocs/kernel-hacking/routines-processorids.html - https://www.kernel.org/doc/Documentation..
-
[리눅스] Linux kernel headersLinux/kernel 2023. 8. 3. 02:28
글의 참고 - https://docs.kernel.org/kbuild/modules.html - https://unix.stackexchange.com/questions/47330/what-exactly-are-linux-kernel-headers 글의 전제 - 밑줄로 작성된 글은 강조 표시를 의미한다. - 그림 출처는 항시 그림 아래에 표시했다. 글의 내용 : /lib/modules/$(shell uname -r)/build/ 폴더는 커널 헤더 및 커널 소스를 심볼릭 링크하는 폴더이다. 커널 헤더는 말 그대로 커널에서 사용하는 모든 헤더 파일의 집합체를 의미한다. 일반적으로 커널 헤더와 커널 소스는 `/usr/src/*`에 위치한다. 아래에서, `build/` 폴더가 `커널 헤더`를 가리키는 것을 확인..
-
[LINUX][KERNEL] sysfs attribute 구조체 및 매크로 상속 관계Linux/kernel 2023. 8. 3. 02:28
목적 - 어느 날 문득 sysfs attribute를 만들려고 하는데, ATTR과 DEVICE_ATTR 중에 뭘 써야할 지 고민했다. 그래서 정리를 좀 해보려고 한다. 내용 - 결론부터 말하면 모든 *_DEVICE_ATTR[_*] 패밀리들은 결국 ATTR[_*]을 상속한다. 결국 최상위가 ATTR[_*]란 소리이다. 구조는 아래와 같다. /include/linux/sysfs.h struct attribute { const char*name; umode_tmode; #ifdef CONFIG_DEBUG_LOCK_ALLOC boolignore_lockdep:1; struct lock_class_key*key; struct lock_class_keyskey; #endif }; ... ... /include/li..
-
[LINUX][KERNEL] sysfs store/show 함수의 반환값Linux/kernel 2023. 8. 3. 02:28
글 쓴 목적 - sysfs에 attribute를 만들면서 매번 반환값을 sprintf() 함수로 반환했는데, 상황에 따라 어떤 반환값을 반환해야 하는지를 이번에 정확히 알아보자. 내용 - 커널의 공식 문서를 참고하는게 가장 좋은 방법으로 보인다. 아래 Reference에서 제일 첫 번째 링크를 참고했다. 내가 중요하다 생각되는 부분만 가져왔다. 1. sysfs는 buffer의 사이즈를 PAGE_SIZE 만큼 할당하고 store() / show() 함수에 전달한다. 2. show() 함수는 buffer에 써진 바이트의 수를 반환해야 한다. 3. show() 함수는 formating value를 return 해야 하는 경우 sysfs_emit() or sysfs_emi_at() 함수를 사용해야 한다. for..
-
[리눅스 커널] Interrupt - high level referenceLinux/kernel 2023. 8. 3. 02:27
글의 참고 - http://books.gigatux.nl/mirror/kerneldevelopment/0672327201/ch06lev1sec7.html - http://www.makelinux.net/ldd3/chp-10-sect-3.shtml - https://elixir.bootlin.com/linux/v4.10.5/source/kernel/irq/manage.c#L98 - https://www.kernel.org/doc/html/v4.16/core-api/genericirq.html 글의 전제 - 밑줄로 작성된 글은 강조 표시를 의미한다. - 그림 출처는 항시 그림 아래에 표시했다. 글의 내용 - Overview " low-level IRQ handler 는 주로 칩 제조사에서 만든다. 그러나, ..
-
[리눅스 커널] platform driver probe를 호출하는 4가지 방법.Linux/kernel 2023. 8. 3. 02:27
글의 참고 - https://docs.kernel.org/driver-api/driver-model/platform.html - https://linux-kernel-labs.github.io/refs/heads/master/labs/device_model.html#overview 글의 전제 - 밑줄로 작성된 글은 강조 표시를 의미한다. - 그림 출처는 항시 그림 아래에 표시했다. 글의 내용 - /driver/base/platform.c::platform_match() 함수에 probe()를 호출하는 4가지 조건이 있다. /** * platform_match - bind platform device to platform driver. * @dev: device. * @drv: driver. * * Pla..
-
[커널][디바이스트리] 디바이스 트리에서 8, 16, 64 비트값 선언하고 읽기.Linux/kernel 2023. 8. 3. 02:25
디바이스 트리에서 특정 노드에 정수형 프로퍼티를 선언할 경우, 아래와 같이 선언할 수 있다. gpclk0_gpio4: gpclk0_gpio4 { brcm,pins = ; brcm,function = ; }; gpclk1_gpio5: gpclk1_gpio5 { brcm,pins = ; brcm,function = ; }; gpclk1_gpio42: gpclk1_gpio42 { brcm,pins = ; brcm,function = ; }; `brcm,pins` , `brcm,function`, `brcm,pull` 기본적으로 모두 unsigned int 로 선언된 프로퍼티들이다. 위에 값들을 불러올 때, 값이 작다고 of_read_property_u8(), of_read_property_u16() 함수를 호..
-
[커널][디바이스트리] Label을 사용하는 이유와 참조시 주의점Linux/kernel 2023. 8. 3. 02:25
디바이스트리에 노드를 작성할 때, 아래와 같은 양식을 따른다. [ Label : ] Name@[ Addres ] : { ... } 대괄호로 묶인 Label과 Address는 옵션이다. 여기서 Label을 사용하는 이유와 참조시 주의점에 대해 알아보자. 1. Label을 선언하는 이유는 해당 노드를 참조하기 위해서는 반드시 Label을 선언한다. soc { rpi3b { compatible = "rpi3b"; }; }; // compile error 1 &rpi3b { phandle = ; }; rpi3b 노드는 레이블이 선언하지 않았기 때문에, 컴파일 에러를 낸다. 2. 특정 노드의 프로퍼티를 수정하기 위해 노드를 참조할 경우, 가장 최상위에 &{NODE_NAME} 식으로 선언해야 한다. soc { rp..