ΠΊΠ°ΠΊ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΏΠΎΠ΄ linux
ΠΡΠ°ΠΉΠ²Π΅ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ² Π² Linux
Π§Π°ΡΡΡ 2: ΠΠΈΡΠ΅ΠΌ Π² ΠΊΠ»Π°ΡΡΠ΅ Π½Π°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π΄Π»Ρ Linux
ΠΡΠΈΠ³ΠΈΠ½Π°Π»: «Device Drivers, Part 2: Writing Your First Linux Driver in the Classroom»
ΠΠ²ΡΠΎΡ: Anil Kumar Pugalia
ΠΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ: December 1, 2010
ΠΠ΅ΡΠ΅Π²ΠΎΠ΄: Π.Π ΠΎΠΌΠΎΠ΄Π°Π½ΠΎΠ²
ΠΠ°ΡΠ° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°: ΠΈΡΠ½Ρ 2012 Π³.
Π‘Π²Π΅ΡΠ»Π°Π½Π° ΠΈ ΠΠ°Π³Ρ Π΄ΠΎΠ±ΡΠ°Π»ΠΈΡΡ Π² ΡΠ²ΠΎΠΉ ΠΊΠ»Π°ΡΡ Ρ ΠΎΠΏΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΡΠΆΠ΅ Π½Π°ΡΠ°Π» ΡΠΈΡΠ°ΡΡ Π»Π΅ΠΊΡΠΈΡ. Π‘Π²Π΅ΡΠ»Π°Π½Π° ΡΠΎΠ±ΠΊΠΎ ΠΏΠΎΠΏΡΠΎΡΠΈΠ»Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΠΎΠΉΡΠΈ. Π Π°Π·Π΄ΡΠ°ΠΆΠ΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΠΎΠΏΠΈ ΠΎΡΠ²Π΅ΡΠΈΠ»: «ΠΡ ΠΎΠ΄ΠΈΡΠ΅! ΠΡ, Π΄ΡΡΠ·ΡΡ, ΠΎΠΏΡΡΡ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΎΠΏΠΎΠ·Π΄Π°Π»ΠΈ, ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅»?
ΠΠ°Π³Ρ ΠΏΠΎΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΠ²Π΅ΡΠΈΠ», ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ ΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΈΠ·ΡΡΠ°ΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ β Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ² Π² Linux. ΠΠ°Π³Ρ Π±ΡΠ» Π±ΠΎΠ»Π΅Π΅, ΡΠ΅ΠΌ ΡΡΠ°ΡΡΠ»ΠΈΠ², ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΡΠΊΠ°Π·Π°Π»: «Π₯ΠΎΡΠΎΡΠΎ! Π’ΠΎΠ³Π΄Π° ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π² Linux. ΠΡΠ»ΠΈ Π²Ρ ΡΠΏΡΠ°Π²ΠΈΡΠ΅ΡΡ, ΡΠΎ Ρ ΠΏΡΠΎΡΡ Π²Π°Ρ ΠΎΠ±ΠΎΠΈΡ !». ΠΠ°Π³Ρ Π·Π½Π°Π», ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΡΡΠ°ΡΡΠ»ΠΈΠ²ΡΠΌ, ΡΡΠΎ β ΠΏΠΎΠΊΡΠΈΡΠΈΠΊΠΎΠ²Π°ΡΡ Windows.
ΠΠ½ ΠΎΠ±ΡΡΡΠ½ΠΈΠ»: «ΠΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΏΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² Π² Windows Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. Π Π΅ΡΠ»ΠΈ ΡΡΠΎ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅? ΠΠΎΡ Π³Π΄Π΅ Π²ΡΠΈΠ³ΡΡΠ²Π°Π΅Ρ Linux. Π Linux ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΈ Π²ΡΠ³ΡΡΠΆΠ°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ Π½Π° Π»Π΅ΡΡ, ΠΈ ΡΡΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ. ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² Π² Linux «.
ΠΡΠΎ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΠΈΠ»ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. «Π₯ΠΎΡΠΎΡΠΎ! ΠΠ΄ΠΈΡΠ΅ Π½Π° ΡΠ²ΠΎΠΈ ΠΌΠ΅ΡΡΠ°, Π½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΎΠΏΠ°Π·Π΄ΡΠ²Π°ΠΉΡΠ΅». ΠΡΠΎΡΠ΅ΡΡΠΎΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ» Π»Π΅ΠΊΡΠΈΡ: «Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠΆΠ΅ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ², Ρ, ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ², ΠΏΠΎΠΊΠ°ΠΆΡ Π²Π°ΠΌ, ΠΊΠ°ΠΊ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΈ Π²ΡΠ³ΡΡΠΆΠ°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°».
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ²
Π ΠΈΡ.1: ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Linux
Π§ΡΠΎΠ±Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΈ Π²ΡΠ³ΡΡΠΆΠ°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ /sbin ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ root:
Π ΠΈΡ.2: ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ Linux
ΠΠ°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π΄Π»Ρ Linux
Π‘Π±ΠΎΡΠΊΠ° Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°
ΠΠΎΠ΄Π²Π΅Π΄Π΅ΠΌ ΠΈΡΠΎΠ³
ΠΠΎΠΌΠ°Π½Π΄Π° lsmod Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π°ΠΌ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ofd Π·Π°Π³ΡΡΠΆΠ΅Π½.
ΠΠΈΡΠ΅ΠΌ ΡΠ²ΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΏΠΎΠ΄ Linux
Π₯ΠΎΡΡ ΠΏΡΠΈΠ·Π½Π°ΡΡΡΡ ΡΡΠ°Π·Ρ, ΡΡΠΎ Ρ Π²Π°Ρ ΠΎΡΡΠ°ΡΡΠΈ ΠΎΠ±ΠΌΠ°Π½ΡΠ», ΠΈΠ±ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, Π΅ΡΠ»ΠΈ Π²Π΅ΡΠΈΡΡ Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ β ΡΡΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΡΡΠ³Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° (ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°) ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΌΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½Π΅ΠΊΡΡ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΡ Π΄Π»Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°, Ρ.ΠΊ. Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½ΠΈ Ρ ΠΊΠ°ΠΊΠΈΠΌ ΠΆΠ΅Π»Π΅Π·ΠΎΠΌ ΠΌΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ. ΠΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ°ΠΌΠΈ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠΆΠ΅Π»Π°Π΅ΡΠ΅.
Π’ΠΎ, ΡΡΠΎ ΠΌΡ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ, ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π΅Π΅ Π±ΡΠ΄Π΅Ρ Π½Π°Π·Π²Π°ΡΡ LKM (Linux Kernel Module ΠΈΠ»ΠΈ Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΄ΡΠ°). Π‘ΡΠΎΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ β ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠ΅ΠΉ LKM.
ΠΠΈΡΠ°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ ΡΠ΄ΡΠ° Π»ΠΈΠ½Π΅ΠΉΠΊΠΈ 2.6. LKM Π΄Π»Ρ 2.6 ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ 2.4. Π― Π½Π΅ Π±ΡΠ΄Ρ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠΈΡΡ , ΠΈΠ±ΠΎ ΡΡΠΎ Π½Π΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠ°ΠΌΠΊΠΈ ΠΏΠΎΡΡΠ°.
ΠΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ /dev/test, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π½Π°ΡΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ. Π₯ΠΎΡΡ ΡΡΠ°Π·Ρ ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΡΡΡ, ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ /dev, ΠΏΡΠΎΡΡΠΎ ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ Β«Π΄ΡΠ΅Π²Π½Π΅Π³ΠΎ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΈΡΡΠ°Π»Π°Β».
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ
ΠΡΠ»ΠΈ ΠΊΡΠ°ΡΠΊΠΎ, ΡΠΎ LKM β ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΠΆΠ΅ Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΄ΡΠ° Linux. Π’.Π΅. ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΎΠ½ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠ΄ΡΠ°, Π° Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π’Π°ΠΊ ΡΡΠΎ Π½Π΅ ΡΡΠΎΠΈΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅. Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ, Π·Π°ΠΊΡΠ°Π²ΡΠ΅ΠΉΡΡ Π² ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ kernel panic. ΠΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΠ».
ΠΠΎΠ΄ΡΠ»Ρ ΡΠ΄ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 2 ΡΡΠ½ΠΊΡΠΈΠΈ: ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡ ΠΎΠ΄Π°. ΠΠ΅ΡΠ²Π°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΡΠ΄ΡΠ°, Π° Π²ΡΠΎΡΠ°Ρ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΡΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ΅ Π΅Π³ΠΎ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Π΄Π°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ°ΠΊΡΠΎΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ: module_init ΠΈ module_exit.
Π‘ΡΠΎΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠ² ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ printk(). ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ β ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² Π»ΠΎΠ³ ΡΠ΄ΡΠ° Π½Π΅ΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
Π’.ΠΊ. Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠ΄ΡΠ°, ΡΠΎ ΠΎΠ½ ΠΎΡΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΎΡ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. Π Π½Π°ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π΅ΡΠ½ΡΡΡ Π½Π΅ΠΊΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ put_user(). ΠΠ½Π° ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠΈΠ΄ΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΡΠ΄ΡΠ° Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅.
Π₯ΠΎΡΡ Π΅ΡΡ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ°ΡΡ ΡΠ»ΠΎΠ² ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ .
ΠΠ΅ΠΆΠ΄Ρ ΡΠ»ΠΎΠ²ΠΎΠΌ Β«diskΒ» ΠΈ Π΄Π°ΡΠΎΠΉ Π΅ΡΡΡ Π΄Π²Π° ΡΠΈΡΠ»Π° ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π½ΡΡ Π·Π°ΠΏΡΡΠΎΠΉ. ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ ΡΡΠ°ΡΡΠΈΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π‘ΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠ°ΠΆΠ΄ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ.
Π― Π½Π΅ Π±ΡΠ΄Ρ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡΡ Π² ΡΠ΅ΠΎΡΠΈΡ, Ρ.ΠΊ. ΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ β ΡΠΎΡ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΌ ΠΏΠΎΡΠΈΡΠ°ΡΡ ΠΏΡΠΎ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅. Π― Π΄Π°ΠΌ ΡΡΡΠ»ΠΊΡ Π² ΠΊΠΎΠ½ΡΠ΅.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ
ΠΠ»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ΄ΡΠ°.
Π debian/ubutnu ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΊ (ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ Π΄Π»Ρ 2.6.26-2-686):
apt-get install linux-headers-2.6.26-2-686
ΠΠΈΠ±ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ΄ΡΠ° ΡΠ°ΠΌΠΈΠΌ: fakeroot make-kpkg kernel_headers
ΠΡΡ ΠΎΠ΄Π½ΠΈΠΊ
// ΠΠΈΠΆΠ΅ ΠΌΡ Π·Π°Π΄Π°ΡΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΌΠΎΠ΄ΡΠ»Π΅, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Modinfo
MODULE_LICENSE( «GPL» );
MODULE_AUTHOR( «Alex Petrov
» );
MODULE_DESCRIPTION( «My nice module» );
MODULE_SUPPORTED_DEVICE( «test» ); /* /dev/testdevice */
#define SUCCESS 0
#define DEVICE_NAME «test» /* ΠΠΌΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° */
// ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π½Π°ΡΠΈΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
static int device_open( struct inode *, struct file * );
static int device_release( struct inode *, struct file * );
static ssize_t device_read( struct file *, char *, size_t, loff_t * );
static ssize_t device_write( struct file *, const char *, size_t, loff_t * );
// ΠΡΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ
static struct file_operations fops =
<
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
>;
// Π€ΡΠ½ΠΊΡΠΈΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ. ΠΡ
ΠΎΠ΄Π½Π°Ρ ΡΠΎΡΠΊΠ°. ΠΠΎΠΆΠ΅ΠΌ ΡΡΠΈΡΠ°ΡΡ ΡΡΠΎ ΡΡΠΎ Π½Π°Ρ main()
static int __init test_init( void )
<
printk( KERN_ALERT «TEST driver loaded!\n» );
// Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌ ΡΡΡΡΠΎΠΉΡΠ²ΠΎ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π°
major_number = register_chrdev( 0, DEVICE_NAME, &fops );
// Π‘ΠΎΠΎΠ±ΡΠ°Π΅ΠΌ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½Π½ΡΠΉ Π½Π°ΠΌ ΡΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π°
printk( «Test module is loaded!\n» );
// Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ
static void __exit test_exit( void )
<
// ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
unregister_chrdev( major_number, DEVICE_NAME );
printk( KERN_ALERT «Test module is unloaded!\n» );
>
// Π£ΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ
module_init( test_init );
module_exit( test_exit );
static int device_open( struct inode *inode, struct file *file )
<
text_ptr = text;
static int device_release( struct inode *inode, struct file *file )
<
is_device_open—;
return SUCCESS;
>
static ssize_t device_read( struct file *filp, /* include/linux/fs.h */
char *buffer, /* buffer */
size_t length, /* buffer length */
loff_t * offset )
<
int byte_read = 0;
if ( *text_ptr == 0 )
return 0;
Π‘Π±ΠΎΡΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ
ΠΡ Π° ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Makefile:
Π ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ:
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎ Ρ Π½Π°Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ:
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅:
root@joker:/tmp/test# modinfo test.ko
filename: test.ko
description: My nice module
author: Alex Petrov
license: GPL
depends:
vermagic: 2.6.26-2-openvz-amd64 SMP mod_unload modversions
ΠΡ ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΡΠ΄ΡΠΎ:
root@joker:/tmp/test# insmod test.ko
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π΅ΡΡΡ Π»ΠΈ Π½Π°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ Ρ ΡΠΏΠΈΡΠΊΠ΅:
root@joker:/tmp/test# lsmod | grep test
Π ΡΡΠΎ ΠΏΠΎΠΏΠ°Π»ΠΎ Π² Π»ΠΎΠ³ΠΈ:
root@joker:/tmp/test# dmesg | tail
[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with ‘mknod /dev/test c 249 0’.
ΠΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½Π°ΠΌ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΠΎΡΠ»Π΅Π΄ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠΎΠ²Π΅ΡΡ:
root@joker:/tmp/test# mknod /dev/test c 249 0
ΠΡ ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ Π½Π°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ:
root@joker:/tmp/test# cat /dev/test
ΠΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΠΈΡΠΌ Π΄Π°Π½Π½ΡΡ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
root@joker:/tmp/test# echo 1 > /dev/test
bash: echo: ΠΎΡΠΈΠ±ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ: ΠΠ΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎ ΡΡΠΎ ΡΠΊΠ°ΠΆΠ΅Ρ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π° Π½Π°ΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
root@joker:/tmp/test# dmesg | tail
[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with ‘mknod /dev/test c 249 0’.
[829747.462715] Sorry, this operation isn’t supported.
root@joker:/tmp/test# rmmod test
Π ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎ ΠΎΠ½ Π½Π°ΠΌ ΡΠΊΠ°ΠΆΠ΅Ρ Π½Π° ΠΏΡΠΎΡΠ°Π½ΠΈΠ΅:
root@joker:/tmp/test# dmesg | tail
[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with ‘mknod /dev/test c 249 0’.
[829747.462715] Sorry, this operation isn’t supported.
[829893.681197] Test module is unloaded!
Π£Π΄Π°Π»ΠΈΠΌ ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΡΡΠΎ Π±Ρ ΠΎΠ½ Π½Π°Ρ Π½Π΅ ΡΠΌΡΡΠ°Π»:
root@joker:/tmp/test# rm /dev/test
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ ΡΡΠΎΠΉ Β«Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠΈΒ» Π·Π°Π²ΠΈΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ Π²Π°Ρ. ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π΅Ρ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊ Π²Π°ΡΠ΅ΠΌΡ Π΄Π΅Π²Π°ΠΉΡΡ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΡΠ΄ΡΠ° Linux.
Π’ΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΡΠΈΡΠ»Π° ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π±Π΅Π·ΡΠΌΠ½Π°Ρ ΠΈΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ sudo ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π’.Π΅. ΠΏΠΎΡΡΠ»Π°Π΅ΠΌ Π² /dev/test ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΎΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ root.
ΠΠΈΡΠ΅ΡΠ°ΡΡΡΠ°
Π ΠΏΠΎΠ΄ ΠΊΠΎΠ½Π΅Ρ Π΄Π°ΠΌ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΊΠ½ΠΈΠ³Ρ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠΉ LKMPG (Linux Kernel Module Programming Guide)
UPD2:
ΠΠΎΠΏΡΠ°Π²ΠΈΠ» ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠ΅.
ΠΠ°ΡΡΠ΅Ρ Π³Π»ΡΡΠΈΡ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ‘MODULE_DEscriptION( Β«My nice moduleΒ» );’. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π² module_description Π²ΡΠ΅ Π±ΡΠΊΠ²Ρ Π·Π°Π³Π»Π°Π²Π½ΡΠ΅.
UPD3:
segoon ΠΏΡΠΈΡΠ»Π°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΎΠΊ ΠΊ ΠΏΠΎΡΡΡ:
1) Π ΡΡΠ½ΠΊΡΠΈΠΈ device_open() Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ race condition:
static int device_open( struct inode *inode, struct file *file )
<
text_ptr = text;
Π ΡΡΡΠΊΠΈΠ΅ ΠΠ»ΠΎΠ³ΠΈ
ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΏΠΎΠ΄ Linux
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠ°Π±Π»ΠΎΠ½Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π² Linux ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ Π² Linux. Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡ ΠΌΠ΅Π»ΠΊΠΎΠ³ΠΎ Π΄ΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ, ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π΄ΠΎ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠΉ ΡΠ΅ΠΎΡΠΈΠΈ, Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ Π»Π΅Π³ΡΠ΅ Π½Π°ΡΠ°ΡΡ Ρ Π΄Π²Π΅ΡΠΈ, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠΉ Linux.
1. ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°
Π€Π°ΠΉΠ» Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° hello.c
ΠΡΠΈ ΠΏΠ΅ΡΠ°ΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ printk Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Β«KERN_EMERGΒ» ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΡΠ²ΠΎΠ΄ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΠ΅ΡΠ°ΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ printk print ΡΠ°Π·Π΄Π΅Π»Π΅Π½ Π½Π° 8 ΡΡΠΎΠ²Π½Π΅ΠΉ, Π²Π΅ΡΡ Π½ΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ, Π° Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ» ΠΆΡΡΠ½Π°Π»Π°.
Makefile ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°
ΠΠ»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ make-ΡΠ°ΠΉΠ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΡΠ°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΡΠ΄ΡΠ°, ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ Ρ. Π.
Π’Π΅ΡΡΠΎΠ²ΡΠΉ Π²Π΅ΡΡ Π½ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ hellotest.c
Π Π²Π΅ΡΡ Π½Π΅ΠΌ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π±ΡΠ΄ΡΡ Π²ΡΠ·Π²Π°Π½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ xxx_open ΠΈ xxx_write Π² Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ΅, ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ΅ΡΠ°ΡΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ΡΡΠ° Π΄ΠΈΡΠΊΠ°
ΠΠ±ΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ, Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΈ Π²ΡΠ·Π²Π°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠ³ΡΡΠ·ΠΈΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ.
1. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅Ρ
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π½Π°ΠΏΡΡΠΌΡΡ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ Makefile Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ hello.c ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ Β«hellomodule.koΒ».
2. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ hellotest Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ.
3. ΠΠ°Π³ΡΡΠ·ΠΈΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅Ρ
ΠΠΎΠ³Π΄Π° insmod Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ hello_init (), ΠΈ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°Π½Π½Π°Ρ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² «/ proc / devices».
4. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ·Π΅Π»
Π₯ΠΎΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ hellomodule.ko Π±ΡΠ» Π·Π°Π³ΡΡΠΆΠ΅Π½, ΠΈ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ HelloModule ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ / proc / devices, ΡΡΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΡΡΡΡΠΎΠΉΡΡΠ² / dev Π½Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠΎΡΡΠΎΠΌΡ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ·Π΅Π» ΡΡΡΡΠΎΠΉΡΡΠ²Π°.
ΠΠΎΠΌΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΌΠΎΠ΄ΡΠ»Ρ HelloModule Π² / proc / devices ΡΠ°Π²Π΅Π½ 231. ΠΠΎΠ³Π΄Π° ΡΠ·Π΅Π» ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ, ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π° / dev / hellodev ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ Π½ΠΎΠΌΠ΅ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ / dev / hellodev, ΠΎΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ HelloModule.
Π Π°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ / proc / devices ΠΈ / dev
5. ΠΡΠ·ΠΎΠ² Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ hellotest ΡΠ½Π°ΡΠ°Π»Π° ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» «/ dev / hellodev», Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ val Π² ΡΡΠΎΡ ΡΠ°ΠΉΠ». Π ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° Π±ΡΠ΄ΡΡ Π²ΡΠ·Π²Π°Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ hello_open ΠΈ hello_write Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ΅. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ hellotest.
6. Π£Π΄Π°Π»ΠΈΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅Ρ
ΠΠΎΠ³Π΄Π° insmod ΡΠ΄Π°Π»ΡΠ΅Ρ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ hello_exit (), ΠΈ ΠΏΠ΅ΡΠ°ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΡΠ»Π°Π΄ΠΊΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
Π‘ΡΠΌΠΌΠΈΡΡΠΉΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ:
(1) ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ insmod
(2) Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π° Β«xxxΒ» Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ / dev Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ mknod ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ΡΠ΅ΡΠ΅Π· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π°.
(3) ΠΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π±Π°Π·ΠΎΠ²ΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π° / dev / xxx
Π’ΡΠΈ, Π΄ΠΈΡΠΊ ΡΠ°Π±Π»ΠΎΠ½
1. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
init.h ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈ Π²ΡΡ
ΠΎΠ΄ΠΎΠΌ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°
kernel.h ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ²
module.h ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΠΌΠ°ΠΊΡΠΎΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ΡΠ΄ΡΠ°
2. Π€ΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
ΠΠΎΠ³Π΄Π° Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π² ΡΠ΄ΡΠΎ, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΡ. ΠΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· register_chrdev. Π―Π΄ΡΠΎ Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ ΡΠ°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ (ΠΌΠ°ΡΡΠΈΠ²) Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π°Π±ΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°.Π€ΡΠ½ΠΊΡΠΈΡ register_chrdev Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ hello_flops Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ HELLO_MAJOR ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π°Π΄ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ HelloModule Π΄Π»Ρ Π½Π°Π±ΠΎΡΠ° ΠΏΠ°ΠΌΡΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ.
ΠΠ΅ΡΠ°ΡΠΎΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π΅ΡΠ°Π»ΠΎΠΊ Π΄Π»Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ, Π° Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π΅ΠΆΠ΄Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅ΡΠ°Π»ΠΊΠ΅ Π΄Π»Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ. ΠΠ° ΠΎΠ΄Π΅ΠΆΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠΌΠ°Π½ΠΎΠ², ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π° Π½Π°ΠΉΡΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π²Π΅ΡΠ°Π»ΠΊΡ Π΄Π»Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ, Π·Π°ΡΠ΅ΠΌ Π½Π°ΠΉΡΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ°ΡΠΌΠ°Π½, Π²ΡΠ·Π²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅.
3. ΠΡΡ ΠΎΠ΄ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠΎΠ³Π΄Π° Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ΄Π°Π»Π΅Π½, ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡ ΠΎΠ΄Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ.
ΠΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΈΡΡΠΈΡΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΠ°ΠΌΡΡΠΈ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΎΡΡΠ°Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ°.
ΠΠ΅ΡΠ°ΡΠΎΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ΅ Π΄ΠΈΡΠΊΠ° ΠΎΠ΄Π΅ΠΆΠ΄Π° ΡΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Ρ Π²Π΅ΡΠ°Π»ΠΊΠΈ, ΡΠ°ΠΊ ΡΡΠΎ Π²Π΅ΡΠ°Π»ΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΡΡΠΎΠΉ.
4. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± Π°Π²ΡΠΎΡΡΠΊΠΈΡ ΠΏΡΠ°Π²Π°Ρ
Π―Π΄ΡΠΎ Linux Π²ΡΠΏΡΡΠ΅Π½ΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ GPL, ΠΈ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Linux ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± Π°Π²ΡΠΎΡΡΠΊΠΈΡ ΠΏΡΠ°Π²Π°Ρ , Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΡΠ΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π² ΡΠ΄ΡΠΎ.
5. Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
View Code
Π-ΡΠ΅ΡΠ²Π΅ΡΡΡΡ , ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ Π΄ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ
1. ΠΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ Linux
2. ΠΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ Π΄ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ
ΠΠΎΠ·ΡΠΌΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ «open (» / dev / hellodev «, O_RDWR)» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΄Π»Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ.
(1) ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠΊΡΡΡΠΈΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ, ΡΡΠΎΠ±Ρ ΠΎΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ» ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ hellodev.
(2) ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ swi-ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ open, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΡΠ±ΠΎΡΠΌ Π² ΡΠ°Π±ΠΎΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ Π² ΡΠ΄ΡΠΎ.
(3) Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΡΠ΄ΡΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ.
(4) ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ.
(5) ΠΠ΅ΡΠ½ΠΈΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, Π° Π·Π°ΡΠ΅ΠΌ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
3. Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎ, ΠΎΠ½ ΠΏΠ°ΡΡΠΈΠ²Π΅Π½: ΠΎΠ½ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠ°ΠΉΠ²Π΅Ρ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π² ΡΠ΄ΡΠΎ, ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΡ ΡΠ΄ΡΡ: Β«Π― Π·Π΄Π΅ΡΡ, Ρ ΠΌΠΎΠ³Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΈ Π·Π°Π΄Π°Π½ΠΈΡΒ», ΠΈ ΠΊΠΎΠ³Π΄Π° ΡΡΠΈ Π·Π°Π΄Π°Π½ΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ, ΡΡΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ°ΠΉΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Β«ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠ΄ΡΠ°Β», ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ Β«Π΄ΠΎΠ²Π΅ΡΠΈΡΒ» ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΈΠ±ΠΊΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠ±ΠΎΡ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ.
Β«ΠΠΎΠ»Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ LinuxΒ»
Π ΡΡΡΠΊΠΈΠ΅ ΠΠ»ΠΎΠ³ΠΈ
Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π² ΡΠ΄ΡΠΎ ββΡΠ΄ΡΠ° (linux)
ΠΠ΅ΡΠ²ΡΠΉ, ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π² ΡΠ΄ΡΠΎ
ΠΡΡΡ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π² ΡΠ΄ΡΠΎ ββΠΏΠΎΠ΄ linux:
1) Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ
2) ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΄ΡΠ° ΡΠ΄ΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ΅ΡΠ΅Π· Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.ΠΠΎΡΠ»Π΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ ΠΈ Π²ΡΠΉΠ΄ΠΈΡΠ΅, Π·Π°ΡΠ΅ΠΌ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ, ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΠ°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π·Π΄Π΅ΡΡ Π±ΡΠ΄Π΅Ρ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ uImage.
ΠΡΠ±Π΅ΡΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΈΠ»ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π²Π°ΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠ΅ΠΉ.
ΠΠ΄ΠΈΠ½, ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ
Π― ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠ±ΡΡΡΠ½ΡΡ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π² Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π¨Π°Π³ΠΈ, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ (make menuconfig), Π±ΡΠ»ΠΈ ΠΎΠΏΡΡΠ΅Π½Ρ. ΠΠ΅ΡΠ΅Π΄ ΡΡΠΈΠΌ Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π» ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ², ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΠΈΡ Π·Π΄Π΅ΡΡ.
1. Π ΡΠΊΠ°ΡΠ°Π½Π½ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°Ρ
2) ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½ΡΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ 2 ΡΠ°ΠΉΠ»Π°:
Kconfig
Π€Π°ΠΉΠ» Kconfig ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ
Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΌΡ ΡΠΈΠΏΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π²ΡΠ±ΠΎΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ (<> (Π / Π / Π), [] [Π / Π ]β¦), ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΎΡΠ½ΠΎΡΡΡΠ΅ΠΉΡΡ ΠΊ ΡΡΠΎΠΉ ΠΎΠΏΡΠΈΠΈ ΠΈ Ρ. Π., ΠΡΠ»ΠΈ Kconfig ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΎΠ·ΡΠΌΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Wi-Fi Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°. ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π΅ΡΠ»ΠΈ Kconfig ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠΉΡΠ΅ Π΅Π³ΠΎ):
Kconfig
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ Kconfig:
Makefile ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΠΎΡΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π²Ρ Π²Π²Π΅Π΄Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ make menuconfig Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ telminal ΠΈ ΡΠ½ΠΎΠ²Π° Π²ΠΎΠΉΠ΄Π΅ΡΠ΅ Π² Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅). Π Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΏΡΡΠ΅ΠΌ ΠΊ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ Π²Π°ΡΠ΅Π³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°.Π§Π΅ΠΌ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΡΡΡ ΠΊ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΠ΄ΡΠ°, ΡΠ΅ΠΌ Π³Π»ΡΠ±ΠΆΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΡΡΡ ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅.
ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΠΎΠΏΡΠΈΡ ΡΠΏΡΠ°Π²ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ:
ΠΠ²Π°, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ
ΠΠΎΡ Π²ΡΠ΅ ΠΆΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ Wi-Fi. ΠΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Makefile. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ:
ΠΊΠ°ΠΊ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ?
Π·Π΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅! Π΅ΡΡΡ ΠΏΠ»Π°ΡΠΊΠ° Ρ at91rm9200, Π½Π° Π½Π΅ΠΉ ΠΊΡΡΡΠΈΡΡΡ Π»ΠΈΠ½ΡΠΊΡ, ΠΏΠΎ i2c ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ l3g4200 ΠΈ Π½Π°Π΄ΠΎ ΡΡΠΎΠ± Π² ΡΠ΄ΡΠ΅ Π±ΡΠ» Π΅Π³ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ. ΡΠ°ΠΌ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π½Π°ΠΏΠΈΡΠ°Π½, ΡΡΡΠ»ΠΊΠ° Π²ΠΎΡ http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/SW_DRIVER/l3g4. Π° ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π²Π½Π΅Π΄ΡΠΈΡΡ Π² ΡΠ΄ΡΠΎ? Π²Π΅ΡΠ½Π΅ΠΉ Π΅Π³ΠΎ Π½Π°Π΄ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ, Π° ΠΏΠΎΡΠΎΠΌ ΡΠ΅ΡΠ΅Π· menuconfig ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΄ΡΠΎ(ΡΡΠΎ Ρ Π½Π°ΡΡΠΈΠ»ΡΡ).
ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΎ JB ΠΈΠ· Development
ΡΡΠΎΠΏ. Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΊΠ°ΠΊΠ°Ρ ΡΠΎ ΠΏΠ°ΠΏΠΊΠ° Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°Ρ ΡΠ΄ΡΠ°, Π³Π΄Π΅ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ. ΡΠ°ΠΊ? Π²ΠΎ-Π²ΡΠΎΡΡΡ , ΠΎΡΠΊΡΠ΄Π° ΠΌΠ½Π΅ Π²Π·ΡΡΡ ΠΌΠ΅ΠΉΠΊΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊ?
ΠΡΠΎ ΠΎΠ±ΡΠ΅Π·ΠΎΠΊ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ, Π° Π½Π΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°.
ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊ /usr/src/kernels/linux-3.0/drivers/sfi
ΠΈΠ»ΠΈ Ρ ΠΎΠΏΡΡΡ ΡΡΠΎ ΡΠΎ Π½Π΅ ΠΏΠΎΠ½ΡΠ»?
http://pastebin.com/EdyeucmR
Π²ΠΎΡ ΡΡΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈ ΠΊΠ°ΠΊ Makefile ΠΈ Π½Π°ΠΏΠΈΡΠΈ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ make Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π²ΡΡ
Π²ΠΎΠΎΠ±ΡΠ΅ Ρ Π½Π΅ ΠΏΠΎΠ½ΡΠ». ΡΠ΄ΡΠΎ Ρ ΠΌΠ΅Π½Ρ 2.6.30 ΡΡΠΎΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅, ΡΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ ΡΡΠΎΠΈΡ 3.0.0-12. ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎ?
ΠΊΡΠΎΠΌΠ΅ linux device drivers Π΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΈΠ±ΡΠ΄Ρ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ΅. ΠΈΠ»ΠΈ Π΅ΡΠ΅ Π½Π°Π΄ΠΎ ΡΠΈΡΠ°ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΡΠ΄ΡΠΎ?
Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π²ΠΎΠΎΠ±ΡΠ΅ΠΌ Π² ΡΠΎΠΏΠΊΡ, Π±ΡΠ΄Ρ ΡΠΈΡΠ°ΡΡ linux device drivers ΠΈ ΠΏΠΈΡΠ°ΡΡ Ρ Π½ΡΠ»Ρ
Π’ΠΎΠΆΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΊΠ° Π½Π° ΡΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ ΠΈ ΡΠ° ΠΆΠ΅ ΠΠ‘ Π³ΠΈΡΠΎΡΠΊΠΎΠΏΠ°. Π‘ΠΎΠ±ΡΠ°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ΄Π°Π»ΠΎΡΡ, Π΄Π΅Π»Π°Π»ΠΎΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ Makefile’ΠΎΠΌ, Π½ΠΎ Ρ make ΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ARCH=arm CROSS_COMPILE=arm-unknown-linux-uclibcgnueabi- (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΡΠΎΡΡ-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ).
Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π» Π½Π° ΡΠ΅Π»Π΅Π²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, Π² Π΄ΠΎΠΌΠ°ΡΠ½ΡΡ ΠΏΠ°ΠΏΠΊΡ, Π΄Π΅Π»Π°Ρ:
%insmod l3g4200d.ko
%lsmod
Module Size Used by
l3g4200d 6456 0
%ls /sys/bus/i2c/drivers
ev_driver dummy l3g4200d rtc-ds1672
%ls /sys/bus/i2c/devices/
0-0068
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π²ΠΊΠ»ΡΡΠΈΠ»ΡΡ Π² ΡΠ΄ΡΠΎ, ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ /sys/bus/i2c/drivers, Π½ΠΎ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ /sys/bus/i2c/devices/, Π³Π΄Π΅ ΠΎΠ½ ΡΠΎΠΆΠ΅ ΠΏΠΎ Π»ΠΎΠ³ΠΈΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» Π±ΡΡΡ, Π΅Π³ΠΎ Π½Π΅ΡΡ (0-0068 ΡΡΠΎ ΡΠ°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ rtc-ds1672, Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π±ΡΠ» Π²ΡΡΡΠΎΠ΅Π½ Π² ΡΠ΄ΡΠΎ).
Π§ΡΠΎ Π·Π½Π°ΡΠΈΡ Π²ΡΡ ΡΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°? ΠΠ‘ Π»ΠΈΠ±ΠΎ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ? ΠΠ»ΠΈ Ρ ΡΡΠΎ-ΡΠΎ Π½Π΅Π΄ΠΎΠ½Π°ΡΡΡΠ°ΠΈΠ²Π°Π» ΠΈ ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ? Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.