рдЕрдкрдиреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐



рдореИрдВ рддреБрд░рдВрдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдбреНрд░рд╛рдЗрд╡рд░ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдЖрдорддреМрд░ рдкрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо) рдХреЛ рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИ ред рдФрд░ рдЖрдЬ рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдХреНрдд рдмрдирд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рдХрд┐рд╕реА рднреА рд▓реЛрд╣реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдЖрдЬ рд╣рдо рдЬреЛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрд▓рдХреЗрдПрдо (рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдХрд░реНрдиреЗрд▓ рдмреВрдЯ рдореЙрдбреНрдпреВрд▓) рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдПрд▓рдХреЗрдПрдо рдХреА рдХрд┐рд╕реНрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред



рд╣рдо 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) рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдВрдЧреЗред



рдореИрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЧрд╣рд░реЗ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рд╡рд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрдврд╝ рд╕рдХреЗрдВрдЧреЗред рдореИрдВ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛ред



рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ





рдЖрдкрдХреЛ рдХреБрдЫ "рдЬрд╛рджреВ" рдЖрдЬреНрдЮрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:





рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд░реНрдиреЗрд▓ рдХреЗ рд╣реЗрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдбреЗрдмрд┐рдпрди / 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 рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдХрдИ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдПрдирд╛рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣

рд╢реБрд░реБрдЖрддреА рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдХреА рд╕рдордЭ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ :)



All Articles