рдореИрдВ рддреБрд░рдВрдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдбреНрд░рд╛рдЗрд╡рд░ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдЖрдорддреМрд░ рдкрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо) рдХреЛ рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИ ред рдФрд░ рдЖрдЬ рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдХреНрдд рдмрдирд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рдХрд┐рд╕реА рднреА рд▓реЛрд╣реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЬ рд╣рдо рдЬреЛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрд▓рдХреЗрдПрдо (рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдореЙрдбреНрдпреВрд▓) рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдПрд▓рдХреЗрдПрдо рдХреА рдХрд┐рд╕реНрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рд╣рдо 2.6 рд▓рд╛рдЗрди рдХреА рдЧреБрдард▓реА рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦреЗрдВрдЧреЗред 2.6 рдХреЗ рд▓рд┐рдП рдПрд▓рдХреЗрдПрдо 2.4 рд╕реЗ рднрд┐рдиреНрди рд╣реИред рдореИрдВ рдорддрднреЗрджреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрдж рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред
рд╣рдо рдЪрд░рд┐рддреНрд░ рдЙрдкрдХрд░рдг / рджреЗрд╡ / рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЪрд░рд┐рддреНрд░ рдЙрдкрдХрд░рдг рдХреЛ / рджреЗрд╡ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл "рдкреНрд░рд╛рдЪреАрди рдЬрд╛рджреВ рдХреА рд░рд╕реНрдо" рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, LKM рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред рдпрд╛рдиреА рдпрд╣ рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред рдЗрд╕рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рдпреЛрдЧ рди рдХрд░реЗрдВред рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░реЗрдВрдЧрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдЖрддрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИред
рдПрдХ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 2 рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП: рдПрдХ рдЖрд░рдВрднреАрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рдиред рдкрд╣рд▓рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рди рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛, рдЬрдм рдЗрд╕реЗ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореИрдХреНрд░реЛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдореЙрдбреНрдпреВрд▓_рдЗрдирд┐рдЯ рдФрд░ рдореЙрдбреНрдпреВрд▓_рдПрдХреНрд╕рд┐рдЯ ред
рдпрд╣ рдкреНрд░рд┐рдВрдЯрдХ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдШрдЯрдирд╛рдУрдВ рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд░реНрдиреЗрд▓ рд▓реЙрдЧ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рд╕реЗ рд╕реАрдорд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП, put_user () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рдмрд╕ рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рди рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдлреЗрдВрдХрдиреЗ рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИред
рдореИрдВ рдЪрд░рд┐рддреНрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХрдорд╛рдВрдб
ls -l /dev/sda*
рдЪрд▓рд╛рдПрдВред рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВрдЧреЗ:
brw-rw---- 1 root disk 8, 0 2010-10-11 10:23 /dev/sda
brw-rw---- 1 root disk 8, 1 2010-10-11 10:23 /dev/sda1
brw-rw---- 1 root disk 8, 2 2010-10-11 10:23 /dev/sda2
brw-rw---- 1 root disk 8, 5 2010-10-11 10:23 /dev/sda5
рд╢рдмреНрдж "рдбрд┐рд╕реНрдХ" рдФрд░ рддрд╛рд░реАрдЦ рдХреЗ рдмреАрдЪ рджреЛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВред рдкрд╣рд▓реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд░рдореБрдЦ рдЙрдкрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдореБрдЦ рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕реЗрд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред
рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ mknod рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
mknod /dev/test c 12
ред рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде, рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ / рджреЗрд╡ / рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рд╕рдВрдЦреНрдпрд╛ (12) рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдВрдЧреЗред
рдореИрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЧрд╣рд░реЗ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рд╡рд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрдврд╝ рд╕рдХреЗрдВрдЧреЗред рдореИрдВ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛ред
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
рдЖрдкрдХреЛ рдХреБрдЫ "рдЬрд╛рджреВ" рдЖрдЬреНрдЮрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- insmod - рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВ
- rmmod - рддрджрдиреБрд╕рд╛рд░ рд╣рдЯрд╛рдПрдБ
- lsmod - рд╕реВрдЪреА рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓
- modinfo - рдкреНрд░рджрд░реНрд╢рди рдореЙрдбреНрдпреВрд▓ рдЬрд╛рдирдХрд╛рд░реА
рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд░реНрдиреЗрд▓ рдХреЗ рд╣реЗрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдбреЗрдмрд┐рдпрди / ubutnu рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рддрд░рд╣ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2.6.26-2-686 рдХреЗ рд▓рд┐рдП):
apt-get install linux-headers-2.6.26-2-686
рдпрд╛ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕реНрд╡рдпрдВ рдХрд░реЗрдВ:
fakeroot make-kpkg kernel_headers
рд╕реНрд░реЛрдд рдХреЛрдб
#include <linux/kernel.h> /* printk() .. */
#include <linux/module.h> /* , */
#include <linux/init.h> /* */
#include <linux/fs.h>
#include <asm/uaccess.h> /* put_user */
// , Modinfo
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Alex Petrov <petroff.alex@gmail.com>" );
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, .
static int major_number; /* */
static int is_device_open = 0; /* ? */
static char text[ 5 ] = "test\n" ; /* , */
static char * text_ptr = text; /* */
//
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 );
if ( major_number < 0 )
{
printk( "Registering the character device failed with %d\n" , major_number );
return major_number;
}
//
printk( "Test module is loaded!\n" );
printk( "Please, create a dev file with 'mknod /dev/test c %d 0'.\n" , major_number );
return SUCCESS;
}
//
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;
if ( is_device_open )
return -EBUSY;
is_device_open++;
return SUCCESS;
}
static int device_release( struct inode *inode, struct file *file )
{
is_device_open--;
return SUCCESS;
}
static ssize_t
device_write( struct file *filp, const char *buff, size_t len, loff_t * off )
{
printk( "Sorry, this operation isn't supported.\n" );
return -EINVAL;
}
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;
while ( length && *text_ptr )
{
put_user( *( text_ptr++ ), buffer++ );
length--;
byte_read++;
}
return byte_read;
}
* This source code was highlighted with Source Code Highlighter .
рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдЦреИрд░, рдЕрдм рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рдореЗрдХрдлрд╛рдЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
obj-m += test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # рдмрдирд╛рдУ
make -C /lib/modules/2.6.26-2-openvz-amd64/build M=/tmp/test modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-openvz-amd64'
CC [M] /tmp/1/test.o
Building modules, stage 2.
MODPOST 1 modules
CC /tmp/test/test.mod.o
LD [M] /tmp/test/test.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.26-2-openvz-amd64'
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # ls -la
drwxr-xr-x 3 root root 4096 21 12:32 .
drwxrwxrwt 12 root root 4096 21 12:33 ..
-rw-r--r-- 1 root root 219 21 12:30 demo.sh
-rw-r--r-- 1 root root 161 21 12:30 Makefile
-rw-r--r-- 1 root root 22 21 12:32 modules.order
-rw-r--r-- 1 root root 0 21 12:32 Module.symvers
-rw-r--r-- 1 root root 2940 21 12:30 test.c
-rw-r--r-- 1 root root 10364 21 12:32 test.ko
-rw-r--r-- 1 root root 104 21 12:32 .test.ko.cmd
-rw-r--r-- 1 root root 717 21 12:32 test.mod.c
-rw-r--r-- 1 root root 6832 21 12:32 test.mod.o
-rw-r--r-- 1 root root 12867 21 12:32 .test.mod.o.cmd
-rw-r--r-- 1 root root 4424 21 12:32 test.o
-rw-r--r-- 1 root root 14361 21 12:32 .test.o.cmd
drwxr-xr-x 2 root root 4096 21 12:32 .tmp_versions
рдЕрдм рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / test # modinfo test.ko
filename: test.ko
description: My nice module
author: Alex Petrov <druid@joker.botik.ru>
license: GPL
depends:
vermagic: 2.6.26-2-openvz-amd64 SMP mod_unload modversions
рдЕрдВрдд рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # insmod test.ko
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # lsmod | grep рдкрд░реАрдХреНрд╖рдг
test 6920 0
рдФрд░ рд▓реЙрдЧ рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # dmesg | рдкреВрдВрдЫ
[829528.598922] Test module is loaded!
[829528.598926] Please, create a dev file with 'mknod /dev/test c 249 0'.
рд╣рдорд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрдирдХреА рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # mknod / dev / рдкрд░реАрдХреНрд╖рдг c 249 0
рдареАрдХ рд╣реИ, рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # рдмрд┐рд▓реНрд▓реА / рджреЗрд╡ / рдкрд░реАрдХреНрд╖рдг
test
рд╣рдорд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # рдЗрдХреЛ 1> / рджреЗрд╡ / рдкрд░реАрдХреНрд╖рдг
bash: echo: :
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # dmesg | рдкреВрдВрдЫ
[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.
рдЗрд╕реЗ рд╣рдЯрд╛рдПрдВ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # rmmod рдкрд░реАрдХреНрд╖рдг
рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # dmesg | рдкреВрдВрдЫ
[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!
рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдПрдВ рддрд╛рдХрд┐ рд╡рд╣ рд╣рдореЗрдВ рдкрд░реЗрд╢рд╛рди рди рдХрд░реЗ:
рд░реВрдЯ @ рдЬреЛрдХрд░: / tmp / рдкрд░реАрдХреНрд╖рдг # rm / dev / рдкрд░реАрдХреНрд╖рдг
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ "рд╡рд░реНрдХрдкреАрд╕" рдХрд╛ рдЖрдЧреЗ рд╡рд┐рдХрд╛рд╕ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред рдЖрдк рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдпрд╛ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдмрд╕ рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрдбреЛрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рдЧрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред рдпрд╛рдиреА / dev / рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬреЗрдВ рдФрд░ рдпрд╣ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред
рд╕рд╛рд╣рд┐рддреНрдп
рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ LKMPG (рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЧрд╛рдЗрдб) рд╡рд░реНрддрдиреА рдкреБрд╕реНрддрдХ рдХрд╛ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛
рдпреБрдкреАрдбреА:
рдХреБрдЫ рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдореЗрдХрдлрд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди:
рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдХрдлрд┐рд▓ рдмрдирд╛рдПрдБ: obj-m + = test.o
рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛рдПрдВ:
рдореЗрдХ-рд╕реА / usr / src / linux-headers -`uname -r` SUBDIRS = $ PWD рдореЙрдбреНрдпреВрд▓
UPD2:
рд╕реНрд░реЛрдд рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред
рдкрд╛рд░реНрд╕рд░ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИ рдФрд░ 'MODULE_DEscription ("рдореЗрд░рд╛ рдЕрдЪреНрдЫрд╛ рдореЙрдбреНрдпреВрд▓") рдмрдЪрд╛рддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓_ рд╢реЗрдбреНрдпреВрд▓ рдореЗрдВ рд╕рднреА рдЕрдХреНрд╖рд░ рдЕрдкрд░рдХреЗрд╕ рд╣реИрдВред
UPD3:
segoon рдиреЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХреБрдЫ рд╕реБрдзрд╛рд░ рднреЗрдЬреЗ:
1) device_open () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдПрдХ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ:
рд╕реНрдерд┐рд░ int device_open (рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрдиреЛрдб * рдЗрдиреЛрдб, рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╛рдЗрд▓ * рдлрд╛рдЗрд▓)
{
text_ptr = рдкрд╛рда;
рдЕрдЧрд░ (is_device_open) <<<<
рд╡рд╛рдкрд╕реА -EBUSY;
is_device_open ++; <<<<
рд╡рд╛рдкрд╕реА рдХреА рд╕рдлрд▓рддрд╛;
}
рдпрджрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдврд╝рддреА рд╣реИ рддреЛ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ is_device_open
рдпрджрд┐ (is_device_open) рдФрд░ is_device_open ++ рдХреЗ рдмреАрдЪ рдХрдорд╛рдВрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рддреЛ рдореЗрдВ
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлрд╝рд╛рдЗрд▓ 2 рдмрд╛рд░ рдЦреБрд▓ рдЬрд╛рдПрдЧреАред рдкрд░рдорд╛рдгреБ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
atomic_XXX () рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдФрд░ рдкрд╛рд╕ рдореЗрдВ ()ред
2) device_write () рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓рд┐рдЦрдирд╛ () рд╕реНрд╡рдпрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред
3) put_user () рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ MANDATORY рд╣реИред рдпрджрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ
рдпрд╛ рддреЛ рдЬрд░реВрд░рдд рд╣реИ
a) рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВ -рдлрд▓ рдХрд░реЗрдВ рдФрд░ рдмрд╣рд╛рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рдерд╛ (рдЕрд░реНрдерд╛рдд
рдЗрд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдмрдлрд╝рд░реНрд╕ рдХреЗ рдЕрдзреВрд░реЗ рдкрдврд╝реЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рди рд╣рдЯрд╛рдПрдВ
рдпрджрд┐ рдорд╛рдорд▓рд╛ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ)
рдЦ) рд▓рд┐рдЦрд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдВ (рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реАрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ,
POSIX рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИ)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк 0 рди рд▓реМрдЯреЗрдВ:
read () = 0 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдлрд╛рдЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
4) рдХрд░реНрдиреЗрд▓ рдореЗрдВ, 0, рдирд╣реАрдВ
рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдПрд╕рдпреВрд╕реАрд╕реАрд╕ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рдж рд╣реИрдВ
рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рд╣реИрдВрдбрд▓рд░, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ -EXXX рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЛрдб)
рддреНрд░реБрдЯрд┐рдпрд╛рдБ), рдпрд╛ 0 (рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ), рдпрд╣ рд╕реНрдерд┐рд░ 0 рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрдИ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдПрдирд╛рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣
рд╢реБрд░реБрдЖрддреА рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдХреА рд╕рдордЭ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ :)