Source: cakehonolulu/pciem
๐ฃ Hook: ๋ธ๋ฃจ์คํฌ๋ฆฐ(Kernel Panic) ์๋ ๋๋ผ์ด๋ฒ ๊ฐ๋ฐ?
๋ฆฌ๋ ์ค ๋๋ผ์ด๋ฒ ๊ฐ๋ฐ์์ ์ผ์์ ๊ณ ํต์ค๋ฝ์ต๋๋ค. ์ฝ๋ ํ ์ค ์๋ชป ์ง๋ฉด ์์คํ ์ด ๋ฉ์ถ๊ณ , ์ฌ๋ถํ ํด์ผ ํ๋๊น์. "ํ๋์จ์ด๊ฐ ์์ง ์ ๋์๋๋ฐ ๋๋ผ์ด๋ฒ๋ถํฐ ์ง์ผ ํ๋" ์ํฉ์ด๋ผ๋ฉด ๋ ๋ง๋งํฉ๋๋ค.
PCIem์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ํ๋์จ์ด๋ฅผ ์ํํธ์จ์ด(Userspace)๋ก ์๋ฎฌ๋ ์ด์ ํ์ฌ, ๋ฆฌ๋ ์ค ์ปค๋์ด "์, ์ง์ง PCIe ์นด๋๊ฐ ๊ฝํ๊ตฌ๋"๋ผ๊ณ ์ฐฉ๊ฐํ๊ฒ ๋ง๋ญ๋๋ค.
๐ ๏ธ How-to: ์ค์น ๋ฐ ์คํ
์ด ๋๊ตฌ๋ ์ปค๋ ๋ชจ๋(pciem.ko)๊ณผ ์ ์ ์คํ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
1๋จ๊ณ: ๋น๋ ๋ฐ ์ปค๋ ๋ชจ๋ ๋ก๋
git clone https://github.com/cakehonolulu/pciem.git
cd pciem
make
sudo insmod kernel/pciem.ko
2๋จ๊ณ: ๊ฐ์ง ๋๋ฐ์ด์ค ๋ง๋ค๊ธฐ (Userspace)
์ ์ ์คํ์ด์ค์์ C ์ฝ๋๋ก ๊ฐ์ง ํ๋์จ์ด์ ๋์์ ์ ์ํฉ๋๋ค.
// ๊ฐ์ง BAR(Base Address Register) ์ค์
struct pciem_bar my_bar = {
.size = 4096,
.flags = PCI_BASE_ADDRESS_SPACE_MEMORY,
};
// ๊ฐ์ง ๋๋ฐ์ด์ค ๋ฑ๋ก
pciem_register_device(&my_dev);
์ด์ lspci ๋ช
๋ น์ด๋ฅผ ์น๋ฉด ๋น์ ์ด ๋ง๋ ๊ฐ์ง ๋๋ฐ์ด์ค๊ฐ ๋ฆฌ์คํธ์ ๋น๋๋ค!
๐ง The Strategy: ์ํคํ ์ฒ์ ๋ฏธํ
1. ํ๋์จ์ด ๋ก์ง์ ์ํํธ์จ์ด๋ก ๊ฒฉ๋ฆฌ
์ผ๋ฐ์ ์ธ ์๋ฎฌ๋ ์ดํฐ(QEMU ๋ฑ)๋ ์ ์ฒด ์์คํ ์ ๊ฐ์ํํ์ง๋ง, PCIem์ Host OS ์์์ ํน์ ๋๋ฐ์ด์ค๋ง ๊ฐ์ํํฉ๋๋ค.
- ์ฅ์ : ์๋ฎฌ๋ ์ดํฐ์ ๋๋ฆฐ ์๋ ์์ด, ๋ค์ดํฐ๋ธ ์๋๋ก ๋๋ผ์ด๋ฒ๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
- ํ์ฉ: ์์ง ์ถ์๋์ง ์์ ASIC ์นฉ์ ์ํ ๋๋ผ์ด๋ฒ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ๋ฐํ ๋ ์ต์ ์ ๋๋ค.
2. ๊ณ ๊ธ ๊ธฐ๋ฅ ์ง์
๋จ์ํ ๋ ์ง์คํฐ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ง ํ๋ด ๋ด๋ ๊ฒ ์๋๋๋ค.
- DMA(Direct Memory Access): ๊ฐ์ง ํ๋์จ์ด๊ฐ ์์คํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๋ ์ฒํ ์ ์์ต๋๋ค. (IOMMU ์ง์)
- Interrupts: MSI/MSI-X ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์์ผ ๋๋ผ์ด๋ฒ์ ISR(์ธํฐ๋ฝํธ ํธ๋ค๋ฌ)์ ํ ์คํธํ ์ ์์ต๋๋ค.
MAX5์ ์๊ฐ ๐ฏ
๐จโ๐ป ๋ฐ์ด๋ธ ์ฝ๋ฉ ๋ ์ํผ
Claude์๊ฒ ๊ฐ์ง ํ๋์จ์ด ์คํ์ ๋์ ธ์ฃผ๊ณ ๋๋ผ์ด๋ฒ ์ด์์ ์ง๋ผ๊ณ ํด๋ด.
"๊ฐ์์ 10G ๋คํธ์ํฌ ์นด๋๋ฅผ ๋ง๋ค๊ณ ์ถ์ด. PCIem ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์, ํจํท์ ๋ฐ์ผ๋ฉด ๋ก๊ทธ๋ฅผ ์ฐ๊ณ ํ๊ธฐํ๋ ๊ฐ๋จํ Userspace C ์ฝ๋๋ฅผ ์์ฑํด์ค."
๐ธ ์ฌ์ด๋ ํ๋ก์ ํธ ์์ด๋์ด
"Driver Dojo": ์ค์ ํ๋์จ์ด ์์ด ๋ฆฌ๋ ์ค ์ปค๋ ๋๋ผ์ด๋ฒ ์์ฑ์ ์ฐ์ตํ ์ ์๋ ๊ต์ก์ฉ ํ๋ซํผ. "์ค๋์ ๊ฐ์ง ์ฌ์ด๋์นด๋ ๋๋ผ์ด๋ฒ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์" ๊ฐ์ ๋ฏธ์ ์ ์ฃผ๋ ๊ฑฐ์ง.
์นดํ
๊ณ ๋ฆฌ: ai_tools, ``