Kompilimi i kernelit dhe moduleve. Konfigurimi dhe përpilimi i kernel Linux Testi i plotë

Zharoznizhyuchі zasobi për fëmijët njihet si pediatër. Dyshohet se ka situata të ndihmës së papërshtatshme në rast të temperaturës, nëse fëmijës duhet t'i jepet një sekret. Babai Todi merr përsipër shkathtësinë dhe qëndrueshmërinë e barnave për uljen e temperaturës. A lejohet t'u jepet gji fëmijëve? Si mund ta mposhtni temperaturën e fëmijëve më të mëdhenj? Cilat janë më të mirat?

Nëse ka nevojë për të instaluar një sistem të lodhshëm dhe të besueshëm të bazuar në Linux (pavarësisht nëse është proceset teknologjike, Web hosting, etj.), atëherë shpesh është e nevojshme të rregulloni thelbin e sistemit në një rang të tillë, në mënyrë që i gjithë sistemi të funksionojë në mënyrë më efikase dhe efikase. Kerneli Linux dëshiron të jetë universal, ai mbron situatat nëse duhet të "akordohet" për arsye të dukshme. Vetë ajo arkitekturë e thelbit të procesit të transferimit të performancës së vet. Një gradë e tillë, administratorët e sistemit Linux, janë njerëz që janë të rëndësishëm për fisnikërinë dhe inteligjencën e aspekteve kryesore të konfigurimit të kernelit Linux.

Mënyrat e konfigurimit të kernel Linux

Për një orë, zhvillimi i Linux ka bashkuar vazhdimisht disa metoda themelore për konfigurimin e kernelit:

  • modifikimi i parametrave për të akorduar kernelin;
  • përzgjedhja e kernelit nga kodet e daljes me ndryshimet dhe/ose shtesat e kërkuara në tekstin e kodeve të daljes së kernelit;
  • lidhja dinamike e komponentëve të rinj (modulet funksionale, drejtuesit) me kernelin e ri;
  • transferimi i udhëzimeve speciale në bërthamë për një orë krehje dhe / ose për vikoristovuchi zavanazhuvach (për shembull, GRUB).

Pavarësisht situatës specifike, suksesi i rrugës fitimtare. Por për herë të parë është e nevojshme të dihet, por më e mira nga të gjitha, e para është të konfiguroni parametrat e kernelit. E njëjta përmbledhje e palosshme є e kernelit nga kodet e daljes.

Parametrat e kernelit

Bërthama e sistemit Linux u shkatërrua në një shkallë të tillë, saqë u bë e mundur që ai të ishte sa më i keq (edhe pse, si çdo gjë në sistemet UNIX dhe Linux) u krijua, duke e përshtatur atë me mendjet e nevojshme të shfrytëzimit dhe harduerit. përsosje. Dhe kështu, i gjithë procesi ishte shumë dinamik në kernelin e përfunduar. Me fjalë të tjera, administratorët e sistemit, në çdo moment të orës, mund të sjellin parametra korigal, duke injektuar në robot vetë bërthamën, si dhe komponentët e tretë.

Për zbatimin e zhvillimit të bërthamës dhe programeve të Koristuvalnytsky Rivnya, ekziston një ndërfaqe e veçantë, informacioni në kanalet e informacionit. Udhëzimet dërgohen përmes kanaleve që vendosin vlerat për parametrat e kernelit.

Ale yak dhe gjithçka në sistemet UNIX dhe Linux, konfigurimi i parametrave të kernelit nëpërmjet kanaleve të informacionit është i lidhur me sistemi i skedarëve... Për të rishikuar konfigurimin e kernelit dhe keruvati në sistemin e skedarëve në drejtorinë / proc / sys, shfletoni skedarët specialë. Skedarët Tse zvychaynі, ale erë e keqe e të luajturit të rolit të mesit në sigurimin e ndërfaqes për ndërveprim dinamik me thelbin. Megjithatë, dokumentacioni, i cili është shumë i rëndësishëm, ka të bëjë me përshkrimin e parametrave specifikë dhe kuptimin e tyre për të arritur një minimum. Një nga dzherel, për të cilin mund të grumbulloni veprimet e atyre të zakonshme, direktoriumin Documentation / sysent në katalog me kodet e daljes së kernelit.

Për hir të saktësisë, shikoni një prapanicë të vogël, e cila do t'ju tregojë se si përmes parametrit kernel, rregulloni numrin maksimal menjëherë shikoni skedarët në sistem:

$ Cat / рroc / sys / fs / file-max 34916 $ sudo sh -c "echo 32768> / proc / sys / fs / file-max"

Yak mund të jetë bachiti, në një nivel të tillë mund të merrni një tingull të shpejtë dhe nuk do të jeni në gjendje ta bëni atë edhe më të palosshëm. Kjo metodë është shumë e dobishme dhe nuk ka asnjë problem në rinisjen e sistemit.

Ju gjithashtu mund të zgjidhni një mjet të veçantë sysctl... Do t'ju lejohet të redaktoni vlerat e ndryshimeve drejtpërdrejt nga rreshti i komandës, për një listë çiftesh të formës së ndryshimit = vlerës nga skedari. Në fazën e gërmimit të mjetit, lexoni vlerat e kallirit të parametrave të specifikuar në skedar /etc/sysctl.conf... Informacion më të detajuar në lidhje me shërbimin sysctl mund të gjenden në anët.

Në tabelat fyese, parametrat e kernelit rregullohen:

Katalogu Skedari / parametri vlerësim
Z nxjerrje automatike Hapja automatike e sirtarit të CD-së kur çmontoni bashkëngjitjen e CD-ROM-it
F skedar-maks numri maksimal i skedarëve të hapur. Për sistemet që mund të përpunohen me një numër të madh skedarësh, është e mundur të rritet vlera deri në 16384
F inode-max Numri maksimal i përshkruesve të indeksit kritik të hapur në një proces. Është i mirë për dokumentet, pasi shfaqin dhjetëra mijëra përshkrues skedarësh
Përpara
Përpara limiti i normës printk Intervali minimal ndërmjet bërthamave, në sekonda
Përpara printk_ratelimi_burst Ka disa raste, pasi ata janë fajtorë për refuzim, përpara se koha kur intervali minimal midis kohërave duhet të bëhet printk do të aktivizohet
Përpara shmmax Madhësia maksimale e memories spilno vikorist
N conf / default / rp_filter Përfshin mekanizmin e ridrejtimit të rrugës në skedarin e daljes
N icmp_echo_ Injorimi i furnizimeve ICMP për destinacionin 1
N icmp_echo_ Injorimi i furnizimeve me energji ICMP me një zonë të gjerë, veçanërisht për portat 1.
N ip_përpara Përcjellja e paketave IP, nëse destinacioni është për rrugën.
N ip_port_local_ Një sërë portesh lokale, të cilat mund të shihen kur konfiguroni një ditë. Për të rritur produktivitetin e serverëve, në mënyrë që të ketë shumë serverë të ndryshëm, parametri duhet të zgjerohet deri në 1024-65000
N tcp_fin_timeout Intervali për kontrollin (në sekonda) të paketës përfundimtare RN. Për të rritur produktivitetin e serverëve, pasi kalojnë shumë trafik, duhet të vendosni shumë vlera të ulëta (afër 20)
N tcp_syncookies Ndjenja e sulmeve ndaj shtesave SYN. Është e nevojshme ta aktivizoni nëse ka një sulm DOS

Vlerat e përcaktuara: F - / proc / sys / fs, N - / proc / sys / net / ipv4, К - / proc / sys / kernel, С - / proc / sys / dev / cdrom.

$ Sudo sysctl net.ipv4.ip_forward = 0

Si rezultat i vijës së komandës, përcjellja e paketave IP do të aktivizohet. Є Një veçori e veçantë për sintaksën e komandës: simbolet e pikave në "net.ipv4.ip_forward", zëvendësoni simbolet me një të pjerrët në rrugën drejt skedarit ip_forward.

Nëse keni nevojë për një version të ri të kernelit?

Sot kerneli Linux po zhvillohet me shpejtësi dhe me zhurmë. Më shpesh, kompletet e shpërndarjes nuk përfshijnë versione të reja të kernelit në sistemet e tyre. Si rregull, të gjitha "patate të skuqura" të reja do të jenë më të njohura për tifozët e ekzotizmit, entuzias, pronarët e shtesave dhe instalimeve të reja, dhe thjesht varësuese - domethënë.

Për makineritë e serverëve, moda nuk ka gjasa të jetë e rëndësishme, por teknologjitë e reja përdoren vetëm për qëllime praktike dhe sjellin besueshmërinë dhe efikasitetin e tyre në stolat e testimit ose në platforma. Një administrator i sistemit të informuar plotësisht e di se një herë ai është mbingarkuar vazhdimisht, kjo mund të jetë, për mirë dhe pa gabime, e suksesshme, por që nuk është modernizuar pafundësisht për të modernizuar sistemin. Nevojiten edhe më shumë robotë për shumë vite (është gjithashtu e nevojshme të merret bërthama nga kodet e daljes, është e lehtë për ta përfunduar) dhe shërbimi, për të arritur në rrugën e ngarkuar, oskil, për t'i ofruar të gjithë serverit pa një rezervë të tepërt. (dhe aq më tepër pa "të ftohtë") rezervë.

Për këtë, sigurohuni që të njihni të gjithë zyrtarët dhe vlerësoni se cilët janë të interesuar për shëndetin e arnimeve, sepse ata nuk derdhin sisteme në robot, apo edhe drejtues të rinj për shtojcat, të cilat në Danimarkë për momentin në sistem nuk do të të transferohet së shpejti.

Sapo vendimi i versionit të ri të kernelit është marrë nga zotëria e këtij grupi të pavarur, atëherë është e nevojshme që versioni të jetë i qëndrueshëm. Më parë, sistemi i numërimit të versionit të kernel Linux ishte i organizuar në një renditje të tillë, ku numrat e çiftuar të versioneve nënkuptonin lëshim të qëndrueshëm, të paçiftuar - më shumë "Siria". Në një ditë të caktuar, parimi për të hedhur një sy është larg pritjes për momentin e pirjes nga informacioni në faqen zyrtare të internetit kernel.org.

Konfigurimi i parametrave të kernelit

Konfigurimi për kernel Linux mund të ruhet në skedarin .config. Nuk mjafton në radhë të parë të merresh me regjistrat manualë dhe redaktimin e një skedari, oskilki, një sintaksë komplekse, e cila është larg të qenit "e lexueshme nga njeriu", por në një mënyrë tjetër: ka mënyra për gjenerimin automatik të konfigurimin e ndërfaqes së kernelit. listë ekipet kryesore për konfigurimin e zgjedhjes së kernelit:

  • make xconfig - Rekomandohet të përdoret programi i mesëm grafik i KDE. Instrument Velmi Zruchny;
  • make gconfig - një version i shkurtër për victorian në mjedisin grafik të GNOME;
  • make menuconfig - i jepet përdorimit të rrëshqitjeve vikoristovuvati në modalitetin pseudografik. Vona nuk është aq e zgjuar, si dy përpara, megjithatë, me funksionet e saj është mirë të përballosh;
  • make config - opsioni më i mirë jo-manual i "konsolës", i cili mund të vendoset në vlerën e parametrit të lëkurës së kernelit. Mos lejoni ndryshimin e parametrave të vendosur tashmë.

Praktikisht të gjitha opsionet (me fajin e pjesës tjetër) ju lejojnë të shkurtoni një shtesë të shkurtër për parametrin e lëkurës, të bëni një kërkesë për një parametër të kërkuar (ose një shpërndarje të konfigurueshme), të shtoni komponentë shtesë në konfigurim, makinë dhe gjithashtu të tregoni specifikë në kernel, ose kur moduli është i kyçur, si dhe moduli shtohet në opsionin e përpilimit kur moduli është i kyçur.

Komanda make oldconfig mund të duket edhe më e kuqërremtë, ajo ka për qëllim transferimin e konfigurimit aktual nga versioni i ri (zbirki) i kernelit në ndërtimin e ri. Komanda lexon konfigurimin nga skedari i transferuar nga skedari .config nga zbirkoy i vjetër, viznachaє, pasi parametrat e rinj janë të disponueshëm për rikthimin aktual dhe ju kërkon të aktivizoni ose mbishkruani skedarin.

Për të shfaqur konfigurimin e kernelit Linux, duhet të shkoni te drejtoria me kodet e lëshimit dhe të ekzekutoni një nga komandat për gjenerimin e konfigurimit.

Si rezultat i këtyre komandave robotike, do të gjenerohet një skedar .conf, një fragment në vend të të cilit mund të hapim:

# # Skedar i krijuar automatikisht; MOS EDITON. # Linux / x86 4.20.7 Kernel Configuration # # # Compiler: gcc (Ubuntu 7.3.0-27ubuntu1 ~ 18,04) 7.3.0 # CONFIG_CC_IS_GCC = y = CONFIG_GCC_VERSION 70300 CONFIG_CLANG_VERSION = 0 CONFIG_IRQ_WORK = y CONFIG_BUILT CONFORTIME të setup # CONFIG_INIT_ENV_ARG_LIMIT = 32 # CONFIG_COMPILE_TEST nuk është vendosur CONFIG_LOCALVERSION = "" # CONFIG_LOCALVERSION_AUTO nuk është vendosur CONFIG_BUILD_SALT = "" CONFIG_HAVE_KERNEL_GZIP = y CONFIG_HAVE_KERNEL_BZIP2 = y CONFIG_HAVE_KERNEL_LZMA = y CONFIG_HAVE_KERNEL_XZ = y CONFIG_HAVE_KERNEL_LZO = y CONFIG_HAVE_KERNEL_LZ4 = y CONFIG_KERNEL_GZIP = y # CONFIG_KERNEL_BZIP2 nuk u vendos # CONFIG_KERNEL_LZMA nuk është vendosur # CONFIG_KERNEL_XZ është nuk set # CONFIG_KERNEL_LZO nuk u vendos # CONFIG_KERNEL_LZ4 nuk është vendosur CONFIG_DEFAULT_HOSTNAME = "(none)" CONFIG_SWAP = y = y CONFIG_SYSVIPC CONFIG_SYSVIPC_SYSCTL = y = y CONFIG_POSIX_MQUEUE CONFIG_POSIX_MQUEUE_SYSCTL = y = y CONFIG_CROSS_MEMORY_ATTACH CONFIG_USELIB = y

Yak mund të jetë bachiti, në këtë kod nuk ka asnjë mashtrim për redaktim manual, thjesht lundroni në komentin në cob të skedarit .config. Simboli "y" në fillim, qoftë në rresht sipas radhës, ai një komponent do të përpilohet në depon e bërthamës, "m" - si modul. Deshifrimet ose do të përshkruaj në lidhje me komponentin e lëkurës, ose parametrat në skedarin.config nuk do të hakmerren - nga furnizimi me energji elektrike, do të shihen në dokumentacion.

përpilimi i kernelit

Ka shumë në përpilimin e kernelit Linux - pjesa kryesore e konfigurimit të zbirka, disa prej tyre i nevojiten fisnikërisë, si përbërës të çelësit. Dua të kontrolloj komandat make xconfig, make gconfig, make menuconfig dhe pa paracaktuar konfigurimin standard të punës, i cili sistem do të funksionojë në një numër të madh platformash dhe konfigurimesh harduerike. Nutrition është i privuar nga fakti që ju instaloni saktë konfigurimin e kernelit pa të panevojshme dhe huazoni burime të komponentëve kur punoni.

Gjithashtu, për një konfigurim dhe përpilim të suksesshëm të bërthamës, kërkohen ngjarjet e mëposhtme:

  • shkoni te drejtoria me kodet e daljes së kernelit. Paraqisni "wihidni" për kernel Linux që do të vendoset në drejtorinë / usr / src, ose mund ta lidhni atë nga faqja kernel.org me çdo dorë;
  • komanda viconati make xconfig, make gconfig ose make menuconfig;
  • vikon komandën make dep (mund të mos jetë e vlefshme për kernel versionin 2.6.x dhe më shumë);
  • viconati bëjnë komanda të pastër (për pastrimin e gjithçkaje që mund të mbishkruhet);
  • viconati bëj komandë;
  • komanda viconati make modules_install;
  • kopjoni skedarin / arch / arch_name / boot / bzImage në / boot / vmlinuz. Këtu drejtoria / arch ndodhet në katalog me kodet dalëse të kernelit Linux, emri_architecture është drejtoria, e cila është emri i arkitekturës aktuale (e caktuar në fazën e konfigurimit). Mund të përdoret imazhi binar i zgjedhur i kernelit bzImage;
  • kopjoni skedarin /arch/name_arch_tectury/boot/System.map në /boot/System.map;
  • bëni ndryshime në skedarët e konfigurimit që do të bashkohen /etc/lilo.conf (për LILO) ose /boot/grub/grub.conf - për GRUB, si dhe shtoni cilësime dhe cilësime shtesë për kernelin e ri.

Yaksho vi e dinte mëshirën, bëhu nuselalë, shiko një fragment të tekstit dhe natisnit Ctrl + Enter.

Karakteristikat e veçanta të programit modular rekomandimet e shtëpisë s nxisin programin e strukturës modulare.

Lidhja e moduleve me programet kryesore kryhet sipas rendit të democionit të USES, në të njëjtin radhë blloqet e integrimit të moduleve, të cilat mund të lidhen me programet kryesore përpara shfaqjes së programeve.

Rendi i shfaqjes së moduleve mund të shtohet për të hyrë në të dhënat dhe softuerin e bibliotekës.

Për shembull, nëse modulet me emrat M1, M2 përshtaten me të njëjtin tip A, ndryshojnë B dhe programin C, atëherë nëse modelet USES janë të lidhura me A, B, C në të gjithë PE, ato do të jenë ekuivalente me 2 module. .

Nëse dëshironi të karakterizoni korrektësinë e biteve me ato që kërkohen nga i njëjti proces i moduleve të lidhura shtesë, kur moduli është i lidhur me modulin, mund të shtoni modulin dhe përmes pikës së objektit: МСА М1 В М1 .

Natyrisht, është e lehtë për të përfunduar. program i madh në dy pjesë (PE), pra programi kryesor + modulet.

PE riformësimi i lëkurës në segmentin e saj të memories dhe në të tijën skedari i diskut.

Të gjitha llojet e zhveshura, si dhe ato të qeta, që janë fajtorë për disponueshmërinë, janë të disponueshme për PE (programi kryesor dhe modulet e mundshme) duhet të shtohen në modulin premium me një pjesë të zbrazët të vikonuar. Në të njëjtën kohë, unë nuk i ndjek bishat, i respektoj ata që nuk e pëlqejnë PE (për shembull, një modul) nuk janë të egër të gjithë tsikh lakuriq. Në pjesën fillestare të një moduli të tillë, mund të përfshihen operatorë, në mënyrë që skedarët të lidhen me jo standarde skedarët e tekstit(CAKTONI) і і і і і і і і і і і і skedarët, në mënyrë që t'u siguroni atyre lojën përpara transferimit të haraçit (RESET dhe RIWRITE).

Grupi i parë i programeve, për shembull, një sërë funksionesh kompakte, vendosen në 3 (sipas) modulit;

Kur softueri shpërndahet sipas moduleve në një projekt të palosshëm, një respekt i veçantë për gabimin i kushtohet orarit dhe momentit të shkrimit.

Në mes të TR koshty, ato janë përpiluar në mënyra të ndryshme.

Përpiloni Alt + F9 RUN Cntr + F9

Memoria e destinacionit

Mënyrat zhvillohen vetëm në mënyrën e komunikimit dhe programin kryesor.

Mënyra e përpilimit

Kompiluar është programi kryesor ose një modul, i cili ndodhet në këtë moment në dritaren aktive të redaktorit. Sapo të ketë një ndryshim në modulet jo standarde të një koristuvach, atëherë mënyra e dukshmërisë për të njëjtat skedarë disk me shtesa ___. Tpu për një shtesë të tillë të lëkurës.



Nëse Destinacioni ruhet në memorie, atëherë skedarët do të humbasin vetëm në memorie dhe skedari i diskut nuk do të fshihet.

Megjithatë, është më e thjeshtë të përpilosh skedarët tpu së bashku me përpiluesin e të gjitha programeve për mënyra shtesë, pasi nuk është e mundur të konfigurosh Disk për opsionin e destinacionit.

Bëni modalitetin

Kur përpiloni në të gjithë modalitetin, përpara (para përpilimit të programeve kryesore) për modulin e lëkurës, duhet të ndryshohet sa vijon:

1) Heqja e një skedari tpu të diskut; nëse nuk është, atëherë automatikisht pulson përmes përpilimit të tekstit dalës të modulit, në mënyrë që të jetë skedar pas

2) Rakordimi i modulit të njohur për skedarin tpu, ku mund të ishin bërë ndryshimet; skedari tpu mbyllet automatikisht në dritaren e parë

3) Pamundësia e seksionit të ndërfaqes së modulit: nëse ka një ndryshim, atëherë të gjitha këto module (si p.sh. skedarët pas-files) gjithashtu rikompilohen, me ç'rast moduli tregohet në propozimin USES.

Sapo nuk kishte ndryshim në tekstet e kallirit të moduleve, përpiluesi i robotit do të ndërlidhej me tpu - skedarin dhe orën fitimtare për përpilim.

Mënyra e ndërtimit

Në pamjen e modalitetit Make, shfaqet automatikisht dukshmëria e skedarëve të daljes pas; të kryejë përpilimin (ripërpilimin) e modulit skin dhe nga garantuesi i të gjitha ndryshimeve në tekstet pas-file. Është një orë shtesë e përpilimit të programeve në tërësi.

Në pamjen nga modaliteti përpilues, modaliteti Make and Build ju lejon të riparoni programin e strukturës modulare nga çdo skedar i dhënë pas (i cili quhet i pari), ashtu siç është skedari (ose një pjesë e programeve). në redaktorin aktiv. Në tërësi, në pikën e kompilimit, zgjidhni opsionin Primary file, shtypni Enter dhe shkruani skedarin origjinal pas dhe kompilimi do të mbahet mend nga vetë skedari.

Nëse skedari origjinal nuk shfaqet ashtu, atëherë përpilimi në mënyrat Make, Build dhe RUN mund të jetë vetëm në të njëjtën mënyrë siç është programi kryesor në dritaren aktive të redaktuesit.

Rreth: "Për motivet e ripërkthimit" Linux Device Driver edicioni i 2-të. Transferimi: Princi Oleksiy [Email i mbrojtur] datë gjarpri i fundit: 03.08.2004 Shpërndarja: http://lug.kmv.ru/index.php?page=knz_ldd2

Tani le të rregullojmë programin! Në të njëjtën kohë, do të mbulohen dispozitat kryesore për modulet dhe për softuerin në kernel.
Këtu zgjedhim dhe nisim një modul të ri, struktura e të cilit do të dukej si një drejtues i vërtetë modular.
Në të njëjtën kohë, ne përqendrohemi në pozicionet e kokës dhe jo në specifikat e bashkëngjitjeve reale.

Të gjitha pjesët e kernelit, si funksionet, ndryshimet, kokat dhe makrot, si hamendja këtu, do të jenë
të përshkruara në detaje në libër.

Përshendetje Botë!

Në procesin e njohjes me materialin origjinal të shkruar nga Alessndro Rubini & Jonathan Corbet, prapanica nuk është shumë larg, dhe synimi është Hello world! Për këtë, unë dua ta lexoj atë, për shikimin tim ka një version më të madh të modulit të parë. Jam i inkurajuar që nuk ka probleme me instalimin e kernelit të versioneve 2.4.x. Moduli i përhapjes dhe mënyra e përpilimit të tij lejojnë vikoristovuvati në kernel, pasi është i ndjeshëm ndaj dhe nuk pranon kontrollin e versionit. Lexoni më shumë dhe mësoni më shumë për detajet dhe terminologjinë, do ta hap vim-in menjëherë dhe do ta rregulloj!

================================================== // skedari hello_knz.c #include #përfshi <1>Përshëndetje, bota \ n "); return 0;); void cleanup_module (void) (printk ("<1>Mirupafshim botë mizore \ n ");) MODULE_LICENSE ("GPL"); ================================= ================

Për të përpiluar një modul të tillë, mund të përdorni hapat Makefile. Mos harroni të vendosni një karakter skedë përpara rreshtit për ta rregulluar atë me $ (CC) ....

================================================== FLAGS = -c -Wall -D__KERNEL__ -DMODULE PARAM = -I / lib / module / $ (uname i guaskës -r) / ndërtoj / përfshin hello_knz.o: hello_knz.c $ (CC) $ (FLAGS) $ (PARAM) - o [Email i mbrojtur] $^ =================================================

Këtu ka dy specialitete, në përputhje me kodin e botës origjinale Hello, të propozuar nga Rubini & Corbet. Së pari, moduli do të jetë një version amë dhe do të ndërtohet nga versioni i kernelit. Ato arrijnë vlerat \ u200b \ u200 të ndryshimit të PARAM-it në skenarin e përpilimit. Përndryshe, tani moduli do të licencohet në GPL (i vërtetuar në makro MODULE_LICENSE ()). Nëse nuk mund ta vrisni, atëherë kur të instaloni modulin në kernel, mund ta mposhtni atë, afërsisht, ai do të fillojë:

# Insmod hello_knz.o Paralajmërim: ngarkimi hello_knz.o do të njollosë kernelin: pa licencë Shikoni http://www.tux.org/lkml/#export-tainted për informacion rreth moduleve të ndotura Moduli hello_knz i ngarkuar, me paralajmërime

Të shpjegueshme tani janë opsionet e përpilimit të modulit (vlerat makro do të shpjegohen më poshtë):

-z- nëse ky opsion është i disponueshëm, përpiluesi gcc do të ndalojë procesin e përpilimit të skedarit menjëherë pas dërgimit të skedarit në skedar, mos hezitoni të provoni hapjen e binarëve.

- Muri- vlera maksimale për funksionimin e robotit gcc.

-D- vlera e makrove. Këto janë direktivat #define në skedarët e përpiluar. Absolutisht asnjë ndryshim, në një farë mënyre për të filluar, si vikoristoyutsya në këtë modul, makro, për shtesën #define në skedarin burimor, ose për opsionin shtesë -D për përpiluesin.

- Unë- shtesa për një shaka përfshijnë skedarë. Respekt shtazor për Fitoren e vendosjes "uname -r", siç dua të them, do të emërtoj saktësisht versionin viktorian të kernelit në momentin danez.

Në sulmin razdіlі solli prapanicën іnshy të modulit. Atje, raporti shpjegon se si të instalohet dhe të vivantohet nga kerneli.

Origjinale Hello botë!

Tani shfaqet kodi origjinal i modulit të thjeshtë "Hello, World", i promovuar nga Rubini & Corbet. I gjithë kodi mund të kompilohet për kernelet nga 2.0 në 2.4. E gjithë prapanica, si të gjithë ata, është paraqitur në libër, i disponueshëm në faqen e O'Reilly FTP (div. Kapitulli 1).

// skedar hello.c #define MODULE #include int init_module (void) (printk ("<1>Përshëndetje, bota \ n "); return 0;) void cleanup_module (void) (printk ("<1>Lamtumirë botë mizore \ n ");)

funksionin printk () projektuar në kernel Linux dhe praktik si funksionalitet standard biblik printf () në filmin Сі. Bërthama ka nevojë për fuqinë e vet, por është e vogël në përmasa, funksioni i vivedennya është që të bëhet pa mes në bërthamë, dhe jo në bibliotekat e standardit për koristuvach rivnya. Moduli mund të përdoret si funksion printk () Kjo është arsyeja pse moduli u mbyll për një komandë shtesë i pakëndshëm moduli lidhet me kernelin dhe mund të aksesojë funksionet e publikuara (të eksportuara) dhe të ndryshojë kernelin.

Parametri i vargut "<1>", Prioriteti është funksioni rrezitje në printk (). Në anglishten origjinale dzherels përdoret termi loglevel, që do të thotë termi logging. aplikimi i dhënë mi vikoristovuєmo është një prioritet i lartë për rastin, kur shihni një numër të vogël. Prioriteti i lartë ndonjëherë kërkohet, sepse, duke pasur parasysh përparësinë, mund të mos arrijmë ta marrim atë në tastierë, sepse moduli është i instaluar. Ndryshimi i drejtpërdrejtë i kernelit me përparësinë që drejtuesi të vendosë versionin e kernelit që funksionon, versionin e demonit klogd, I konfigurimi juaj. Më shumë detaje, një robot me një funksion printk () Mund të shpjegohen në Kapitullin 4, “Teknika e Përmirësimit”.

Ju mund të protestoni për modulin, për ndihmën e komandës i pakëndshëm për të instaluar modulin në kernel dhe komandat rmmod për të parë modulin nga kerneli. Pjesa e poshtme tregon se si mund të ndryshohet çmimi. Në të njëjtën pikë hyrëse, init_module () do të përputhet kur moduli të instalohet në kernel dhe cleanup_module () kur instalohet nga kernel. Mos harroni se vetëm gjatë kënaqësisë së koristave mund të shtoni dhe fitoni module.

Prapa e modulit, udhëzimi i vishçes, mund të përdoret vetëm me kernelin, pasi është zgjedhur me referencën "mbështetja e versionit të modulit". Është për të ardhur keq që ka më shumë shpërndarje për kernelin me kontroll të versionit (kjo diskutohet në seksionin "Kontrolli i versionit në module" të kapitullit 11, "kmod dhe modularizimi i avancuar"). Unë dua një version më të vjetër të paketës modutils Lejimi i moduleve të tilla që të shtohen në kernel, të zgjedhur me kontrollin e versionit, tani është e pamend. Megjithatë, paketa modutils zbulon grupin e programeve, përpara se të futet në programet insmod dhe rmmod.

Menaxheri: Kontrolloni numrin e versionit dhe vendndodhjen e paketës modutils nga shpërndarja juaj.

Kur përpiqeni të futni një modul të tillë në kernel, në mënyrë që kontrolli i versionit të zbatohet, mund të filloni të dini për faljen sa më shpejt të jetë e mundur:

# Insmod hello.o hello.o: mospërputhja e versionit të kernel-modulit hello.o u përpilua për versionin 2.4.20 të kernelit ndërsa ky kernel është versioni 2.4.20-9asp.

Në katalozë misc-module prapanicë nga ftp.oreilly.com do ta njihni prapanicën origjinale nga programet hello.c, pasi mund të zëvendësoni edhe tre rreshta të tjerë, dhe ndoshta është i instaluar në bërthamat siç mund ta shihni, kështu që nuk keni nevojë për kontroll të versionit. Yak bi nuk ishte aty, rekomandohet fuqimisht që të ndryshoni kernelin pa shtuar kontrollin e versionit. Në të njëjtën kohë, rekomandohet të merrni kernel dzherel origjinal në faqen www.kernel.org

Nëse jeni i sapoardhur në koleksionin e bërthamave, atëherë përpiquni ta lexoni artikullin, si Alessandro Rubini (një nga autorët e librit origjinal), e postoi në http://www.linux.it/kerneldocs/kconf, dhe Unë jam fajtor që ju ndihmoj në zotërimin e procesit.

Vizitoni konsolat e tekstit të komandës për përpilimin dhe testimin e modulit origjinal të drejtuar nga prapanica.

Root # gcc -c hello.c root # insmod ./hello.o Përshëndetje, rrënjë botërore # rmmod përshëndetje Lamtumirë rrënjë botërore mizore #

Është gjithmonë një çështje mekanizmi, i cili është sistemi juaj për transferimin e rreshtave në një kohë, drejtpërdrejt në mekanizëm, në mënyrë që të mund të përdorni funksionin printk (), Mund të shihet. Në aplikacionin e drejtuar, testi i modulit, kur kaloi nga funksioni printk (), dukej se ishte dërguar në të njëjtën tastierë; Tse prapanicë e një libri njohurish nga një tastierë teksti. Komanda Yaksho vy vikonute i pakëndshëmі rmmod me programe xterm Se, shvidshe për çdo gjë, mos mundi asgjë në terminalin tuaj. Zëvendësojeni, ndonjëherë mund të gjendet në një nga hyrjet e sistemit, për shembull në / Var / log / mesazhe. Emri i saktë i skedarit ruhet në çantën e shpërndarjes. Çudi në orën e ndryshimit të skedarëve të regjistrit. Mekanizmi, i cili vikorizovuyutsya për transferimin e informacionit nga funksioni printk (), përshkrimet në seksionin "Si regjistrohen mesazhet" në seksionin 4 "Teknika
mirësi”.

Për një shikim në pamjen e modulit në skedarët e regjistrit të sistemit / val / log / mesazhet, mund të përdorni manualisht bishtin e shërbimeve të sistemit, ndërsa për ndryshimet, futni 10 rreshtat e fundit të transferuar në skedar. Një opsion i shpejtë i ndihmës - opsioni -f për të nisur do të përdoret për të përdorur skedarin në modalitetin pas rreshtave të mbetura, në mënyrë që kur të shfaqen rreshta të rinj me erë të keqe në skedar, ai do të shfaqet automatikisht. Për të zupiniti vikonannya komandën në të gjithë pamjen, duhet të shtypni Ctrl + C. Kështu, për të parë dhjetë rreshtat e fundit në skedarin e hyrjeve të sistemit, futni rreshtin e komandës më pas:

Rrënja # bisht / var / log / mesazhe

Yak vi can bachiti, shkrimi i modulit nuk është aq i zoti, sa mund të ngrihesh. Naivazhcha chastina është një ndjenjë inteligjence, sa praktike është lidhja juaj dhe si të bëni një modul shvidcode. Në kapitujt e avancuar të njohurive, ka më shumë rreth shkrimit të moduleve të thjeshta, dhe specifikat e bashkëngjitjeve nevojiten për kapitujt fyes.

Karakteristikat midis moduleve të kernelit dhe shtesave

Dodatok ka një pikë për të hyrë, si ta rregullojë dhe ta marrë menjëherë suplementi i nisur në memorien operative të kompjuterit. Pika e hyrjes përshkruhet në funksionin kryesor (). Përfundimi i funksionit kryesor () nënkupton përfundimin e programit. Moduli ka disa pika hyrëse, të cilat shfaqen kur moduli është i instaluar dhe i dukshëm nga thelbi, si dhe kur ndërhyrës përpunohet, si një furnizim me energji elektrike. Pra, pika në pikën hyrëse init_module () është të kërkosh një modul që është kyçur në kernel. Funksioni cleanup_module () do të përputhet kur thirret një modul. Ju mund të mësoni nga të njëjtat pika hyrëse në modul, të cilat mund të shfaqen kur energjia furnizohet me modulin.

Aftësia për të siguruar dhe zëvendësuar modulet është dy faktorë në mekanizmin e modularizimit. Erë e keqe mund të vlerësohet në çelësat. Për një shitës me pakicë, çmimi do të thotë, para së gjithash, një ndryshim në orën e lëshimit, kështu që ju mund të testoni funksionet e shoferit pa procesin e ndërlikuar të rilidhjes.

Si programues, ju e dini që një suplement mund të përdoret si funksion, pasi nuk është shpallur në një suplement. Në fazat e kompozimit statik ose dinamik, fillojnë adresat e funksioneve të tilla nga bibliotekat e përgjithshme. funksionin printf () një nga këto funksione, i cili tregohet në bibliotekë libc... Moduli, nga ana tjetër, i lidhjes vetëm me një bërthamë, dhe mund të përdoret vetëm për ato funksione, të cilat eksportohen nga bërthama. Kodi i vikonuvatsya në thelbin nuk mund të vikoristovovat emrin e bibliotekës. Kështu, për shembull, funksioni printk (), Yaka vikoristovavasya në prapanicë përshëndetje.c, Është një analog i funksionit të videos printf (), E disponueshme në suplemente për koristuvach rivnya. funksionin printk () ajo është e zhvendosur në thelbin dhe është fajtore e nënës, nëse është e mundur, madhësia minimale. Për këtë, nga pikëpamja e printf (), unë tashmë mund të rrethohem nga një sërë llojesh të dhënash dhe, për shembull, nuk do të pranoj numra me një pikë lundruese.

Zbatimi i kernelit 2.0 dhe 2.2 pa një specifikues të veçantë të tipit Lі Z... Stink Booley u prezantua vetëm në versionin 2.4 të kernelit.

Figura 2-1 tregon zbatimin e mekanizmit të funksionit wiklik, siç janë pikat e hyrjes në modul. Po kështu, në të gjithë imazhin e vogël të mekanizmit të modalitetit të ndërlidhur të modulit të instaluar me bërthamën.

I vogël. 2-1. Lidhja e modulit me kernelin

Një nga veçoritë e sistemeve operative Unix / Linux është se ato mund të lidhen me module kernel. Siç e dini tashmë, modulet, kur janë të kyçura, lidhen me kernelin, kështu që gjithçka që është për modulin tuaj, funksioni duhet të zhvlerësohet në skedarët e kokës së kernelit dhe është i pranishëm në kernel. Tekstet e miniaplikacioneve të moduleve nicoli nuk jam fajtor për të përfshirë tituj të veçantë nga biblioteka e hapësirës koristuvatsky. Për modulet e kernelit, mund të zgjidhni të përdorni vetëm funksione që funksionojnë si pjesë e kernelit.

E gjithë ndërfaqja e kernelit, përshkrimet në skedarët e kokës, mund të gjenden në drejtori përfshijnë / linuxі përfshijnë / asm në mes të kodeve të bërthamës së kallirit /usr/src/linux-x.y.z(X.y.z është versioni juaj i kernelit)). Shumica e shpërndarjeve të vjetra (bazuar në libc versioni 5 ose më pak) / Usr / përfshijë / linuxі / Usr / përfshijnë / asm për të gjitha drejtoritë në burimet e kernelit. Fuqitë simbolike japin fuqinë, nëse është e nevojshme, për të zgjedhur ndërfaqen e bërthamës në formën e shtesave për koristuvach.

E parëndësishme për ata që kanë një ndërfaqe bibliotekë të bërthamës, tani ato shfaqen në ndërfaqen thelbësore, në veçanti, për të kuptuar proceset e bërthamës, nevoja për të përditësuar ndërfaqen thelbësore është e nevojshme. Megjithatë, është bërë shumë përpjekje në skedarët e kokës së kernelit që të futen vetëm në vetë kernel dhe nuk janë fajtorë që janë të disponueshëm për shtesat e koristuvach. Atij që mbeti i befasuar #ifdef __KERNEL__ blloqe. Boshti i asaj që drejtuesi juaj, si ai në kodin e kernelit, është fajtor, por i përpiluar me një simbol makro lakuriq __kerneli__.

Roli i titujve shtesë në skedarët e kernelit do të diskutohet në vijim sipas nevojës.

Zhvilluesit që punojnë me projekte të shkëlqyera softuerësh (për shembull, si thelbi), fajësojnë vrahovuvati dhe unicati "Obrudneniya për pafundësinë e burrave"... Qia problemi i winikut në rast eksplicite numër i madh Funksionet dhe ndryshimet globale të njerëzve nuk janë shumë të ndryshme (mbahen mend). Programuesi, i cili do të jetë i kënaqur me suplemente të tilla, do t'i thotë nënës për më shumë se një orë të kujtojë emrat e "rezervuar" dhe të shpikë emra unikë për elementë të rinj. Numri i emrave (paqartësive) mund të zgjidhë një numër të madh problemesh, duke rregulluar faljet kur moduli është i mbyllur, duke i dhënë fund sjelljes së paqëndrueshme ose të paarsyeshme të programit, pasi mund të shfaqet në koristikë, si dhe në thelbin vicioz. , konfidenciale

Shitësit nuk mund të lejojnë falje të tilla kur shkruajnë kodin e kernelit, kështu që vetë moduli më i vogël do të lidhet me kernelin. Ne pastrojmë zgjidhje për t'u siguruar që kolosi i emrave є, në Pershe, duke hequr objektet tuaja me programe jak statike, Dhe, në një mënyrë tjetër, viktoriani për imenuvannya e objekteve globale është unik, në kufijtë e sistemeve, parashtesa. Përveç kësaj, si zhvillues i modulit, ju mund të kontrolloni zonat e dukshmërisë së objekteve në kodin tuaj, siç përshkruhet në seksionin "Tabela e lidhjes së kernelit".

Shumica (por jo të gjitha) versionet e komandës i pakëndshëm Eksporto të gjitha objektet e modulit, të cilat nuk janë të zhveshura si statike Për arsyet, domethënë, në module nuk ka udhëzime të veçanta për të gjithë rakhunok. Për këtë, është mjaft e arsyeshme të ekspozoni komponentë shtesë, pasi nuk shkoni për të eksportuar, jak statike.

Prefiksi unik Vikoristannya për objektet lokale në mes të modulit mund të jetë një praktikë e mirë, kështu që unë do të kërkoj një nder. Pas një ore testimi të drejtuesit tuaj, mund të dini se si të eksportoni objekte shtesë në kernel. Nëse keni një parashtesë unike për një emër specifik, nuk dëshironi të shtoni një koloni në hapësirën e emrit të kernelit. Parashtesa, si të jesh fitimtar në thelb, për amvisëri, në mënyrë mëkëmbëse për të simbolizuar regjistrin e poshtëm dhe do të kënaqemi me të gjithë.

Ekziston edhe një dallim tjetër midis bërthamës dhe indikacioneve për koristuvach nga proceset e pastrimit në mekanizmin e përpunimit të barërave. Thelbi i kontrollit vikonannya në procesin e caktuar për koristuvach, që falja në procesin e caktuar për koristuvach është të prodhojë një defekt që nuk është tronditës për sistemin: një gabim segmentimi. Në të njëjtën kohë, ju mund të jeni pronar i vikoristany vіdladchik për vіdsthezhennya pomylki në kodin vikhіdnom të caktuar për programet corystuvach. Pombët gjenden në thelb fatale - nëse jo për të gjithë sistemin, atëherë, të paktën, të lidhura me rrjedhën e aktivitetit. Në razdіlі "Pasurimi i granteve të sistemit" Kapitulli 4 "Teknikat e Iluminizmit", mund të shihen metodat e hapit pas bërthamave.

Hapësira bërthamore dhe hapësira e bërthamës

Moduli për të vizituar të ashtuquajturat hapësirat e hapura të bërthamës, Todi yak dodatki pratsuyut v. Koncepti Qia - baza e teorisë së sistemeve operative.

Një nga karakteristikat kryesore të sistemit operativ të fushës në koristuvachin e dhënë dhe përcaktimi për programet koristuvach të burimeve kompjuterike, shumica e të cilave janë të përfaqësuara ndërtesa ndihmëse... Sistemi operativ është fajtor jo vetëm për sigurimin e aksesit në burime, por edhe për kontrollin mbi videon dhe regjistrimin, në mënyrë që të parandalohet sasia e aksesit dhe aksesi i paautorizuar. Për të shtuar në tsiogo, sistemi operativ Ju mund të konfiguroni operacione të pavarura për programin dhe të pastroni nga qasja e paautorizuar në burime. lajmet e tsієї zell jo i parëndësishëmËshtë e mundur vetëm në atë rast, nëse procesori nuk do të jetë në gjendje të trajtojë programet e sistemit nga të dhënat e koristuvach.

Praktikisht është një procesor miqësor ndaj lëkurës për të siguruar një podil të tillë, për realizimin e privilegjeve të reja për kodin e përzgjedhur (është e nevojshme jo më pak se dy të barabarta). Për shembull, procesorët e arkitekturës I32 mund të kenë një zgjedhje të privilegjeve të barabarta nga 0 në 3. Për më tepër, niveli 0 mund të bëhet i privilegjuar. Për përpunues të tillë, ekziston një klasë udhëzimesh preferenciale, të cilat mund të shfaqen vetëm në luginat preferenciale. Sistemi Unix dhe vicoristovuyut dy privilegje të barabarta të procesorit. Nëse procesori ka më shumë se dy vjet privilegj, atëherë do të jetë më i ulëti dhe më tërheqësi. Kerneli Unix është i hapur tek personi më i mirë privileiv, menaxhim i sigurt i posedimit dhe proceseve të koristuvach.

Nëse po flasim për hapësirat e hapura të bërthamësі hapësirën e caktuar për procesin të mashtrohen nga respekti jo vetëm për kodin e privilegjuar, por edhe për hapësirën specifike të adresave.

Unix transferon informacionin nga hapësira e hapur në procesin në hapësirën e kernelit në dy versione. Në radhë të parë, nëse suplementi koristuvalnitsky i vikonit është në thelb (wiklik sistemik), dhe, në një mënyrë tjetër, është një orë shërbimi i pererivanit të pajisjes. Kodi i kernelit, i cili shfaqet kur një sistem klikon një proces në kontekstin e një procesi, Tobto pratsuyuchi në interes të wiklik në këtë proces, ju mund të hyni në hapësirën e adresave të procesit. Nga ana tjetër, kodi i vikonuvannya gjatë shërbimit të shkëmbimit të pajisjes është asinkron, sipas procesit, dhe nuk vlen për ndonjë proces të veçantë.

Caktimi i moduleve të fushës në funksionalitetin e zgjeruar të kernelit. Kodi i modulit është i disponueshëm në hapësirën e kernelit. Ju lutemi, moduli është në rregull, duke fyer menaxherin, që përmendët më herët: funksionet e modulit shfaqen si pjesë e sistemit wikkliks, dhe veprimet kërkohen për menaxhimin e transferimit.

Paralelizimi në thelb

Gjatë programimit të drejtuesve të aneksit, në pamjen e shtesave të programuara, është veçanërisht e rëndësishme t'i kushtohet vëmendje shpërndarjes së kodit të zgjedhur. Si rregull, suplementi do të merret nga kalli deri në fund të ditës së fundit, pa u shqetësuar për ndryshimin e otoçenisë suaj. Kodi i bërthamës është fajtor për urahuvannya e faktit se para një ore ju mund të fitoni një shtyllë kurrizore të një bishë.

Nuk ka arsye të dukshme për paralelizimin e kodit të kernelit. Po kështu, nuk ka probleme me funksionimin në Linux dhe disa prej tyre mund të kthehen në kodin e modulit tuaj brenda natës. Bashkëngjitjet e Bagato-s mund të gërryejnë procesorin. Sondat pererivan wiklikayutsya në mënyrë asinkrone і mund të jenë wiklicans në atë moment, nëse shoferi juaj është i angazhuar në furnizimin me energji elektrike wіkonannya іnshy. Deyaki i abstraksioneve të softuerit (siç janë kohëmatësit e kernelit, siç shpjegohet në Kapitullin 6 "Rrjedha e Kohës") funksionojnë gjithashtu në mënyrë asinkrone. Përveç kësaj, Linux mund të funksionojë në sisteme me shumëprocesorë simetrik (SMP), si rezultat, kodi juaj i drejtuesit mund të shihet njëkohësisht në procesorët e desktopit në një orë.

Për tre arsye, kodi i kernelit Linux, duke përfshirë kodet e drejtuesve, është fajtor për rikthimin, kështu që është fajtor se është ndërtuar mbi bazën e më shumë se një konteksti që jepet brenda natës. Struktura e këtyre palëve fajtore është thyer nga shpërndarja paralele e rrymave decilare. Në zemrën e tij, kodi i kernelit është fajtor i nënës së ndërtimit të një numri rrymash paralele që nuk janë në përdorim. Shkrimi i një kodi të tillë, i cili mund të shfaqet në situata paralele dhe unike, në të cilat kjo e fundit mund të çojë në një problem të parëndësishëm të sistemit, në shumë orë dhe, ndoshta, mashtrim. Prapa lëkure e shoferit në tsi knizi është shkruar nga fjalët e paraleles rënkimore vikonannya. Nëse është e nevojshme, ne do të shpjegojmë veçoritë e teknikës së shkrimit të një kodi të tillë.

Naybіlsh zagalnaya pamyka, sa për të pranuar programet e fushës në to, por paralelizmi nuk është problem, disa nga kodi i segmentit deyakі nuk mund të shkojnë në "kampin e gjumit". Në fakt, kerneli Linux është i pavlefshëm, me një të dhënë të rëndësishme që nuk mund ta rishkruash procesorin për një orë që është e rëndësishme për kodin e kernelit. Do të mbetet një orë, mosngarkueshmëria do të duhet të përfundojë për rozetën e pamposhtur në sasi të mëdha. Sidoqoftë, në sistemet SMP, kodi i vivantacionit nuk kërkohet përmes llogaritjes paralele.

Për sa kohë që kodi juaj po transferohet, nëse nuk do të jetë i gjallë, atëherë nuk do të përpunohet saktë në sistemet SMP. Navit nëse nuk e njeh sistemin, її mund të ma htos інshiy, i cili vikoristyuє kodin tënd. Po kështu, ndoshta, në të ardhmen, në thelb, do të ketë aftësi vikoristovovatsya, që, për të lundruar sistemet me një proces dhe nëna do të jetë e drejtë nga paralele kudo. Ekzistojnë gjithashtu opsione për zbatimin e bërthamave të tilla. Në një gradë të tillë, një programues inteligjent do të shkruajë kodin për kernelin në fillim, sapo ai të punojë në sistemet me SMP.

Përafërsisht. duke u zhvendosur: Vibachte, por dy paragrafët e fundit, nuk më shqetësojnë. Mund të jetë rezultat i transferimit të gabuar. Unë do t'ju tregoj tekstin origjinal.

Një gabim i zakonshëm i bërë nga programuesit e drejtuesve është të supozojnë se bashkëkohësia nuk është problem për sa kohë që një segment i caktuar i kodit
nuk shkon për të fjetur (ose "bllokuar"). Është e vërtetë që kerneli Linux nuk është parandalues; me përjashtim të rëndësishëm të
ndërprerjet e shërbimit, nuk do ta largojë procesorin nga kodi i kernelit që nuk jep me dëshirë. Në kohët e kaluara, kjo jo-preemptive
sjellja ishte e mjaftueshme për të parandaluar konkurencën e padëshiruar në shumicën e kohës. Në sistemet SMP, megjithatë, parandalimi nuk kërkohet për të shkaktuar
ekzekutimi i njëkohshëm.

Nëse kodi juaj supozon se nuk do të paraprihet, ai nuk do të funksionojë siç duhet në sistemet SMP. Edhe nëse nuk keni një sistem të tillë,
të tjerët që ekzekutojnë kodin tuaj mund të kenë një të tillë. Në të ardhmen, është gjithashtu e mundur që kerneli të kalojë në një mënyrë parandaluese të funksionimit,
në të cilën pikë edhe sistemet me një procesor do të duhet të merren me konkurencën kudo (disa variante të kernelit tashmë janë zbatuar
atë).

Informacion në lidhje me procesin e filetimit

Nëse kodi i modulit të kernelit nuk zgjat vikonutsya, si shtesë, gjithsej më shumë kafshë në kernel do të vikonuyutsya, i cili është kthyer në procesin e ri. Kodi i kernelit mund të njihet si një proces wiki duke u kthyer në një magjistar global, i cili do të zbatohet në strukturë struct detyrë_struct, Pevnu, për kernel versionin 2.4, në skedarë , Të përfshira në ... showman aktuale vkazu në procesin aktual të karrierës vikonutsya koristuvalnitsky. Kur shpallen fitore të tilla sistematike hapur () abo mbyll (), Obov'yazkovo ісnuє procesi wiklikav їх. Kodi i kernelit, nëse është e nevojshme, mund të përdoret për të personalizuar informacione specifike mbi procesin e personalizuar përmes treguesit aktuale... Bashkangjitni një tregues të victoriannya të një treguesi tsyo dhe do ta gjeni në seksionin "Kontrolli i hyrjes në bashkëngjitjen e skedarit" në seksionin 5 "Operacionet e përmirësuara të drejtuesit të karbonit".

Për ditën e këtij viti, showman aktuale jo shumë ndryshim global, si në versionet e hershme të kernelit. Shitësit me pakicë optimizuan aksesin në strukturë, pasi përshkruajnë procesin e rrjedhës së lëvizjes së saj në anën e pirgut. Ju mund të pyesni veten për detajet e zbatimit aktual në skedar ... Nuk mund ta falni kodin që ju pëlqen atje. Mund në uvaz, se Linux nuk është sistem i bazuar në SMP, dhe ndryshimi global thjesht nuk do të jetë i suksesshëm, nëse keni të drejtë pa CPU. Detajet e zbatimit do të humbasin për nënsistemet e tjera të kernelit dhe drejtuesi mund të bashkëngjitet në ekran aktuale vetëm përmes ndërfaqes .

Nga pikëpamja e modulit, aktuale të ngjashme me zovnishn posilannya printk ()... Moduli mund të vikoristovuvati aktuale kudo, është e nevojshme. Për shembull, fillimi i shmatokut në kod është një identifikues tjetër (ID e procesit - PID) dhe komanda dhe wiki në modulin e procesit, i cili mund të lexohet përmes fushave të strukturës struct detyrë_struct:

Printk ("Procesi është \"% s \ "(pid% i) \ n", aktual-> comm, aktual-> pid);

Fusha aktuale-> comm є ім'я skedari i komandës krijoi një proces filetimi.

Kompilimi dhe para-instalimi i moduleve

Pjesa tjetër e kapitullit qendror të detyrave është shkruar për modulin e përfunduar, nëse jo atipik. Kjo do të thotë, moduli nuk duhet të vendoset në të njëjtën klasë të përshkruar në seksionin "Klasat e bashkëngjitjeve dhe moduleve" në seksionin 1 "Shtuar në drejtuesin e bashkëngjitjeve". Aplikacioni drejtues i paraqitur në shpërndarje do të quhet kafkë (Simple Kernel Utility për Loading Localities). Ju mund të përdorni modulin e kafkës si një shabllon për të shkruar kodin tuaj lokal.

Vikoristovoєmo e kuptoj "kodin lokal" (lokal) për të mbështetur ndryshimet tuaja personale në kod, në traditat e vjetra të mira të Unix (/ usr / lokale).

Megjithatë, përpara kësaj, është si funksioni init_module () dhe cleanup_module (), ne do të shkruajmë një skript Makefile, të cilin do ta përdorim mjetin make për ta krijuar për të nxitur një modul specifik për kodin.

Para kësaj, si një paraprocesor, është e nevojshme të përpunohet përfshirja e çdo titulli me direktivën #define dhe vlerat e simbolit makro __KERNEL__. Ashtu si në të kaluarën, në skedarët e ndërfaqes së kernelit mund të ketë vlera të kontekstit specifike të kernelit të dukshme vetëm nëse simboli __KERNEL__ është treguar në fazën e parapërpunimit në të kaluarën.

Një simbol i rëndësishëm, i cili tregohet nga direktiva #define, është simboli MODULE. Unë jam fajtor për vlerat përpara se të ndizni ndërfaqen (Shoferi Viklyuchayuchi do të zgjidhet menjëherë me kernel). Drejtuesit që nuk do të futen në bërthamë nuk do të përshkruhen në tekst, kështu që simboli MODULE do të jetë i pranishëm në të gjitha prapanicat tona.

Sa herë që zgjidhni një modul për një sistem SMP, duhet gjithashtu të keni të përfshirë simbolin makro __SMP__ përpara ndërfaqeve të kernelit. Në versionin e kernelit 2.2, ne do ta kufizojmë artikullin në konfigurimin e kernelit në shtimin e një sistemi me një procesor ose multiprocesor. Për këtë, përfshirja e rreshtave të ardhshëm në rreshtat e ardhshëm të modulit tuaj do të sillet deri në prezantimin e sistemit të përpunimit bagato.

#përfshi #ifdef CONFIG_SMP # define __SMP__ #endif

Zhvilluesit e modulit janë gjithashtu përgjegjës për rëndësinë e optimizimeve -O për kompajlerin, për këtë ka shumë funksione inline në skedarët e kokës së kernelit. Përpiluesi gcc nuk ofron shtesa inline për funksionet derisa optimizimet nuk lejohen. Unë kam shtuar cilësimet inline të zgjeruara për opsionet shtesë -g dhe -O për t'ju lejuar, në përgjithësi, të shtoni kodin e funksionalitetit inline në korrigjues. Pra, meqenëse bërthama është gjerësisht me një funksion vicioz në linjë, është edhe më e rëndësishme që era e keqe të zgjerohet saktë.

Megjithatë, respektoni që be-optimizatsii ryvnya-O2 viktoriane është ngritur, në mënyrë që përpiluesi të zgjerohet dhe ato funksione, të cilat nuk përshkruhen si inline. Mund të çojë në probleme, kështu që kodi i disa funksioneve mund të pastrohet për të njohur grupin standard të wiklik-ut tuaj. Për zgjerimet inline, është e arsyeshme që të futet kodi i funksionit në pikën e wikliku për të zëvendësuar udhëzimet e funksionit wikliku. Me sa duket, në të njëjtën kohë, duke qenë se nuk ka funksion wikklic, atëherë nuk ka wiklik stek.

Ju mundeni, do t'ju duhet të rishikoni, për kompilimin e moduleve përdorni të njëjtin përpilues, i cili është i njëjti përpilues për marrjen e kernelit, me ç'rast moduli transferohet për t'u instaluar. Mësoni më shumë rreth dokumentit origjinal nga skedari Dokumentacioni / Ndryshimet roztasovany në bërthamat katalozі dzherel. Zhvillimi i bërthamës dhe përpiluesit, si rregull, sinkronizohen midis grupeve të zhvilluesve. Mund të ketë rënie, nëse hapet në fillim një nga të njëjtët elementë. Kompletet e shpërndarjes Deyaky ofrojnë versione ultra të reja të përpiluesit, të cilët nuk përputhen me kernelin vibran. Unë kam një paketë vipadku, erë e keqe, ulërimë, nadayut okremiy (shpesh renditet kgcc) Me një përpilues, i krijuar posaçërisht për
kompilimet e kernelit.

Nareshty, qe te jesh i papranueshem per falje, do te te propozojme opsionin e perpilimit vikoristovuvati - Muri(Të gjitha paralajmërimet - të gjitha shqetësimet). Ju mund, për kënaqësinë e të gjitha kohërave, do t'ju duhet të ndryshoni stilin tuaj të veçantë të programimit. Kur shkruani kodin e kernelit, stili i kodimit të Linus Torvalds është më i gjallë se stili vikoristovuvati. Pra, dokumenti Dokumentacioni / stili i kodimit, nga katalogu i kernel dzherel, për të plotësuar listën e rekomandimeve për të gjitha ekipet, të cilët duhet t'i referohen programeve të kernelit.

Seti i përpilimeve të modulit, të cilat janë mësuar së fundmi, rekomandohet të ndryshohet në dimër CFLAGS Makefile tuaj. Për shfrytëzimin të bëhet një ndryshim i veçantë është i veçantë;

Krim praporiv në dimër CFLAGS, Makefile juaj mund të përmbajë një meta, si një skedar i zakonshëm. Një meta e tillë është e nevojshme vetëm në atë rast, nëse kodi i modulit për shpërndarjen e skedarëve në numrin e skedarëve në dzherel, mirë, në mes, jo në shpërndarje. Ob'ktnі skedarët ob'nuyutsya komandë ld -r, Yaka nuk është një operacion lidhës në një ndjesi të largët, mos u mrekulloni me operacionin e lidhjes ( ld). Si rezultat i komandës fitimtare ld -rє і. opsion -r do të thotë " i zhvendosshëm - zhvendosje", Tobto skedari dalës i komandës zhvendoset në hapësirën e adresave, për faktin se në të renë nuk ka adresë absolute dhe funksioni wiklik.

Për aplikimin fyes të paraqitjeve, Makefile minimal është i nevojshëm për kompilimin e modulit, i cili mund të ruhet në dy skedarë dzherel. Nëse moduli juaj ruhet në një skedar jerel, atëherë nga prapanica e theksuar, duhet të rregulloni meta për të hakmarrë komandën ld -r.

# Mund të shkoni te direktoria juaj e kernelit dzherel këtu, # ose mund ta kaloni si parametër në wiklik "make" KERNELDIR = / usr / src / linux përfshin $ (KERNELDIR) /. Konfigurimi CFLAGS = -D__KERNEL__ -DMODULE -I $ (KERNELDIR) / përfshin \ -O -Wall ifdef CONFIG_SMP CFLAGS + = -D__SMP__ -DSMP endif të gjitha: skull.o skull.o: skull_init.o kafkë $o (LDo_clean) -. r $ ^ -o [Email i mbrojtur] pastër: rm -f * .o * ~ bërthamë

Sapo të dini gjënë e mallkuar për mjetin make, atëherë mund të shihni rregullat për përpilimin e skedarëve * .c në skedarët * .o. Për shkak se rregulla të tilla nuk janë të nevojshme, mjeti make, nëse është e nevojshme, do të rishkruajë vetë skedarët * .c në skedarët * .o. $ (CC)... Me shumë ndryshime $ (CFLAGS) vikorystovuyutsya për porositjen e përpilimeve.

Në një kohë të shkurtër, nëse dëshironi që moduli të ngatërrohet në kernel. Ne kemi thënë tashmë se për të gjithë ne do të jemi fitimtarë për të përdorur programin insmod, pasi unë do të lidh të gjitha simbolet e parëndësishme (funksionet wiklici dhe in.) të modulit nga tabela e simboleve të kernelit të ekzekutimit. Sidoqoftë, në pamjen e lidhësit (për shembull, një yak ld i tillë), nuk do të ndryshoni skedarin e diskut të modulit, por do të shtoni objektin e modulit të lidhur me bërthamën në RAM. Programi insmod mund të pranojë opsionet e rreshtit të komandës. Ju mund të admironi detajet përmes njeri smod... Për shembull, mund të caktoni një objektiv këndimi dhe një ndryshim të vargut të modulit tuaj vlerë të caktuar përpara se të lidhni modulin me kernelin. Në një renditje të tillë, nëse moduli është ndarë saktë, ai mund të rregullohet në fazën e fiksimit. Një mënyrë e tillë e konfigurimit të modulit i jep shumë lodhje konfigurimit në fazën e përpilimit. Konfigurimi në fazën e paracaktimit do të shpjegohet në seksionin "Manual dhe automatikisht i konfigurueshëm".

Lexuesit e Deyakim do të kenë disa detaje të shërbimeve robotike insmod. Zbatimi i insmod nuk bazohet në disa nga wiklicks të sistemit që gjenden në kernel / modul.c. Funksioni sys_create_module () krijon shumë memorie në hapësirën e adresave të kernelit për të krijuar një modul. Kujtesa është e disponueshme për funksionin shtesë vmalloc () (ndarja Rozdil "vmalloc dhe miqtë" në seksionin 7 "Marrja e kujtesës"). Sistemi wikelik get_kernel_sysms () rrotullon tabelën e simboleve të kernelit, pasi do të jetë vicoristan për të shfaqur adresën reale të objekteve gjatë lidhjes. Funksioni sys_init_module () është një kopje e kodit të përgjithshëm të modulit në hapësirën e adresave të kernelit dhe inicializimin e funksionit të modulit.

Nëse pyesni veten për kodin e kernelit dzherel, atëherë do të dini se ekzistojnë emrat e wiki-ve të sistemit, të cilat riparohen nga parashtesa sys_. Tsei prefiksi vikorists vetëm për sistemin viklikiv. Disa nga funksionet nuk janë fajtorë për këtë. Le të jetë çmimi në krye të faqes kur kodi i kernelit është përpunuar me ndihmën e shakasë grep.

version ugar

Nëse nuk dini asgjë më shumë se kaq, thuhet këtu, atëherë, më mirë për gjithçka, modulet që ju fajësoni do të ripërpilohen për versionin e lëkurës së bërthamës, si erë e keqe që do të ketë lidhje. Moduli i lëkurës është përgjegjës për simbolet, titujt __moduli_kernel_version, Vlera e yakogo
testoni versionin e kernelit të transmetimit me programin insmod. Tsey simboli i qëndisjes në seksion .modinfo skedarë në ELF (Format i ekzekutueshëm dhe lidhës). Më shumë detaje shpjegohen në Kapitullin 11, "kmod dhe modularizimi i avancuar". Kini respekt, me një mënyrë për të kontrolluar versionet mund të ruani vetëm për versionet e kernelit 2.2 dhe 2.4. Në kernelin e versionit 2.0, çmimi tregohet në mënyrë të lirë.

Përpiluesi duhet të caktojë një simbol kudo, nëse përfshihen titujt ... Për këtë, në hovering më parë, aplikacioni hello.c nuk e përshkroi simbolin. Kjo gjithashtu do të thotë që nëse moduli juaj ruhet pa skedarë në dzherel, duhet të përfshini skedarin në kodin tuaj vetëm një herë. Vinyatka є vipadok vikoristannya viznachennya __NO_VERSION__ Mund të mësojmë më shumë.

Pika e poshtme te vlera e simbolit të përshkruar në skedarin module.h dhe në kodin e kernelit 2.4.25.

Static const char __module_kernel_versio / PRE__atribute __ ((seksioni (. Modinfo"))) = "kernel_version =" UTS_RELEASE;

Nëse moduli modifikohet për shkak të mospërputhjes së versioneve, është e mundur të testoni modulin duke kaluar tastin insmod në rreshtin e parametrave -f(Forca). Kjo mënyrë e sigurimit të modulit nuk është e sigurt dhe as e suksesshme. Shpjegoni arsyet e fatkeqësive të mundshme për ta përfunduar atë është e rëndësishme. Është e mundur që moduli të mos bllokohet për shkak të mungesës së ndërlidhjes së simboleve gjatë lidhjes. Në përgjithësi, do të mohoheni sa më shpejt që të jetë e mundur për faljen. Arsyet e dështimit mund të gjenden në ndryshimin e robotëve ose strukturën e bërthamës. Në përgjithësi, bllokimi i modulit mund të çojë në falje serioze për periudhën e vikonannya, si dhe në kolaps të sistemit (paniku i sistemit). Mbetja do të shërbejë si një nxitje e mirë për sistemin fitues dhe kontrollin e versionit. Mospërputhja e versionit mund të kontrollohet në mënyrë më elegante kur kontrolloni versionet në kernel. Kjo diskutohet në detaje në seksionin "Kontrolli i versionit në module" në kapitullin 11 "kmod dhe modularizimi i avancuar".

Nëse dëshironi të përpiloni modulin tuaj për një version të caktuar të kernelit, ju lutemi përfshini skedarin e kokës nga vetë versioni i kernelit. Keni një përshkrim të aplikacionit Makefile për direktorinë vysnachennya për shpërndarjen e skedarëve cich vikoristovuvalasya zminna KERNELDIR... Një përmbledhje e tillë individuale nuk është, me praninë e një kernel dzherel. Gjithashtu, është shpesh rasti që shfaqja e versioneve më të vjetra të kernelit në pemën e drejtorive. Të gjithë synojnë në fund të prapanicës së moduleve vikoristovuyt zminnu KERNELDIR për të shtuar shpërndarjen në drejtorinë e versionit aktual të kernelit dzherel, në të cilin transferohet lidhja e modulit të zgjedhur. Për të shtuar një drejtori, mund të përdorni një ndryshim të sistemit ose ta transferoni atë përmes parametrave të linjës së komandës për mjetin make.

Kur moduli është i kyçur, programi insmod do të përdorë fuqinë e tij për të bërë shaka me skedarët e modulit, do të shikojë versionet e katalogëve të rënë dhe do t'i rregullojë ato nga pikat / Lib / modulet... Unë dua që versioni i vjetër i programit të përfshijë një katalog të transmetimit në shaka, menjëherë një sjellje e tillë është e papranueshme për arsye dështimi (gjithashtu probleme, RRUGË). Në një renditje të tillë, nëse dëshironi të shtoni modulin nga katalogu i transmetimit, mund ta shtoni atë në stil ./modul.o... Kështu përdoret moduli për çdo version të shërbimeve insmod.

Në disa raste, ju mund të përdorni ndërfaqet e kernelit, siç mund të shihet në versionet 2.0.x dhe 2.4.x. Në përgjithësi, do t'ju duhet të hyni në makro për ta ndihmuar atë, për të filluar versionin threading të kernelit. Makro daneze e qepjes në kokë ... Ka gjithashtu një rënie në dukshmërinë e ndërfaqeve me fitore të tilla. Mund të prishet ose menjëherë gjatë përshkrimit, ose në seksionin përfundimtar, në seksionin e veçantë për caktimin e versioneve të mungesës. Vinos është një detaj në seksionin rreth tij, në një lloj vipadk, për të lejuar që të mos përshpejtohet përshkrimi i versionit 2.4.x të kernelit.

Në titujt kryesorë linux / version.h Vlerat e makrove fillestare të lidhura me vlerat e versionit të kernelit.

UTS_RELEASE Macro, duke u zgjeruar me radhë, do të përshkruajë versionin e bërthamës së transmetimit
kodet e pemës së kallirit. Për shembull, makro mund të zgjerohet në taku
rresht: "2.3.48" . LINUX_VERSION_KODI E gjithë makro zgjerohet në një version binarizuar të kernelit, sipas
një bajt për pjesë të lëkurës së numrit. Për shembull, binarne
e bashkangjitur për versionin 2.3.48 bude 131888 (dhjetra e
për heks 0x020330). Mozhlivo, bіnarne
yyavlenya do t'ju jepet më shumë se një varg. Respekt, ju merrni
kur lejohet të përshkruhen jo më shumë se 256 opsione në lëkurë
pjesë të numrit. KERNEL_VERSION (i madh, i vogël, lëshim) Vlera makro lejohet nga "kernel_version_code"
nga elementët individualë në versionin e magazinës së bërthamës. meqe ra fjala,
nga afër KERNEL_VERSION (2, 3, 48)
zgjerohet në 131888. Vlera makro mund të rregullohet manualisht kur
Versioni rutinë i filetuar i kernelit me të nevojshmet. Do të jemi shumë herë
vikoristovuvati tse vlera makro që shtrin të gjithë librat.

Duke treguar një skedar linux / version.h për kernelin 2.4.25 (teksti i titujve qëndron pezull mbi).

#define UTS_RELEASE "2.4.25" #define LINUX_VERSION_CODE 132121 #define KERNEL_VERSION (a, b, c) (((a)<< 16) + ((b) << 8) + (c))

Titujt version.h përfshihen në skedarin module.h, kështu që, si rregull, nuk duhet të përfshini versionin.h në kodin e modulit tuaj në mënyrë eksplicite. Nga ana tjetër, mund të siguroheni që të përfshini titujt version.h në module.h për një makro të pjekur __NO_VERSION__... Ju do të jeni vicoristovovuvati __NO_VERSION__, Për shembull, nëse duhet të ndizni në një numër skedarësh dzherel, të cilët, për kohëzgjatjen, do të lidhen në një modul. lakuriqësia __NO_VERSION__ para modulit të titujve të përfshirë.h zapobіgaє
përshkrim automatik i rreshtit __moduli_kernel_version abo її ekuivalent në skedarët dzherel. Mozhlivo, nuk duhet të habiteni nëse jeni të kënaqur me lidhjen e skarg në ld -r, Yakuyou nuk do të jetë i denjë për përshkrime të shumta të simboleve në tabelat lidhëse. Emri, nëse kodi i modulit të shpërndarjes është në numrin e skedarëve në dosje, nëse përfshini titujt Kjo është lakuriqësia __NO_VERSION__ të kesh frikë nga të gjithë skedarët përveç njërit. Në libër, prapanica e modulit është e theksuar, __NO_VERSION__.

Një numër i madh depozitash të lidhura nga versioni i kernelit, mund të ndahen për shkak të logjikës shtesë, të nxitur nga direktivat e paraprocesorit, nga vlerat makro KERNEL_VERSIONі LINUX_VERSION_KODI... Megjithatë, ndryshimi i depozitave të versioneve mund të përshpejtojë shumë lexueshmërinë e kodit të modulit për shpërndarjen e direktivave të përafërta #ifdef... Për këtë, duke i kënduar zgjidhjeve më të bukura - tërheqja e konvertimit të depozitave në skedarin e kokës okremiy. Boshti i prapanicës sonë përfshin titujt sysdep.h, Yakiy vikorystovuєtsya për shpërndarjen në të gjitha makro-vlerat e reja, të lidhura me përmbysjen e depozitimit të versioneve.

Versioni i parë është i ndenjur, do të doja të imagjinoja të jem në një metal të zhveshur " bëj instalimin"Skenari i përpilimit të drejtuesit tonë. Ju mund të kishit pastruar direktorinë e instalimit, e cila ndryshoi nga versioni i parazgjedhur i kernelit, vibronte në bazë të skedarit version.h. U shfaq një fragment i kodit nga skedari . Rregullat.bëj, Yaky vikorystovutsya usіma kernel Makefile.

VERSIONFILE = $ (INCLUDEDIR) /linux/version.h VREION = $ (shell awk -F \ "" / REL / (print $$ 2) "$ (VERSIONFILE)) INSTALLDIR = / lib / module / $ (VERSION) / të ndryshme

Respekte shtazore, për instalimin e të gjithë drejtuesve tanë, drejtoria misc është fitimtare. Duke u riparuar nga versioni i kernelit 2.4, katalogu rekomandohet për shpërndarjen e veçorive për drejtuesin. Për më tepër, si versionet e vjetra ashtu edhe ato të reja të paketës modutils kanë katalogun misc në mënyrën e tyre.

Vikoristovuchi jepet në formën e INSTALLDIR, meta-ja e instalimit në Makefile mund të shihet nga renditja vijuese:

Instalo: instalo -d $ (INSTALLDIR) instalo -c $ (OBJS) $ (INSTALLDIR)

Ndodhja e platformave

Platforma kompjuterike e lëkurës ka veçoritë e veta, të cilat janë fajtore për të qenë të siguruar nga zhvilluesit kryesorë për arritjen e produktivitetit më të lartë.

Zhvilluesit e kernelit mund të kenë më shumë liri në zgjedhjen e tyre dhe të pranojnë zgjidhje / PCLASS = "perëndimore" dhe zhvilluesit e softuerit. E njëjta liri ju lejon të optimizoni kodin, mund të përfitoni sa më shumë nga platformat specifike të lëkurës.

Kodi i modulit është fajtor, por është përpiluar nga vetë opsionet e përpiluesit, si fitoret boolean gjatë përpilimit të kernelit. Duhet të zbatohet deri në regjistrimin e skemave të njëjta të regjistrimit të regjistrit të procesorit dhe deri në konfirmimin e të njëjtit optimizim. dosje Rregullat.bëj, Rrënjët në rrënjët e bërthamës së pemës dzherel, duke përfshirë pemët portative të djersës, të cilat përfshihen në përpilimin e Makefile. Të gjithë skriptet e përpilimit portativ quhen Makefile. platformë dhe për të përfituar nga vlerat e ndryshimeve për përdorimin e markës për konfigurimin e rrjedhës së kernelit.

Іnshoyu tsіkаvoi specialiteti i Makefile є mbështetje për ndër-platformë ose thjesht ndër-përpilim. Termi Tsei vikoristovuyutsya, nëse është e nevojshme, përpilimi i kodit për platformat іnshoї. Për shembull, nëse jeni duke përdorur platformën i86, shikoni të hapni kodin për platformat M68000. Nëse po përpiqeni të merrni një përmbledhje të kryqëzuar, atëherë do t'ju duhet të zëvendësoni mjetet tuaja të përpilimit ( gcc, ld, Ta in.)
(Për shembull, m68k-linux-gcc, m68k-linux-ld). Prefikset Vikoristovuvaniyu mund të bëhen ose duke ndryshuar Makefile $ (CROSS_COMPILE), ose me një parametër të linjës komanduese për përdorimin e markës, ose duke ndryshuar sistemin.

Arkitektura SPARC është një lloj i veçantë teme, i cili është fajtor për ndarjen nga një rang i caktuar në Makefile. Programet janë të destinuara që koristuvach të funksionojë në platformat SPARC64 (SPARC V9) dhe binarët, si rregull, ato janë të dizajnuara për platformat SPARC32 (SPARC V8). Përveç kësaj, përpiluesi do të jetë në gjendje të funksionojë në platformat SPARC64 (gcc) dhe të gjenerojë një kod gjenerik për SPARC32. Nga ana tjetër, bërthama është menduar për robotë në SPARC V9, është fajtor për zbulimin e kodit për SPARC V9; Të gjitha shpërndarjet GNU / Linux të krijuara për SPARC64 përfshijnë një lloj ndër-përpiluesi, të cilin ju duhet ta vibroni në Makefile të skriptit të përpilimit të kernelit.

Do të doja të shihja një listë shtesë të depozitave të të gjitha versioneve dhe platformave të trokës, pak përshkrime këtu, krejt të mjaftueshme për shfaqjen e përpilimit të kryqëzuar. Për të hequr informacione shtesë, mund të admironi Makefile-in e skriptit të përpilimit dhe skedarin jerel kernel.

Karakteristikat e Kernel 2.6

Një orë nuk ia vlen. Gjenerata e re e kernelit 2.6 është shfaqur me paraqitjen e parë të є nga provat. Fatkeqësisht, origjinalet e këtij libri nuk shohin një bërthamë të re, kështu që ka një ndryshim në transferimin e njohurive të reja.

Ju mund të përdorni programin e mesëm të integruar, si për shembull TimeStorm i TimeSys, për të formuar saktë çelësin dhe skriptin e kompilimit për modulin tuaj në formën e versionit të kërkuar të kernelit. Nëse zgjidhni të shkruani gjithçka në mënyrë të pavarur, atëherë do të njiheni me informacionin e deyak dodatkov rreth ideve kryesore të sjella nga thelbi i ri.

Një veçori e kernelit 2.6 është se ju duhet të vërtetoni makrot module_init () dhe module_exit () për rivendosjen dhe finalizimin në mënyrë të qartë të funksioneve.

MODULE_LISENCE me vlerë makro (), i prezantuar në kernel 2.4 si dhe më herët, është i nevojshëm, nëse nuk doni të bëni ndryshime shtesë kur moduli është i kyçur. Ju mund të zgjidhni hapat për të caktuar licencat për transmetim makro: "GPL", "GPL v2", "GPL dhe të drejtat shtesë", "Dual BSD / GPL" (zgjidhni nga licencat BSD ose GPL), "Dual MPL / GPL"( Vibir mіzh licencat Mozilla ose GPL) i
"Në pronësi".

Bilsh suttєvim për kernelin e ri - një skemë e re e kompilimit të modulit, e cila nuk është vetëm ndryshime në kodin e vetë modulit, por në Makefile të skriptit të këtij përpilimi.

Pra, vlera e simbolit makro MODULE nuk kërkohet më në kodin e modulit ose në Makefile. Nëse është e nevojshme, skema e re e përpilimit është në vetvete për të caktuar simbolet makro. Gjithashtu, ju nuk dini në mënyrë të qartë për makrot __KERNEL__, ose të reja, si KBUILD_BASENAME dhe KBUILD_MODNAME.

Gjithashtu, nëse nuk jeni fajtor për fillimin e fazës së optimizimit gjatë përpilimit (-O2 ose tjetër), atëherë moduli juaj do të kompilohet me këtë grup rregullash, duke përfshirë faktin që të gjitha bërthamat optimizohen automatikisht.

Për tre arsye, Makefile për përpilimin e një moduli për kernelin 2.6 është pak më i thjeshtë. Pra, për modulin hello.c Makefile do të jetë renditja tjetër:

Obj-m: = përshëndetje.o

Sidoqoftë, për të përpiluar modulin, do t'ju duhet akses shkrimi në pemën e kernel dzherel, kështu që do të ketë skedarë dhe drejtori të orës. Kjo është arsyeja pse komanda për të përpiluar modulin deri në kernelin 2.6, për të vendosur veten nga direktoria e transmetimit, për të hakmarrë kodin dzherel të modulit, është fajtore për rangun e mëposhtëm:

# Make -C /usr/src/linux-2.6.1 SUBDIRS = modulet `pwd`

Otzhe, maєmo dzherelo modul përshëndetje-2.6.c Për përpilim në kernel 2.6:

//hello-2.6.c #include #përfshi #përfshi MODULE_LICENSE ("GPL"); static int __init my_init (void) (printk ("Hello world \ n"); return 0;); static void __exit my_cleanup (void) (printk ("Mirupafshim \ n"); module_init (my_init); module_dalja (my_pastrimi);

Me sa duket, Makefile është:

Obj-m: = përshëndetje-2.6.o

Wiklikє mund të përdorë make për të analizuar Makefile-in tonë me parametrat e disponueshëm:

# Make -C / usr / src / linux-2.6.3 SUBDIRS = modulet `pwd`

Procesi normal i përpilimit kalon përmes përditësimit standard tjetër:

Make: Futni direktorinë `/usr/src/linux-2.6.3" *** Paralajmërim: Mbështetja e SUBDIRS në vijën e komandës mund të shkaktojë *** mospërputhje të bëra: `arch / i386 / kernel / asm-offsets.s" CHK përfshijnë / asm-i386 / asm_offsets.h CC [M] /home/knz/j.kernel/3/hello-2.6.o Ndërtimi i moduleve, faza 2. /usr/src/linux-2.6.3/ skriptet / Makefile . modpost: 17: *** Uh-oh, keni hyrje të ndenjura në modul. Jeni ngatërruar me SUBDIRS, /usr/src/linux-2.6.3/scripts/Makefile.modpost:18: mos u ankoni nëse diçka nuk shkon.MODPOST CC /home/knz/j.kernel/3/hello-2.6.mod.o LD [M] /home/knz/j.kernel/3/hello-2.6.ko make: Shko nga teki `/ usr / src / linux-2.6.3"

Rezultati përfundimtar i përpilimit do të jetë skedari i modulit hello-2.6.ko, i cili mund të futet në kernel.

Fatty respekt, në kernel 2.6 skedarët e moduleve mund të jenë prapashtesë.ko, dhe jo në kernel 2.4.

Tabela e simboleve të bërthamës

Ne folëm gjithashtu se si të përdorim tabelën insmod vikorist të simboleve publike të kernelit kur lidhim modulin me kernelin. Tabela zbulon adresat e objekteve të kernelit global - funksionet dhe ndryshimet - të cilat kërkohen për zbatimin e opsioneve modulare të drejtuesit. Tabela e simboleve publike të kernelit mund të lexohet në formë teksti nga skedari / proc / ksyms, në mënyrë që kerneli juaj të lexojë sistemin e skedarëve / proc.

Në kernel 2.6, skedari / proc / ksyms riemërtohet në / proc / module.

Kur moduli është i kyçur, simbolet e eksportuara nga moduli do të bëhen pjesë e tabelave të simboleve të kernelit dhe mund të shikoni /proc/ksyms.

Modulet e reja mund të personalizohen me simbole të eksportuara nga moduli juaj. Kështu, për shembull, moduli msdos mbështetet në simbolet e eksportuara nga moduli yndyrë, dhe bashkëngjitja e lëkurës USB do të përdoret në mënyrën e leximit të simboleve vicorist në modulet usbcore dhe hyrje. Një ndërlidhje e tillë realizohet pas moduleve të fundit të caktuara dhe quhet pirg modulesh.

Një tufë modulesh prishet kur hapen projektet e palosshme të moduleve. Një abstraksion i tillë është i lehtë për kodin e drejtuesit që t'i bashkëngjitet pjesëve të varfëruara nga hardueri dhe pjesëve të pavarura nga hardueri. Për shembull, grupi i drejtuesve video-për-linux ruhet nga moduli kryesor, i cili është eksportimi i simboleve për drejtuesin me rrënjë të ulët, që është specifika e pronësisë fitimtare. Mirë se vini në konfigurimin tuaj, ju do të shtoni modulin kryesor të videos dhe një modul specifik për pjesën tuaj të harduerit. I njëjti rang përdoret për të implementuar porte paralele dhe një klasë të gjerë bashkëngjitjesh që mund të lidhen, të tilla si bashkëngjitjet USB. Grumbullimi i sistemeve paralel me portën e leximeve në Fig. 2-2. Shigjetat tregojnë ndërveprimin midis moduleve dhe ndërfaqes së softuerit të kernelit. Vzaєmodiya mund të punojë si në funksione të barabarta, ashtu edhe në struktura të barabarta të funksioneve të dhëna kerovan.

Figura 2-2. Stafi i modulit të portit paralel

Kur merrni module të stivës, përdorni manualisht përdorimin e modprobe. Funksionaliteti i përdorimit të modprobe është disi i ngjashëm me përdorimin e insmod, por kur moduli është i kyçur, depozitat themelore kthehen mbrapsht dhe, nëse është e nevojshme, është e nevojshme të zëvendësohen modulet e nevojshme përpara ruajtjes së nevojshme të pirgut të moduleve. . Kështu, një komandë e vetme modprobe mund të prodhojë deri në disa komanda insmod. Ju mund të thoni se komanda modprobe është një guaskë intelektuale mbi insmod. Ju mund të zgjidhni modprobe për të zëvendësuar insmod kudo, pas një vinjete të moduleve të fiksimit të energjisë nga katalogu i transmetimit, kështu që modprobe shikon vetëm katalogë të veçantë për shpërndarjen e moduleve dhe ju nuk mund të kënaqni mundësinë e shterimit.

Modulet Podil në një pjesë shtesë ndihmojnë në ndryshimin e orës së zhvillimit për detyrën e vendosjes së detyrave. Çmimi është i ngjashëm me podil me mekanizmin e zbatimit dhe politikës së menaxhimit, siç diskutohet në seksionin 1 "Shtuar në bashkëngjitjet e drejtuesit".

Emërtoni modulin për të realizuar funksionalitetin e tij pa kërkuar eksportimin e simboleve në sfond. Eksporti i simboleve do t'i njihni në të njëjtën mënyrë siç mund t'i hiqni qafe ato. Ju mund të keni nevojë të përfshini një direktivë të veçantë për eksportimin e simboleve jostatike, kështu që në shumicën e zbatimit të modutileve të përdorimit, të gjitha erërat eksportohen për umovchannym.

Titujt e kernelit Linux ofrojnë një mënyrë të përshtatshme për të kontrolluar dukshmërinë e simboleve tuaja në një mënyrë që e bën të vështirë për ju përdorimin e tabelave të simboleve të kernelit. Mekanizmi i përshkrimeve në të gjithë shpërndarjen e pratsyu në kernel është riparuar nga versioni 2.1.18. Kernel 2.0 është pak i pashpirt
dukshmëria e simboleve, siç janë përshkrimet në libër.

Meqenëse moduli juaj nuk është fajtor për eksportimin e simboleve në sfond, mund të zgjeroni në mënyrë eksplicite makro-klikimin fyes në skedarin e modulit:

EXPORT_NO_SYMBOLS;

Ekziston një makro-klikim, vlera e skedarit linux / module.h zgjerohet në direktivën e asamblerit dhe mund të jetë vlera në çdo pikë të modulit. Sidoqoftë, kur kodi është i aktivizuar, transportueshmëria në kernelët e zhvillimit është e nevojshme për të ndryshuar makro-klikerët në funksionin e inicializimit të modulit (init_module), kështu që i njëjti version i së njëjtës makro-vlerë u këndua nga ne në sistemin tonë. Skedari .h për versionin e vjetër të kernelit.

Nga ana, nëse keni nevojë të eksportoni një pjesë të simboleve nga moduli juaj, atëherë duhet të përdorni simbolin makro
EXPORT_SYMTAB... Tsey macrosimvol është fajtor për vlerat e butit para përfshinte kokat e modulit.h. Praktika të marra nga shtëpia є
vlera e simbolit makro përmes -D në Makefile.

si macrosimvol EXPORT_SYMTAB Tregohet se simbolet individuale mund të eksportohen për një bast shtesë të makrove:

EXPORT_SYMBOL (emri); EXPORT_SYMBOL_NOVERS (emri);

Qoftë nga një tsikh dy makro për të krijuar një simbol të disponueshëm jashtë modulit. Dukshmëria e fushës në faktin se makro EXPORT_SYMBOL_NOVERS simboli i eksportit pa informacion rreth versionit (div. shpërndarja 11 "kmod dhe modularizimi i avancuar"). Për refuzimin e më shumë informacioneve të leksionit
lexoni skedarin e kokës Dëshira për një fitimtar është e mjaftueshme për një fitimtar praktik
makro

Іnіcіalіzatsіya dhe përfundimi i moduleve

Meqë tashmë është i gabuar, funksioni init_module () ristrukturon komponentët funksionalë të modulit në kernel. Shkrimi i një ristrukturimi të tillë, për modulin vicorist sipas programeve, do të jetë i disponueshëm në pikën hyrëse në modul nëpërmjet ndërfaqes, e cila ofrohet nga kerneli.

Modulet mund të rivendosin komponentë pa funksion në rolin e të tillëve, kur ri-skenohen, ato shfaqen në emër të funksioneve të modulit. Në funksionin bazë të restaurimit, treguesi transferohet në strukturën e haraçit, për t'u hakmarrë treguesve mbi funksionin për zbatimin e funksionalitetit të propozuar.

Në seksionin 1 "Futur në drejtuesin e bashkëngjitjeve", u hamendësua klasifikimi i llojeve kryesore të bashkëngjitjeve. Ju mund të regjistroni jo vetëm bashkëngjitjet e hamendësuara atje, edhe nëse janë, deri në abstraksionet e softuerit, siç janë, për shembull, skedarët e sistemit të skedarëve / proc dhe in. Çdo gjë që mund të bëhet në kernel përmes ndërfaqes së softuerit të drejtuesit mund të regjistrohet si drejtues.

Nëse dëshironi të dini më shumë rreth llojeve të drejtuesve të rivendosur në aplikacionin e kernelit tuaj, mund të zbatoni zhurmën e sekuencës EXPORT_SYMBOL në jerels të kernelit dhe të njihni pikat hyrëse të promovuara nga drejtues të ndryshëm. Si rregull i funksionit të rithemelimit të vikoristëve regjistrohu_,
kjo është mënyra më e mirë e ditës regjistrohu_ në skedarin / proc / ksyms për mjetin shtesë grep. Siç thashë, në kernelin 2.6.x, skedari / proc / ksyms zëvendësohet me / proc / module.

Përpunimi i faljeve në init_module

Nëse gjatë fillimit të modulit të kantinës, qoftë kjo një lloj faljeje, atëherë fajësojeni tërësisht inіsіalіzatsіy para zupinkës së caktimit të modulit. Varrezat mund të gjenden, për shembull, përmes dështimit të kujtesës në sistem kur strukturat e donacioneve janë ngritur. Është për të ardhur keq, ju gjithashtu mund të futni në kurth dhe për një situatë të tillë fajin e ka kodi i mirë i softuerit.

Gjithçka që është regjistruar ose është përditësuar përpara lëshimit të faljes në funksionin init_module () duhet të thuhet, sepse është e vetëshpjegueshme, sepse kerneli Linux nuk duhet ta bëjë atë në një mënyrë që nuk e bën këtë. Nëse nuk e keni parë, sepse nuk keni mundur të shihni restaurimin e Viconan, atëherë bërthama do të humbasë në një mulli të paqëndrueshëm dhe kur moduli të mbyllet përsëri
Nëse nuk mund të përsërisni restaurimin e elementeve tashmë të restauruar, ose nuk do të jeni në gjendje të përsërisni restaurimin e restaurimit të mëparshëm, sepse në instancën e re të funksionit init_module (), nuk do të keni adresën e saktë të funksioneve të regjistruara. . Për të përditësuar sistemin standard coli, do të jetë e nevojshme të kryhen disa truke të shpejta të palosjes, dhe më shpesh do të jetë e nevojshme thjesht të riinstaloni sistemin.

Zbatimi i rinovimit të sistemit të mullirit colish në rast të përcaktimit të faljeve të modulit, ne do të reduktojmë gradën e përditësimit në fitoret e operatorit goto. Thirrni të gjithë operatorin që të vihet në avantazh negativisht, і, navіt, nga urrejtja, por në të gjithë situatën do të duket edhe më e çuditshme. Për këtë, në kernel, operatori goto përdoret shpesh për të përpunuar grantet e inicializimit të modulit.

Një kod i thjeshtë hap pas hapi, në bazë të funksioneve reale të re-shtresave dhe її cassuvannya, demonstron një mënyrë të tillë të përpunimit të faljeve.

Int init_module (void) (int err; / * regjistrimi merr një tregues dhe një emër * / err = register_this (ptr1, "kafka"); nëse (err) do të dështojë_këtë; err = register_that (ptr2, "kafkë"); nëse (gabim) goto fail_that; err = regjistro_ata (ptr3, "kafkë"); nëse (gaboj) goto dështojnë_ata; kthej 0; / * sukses * / dështojnë: unregister_that (ptr2, "kafkë"); fail_that: çregjistro_this (ptr1, " kafkë "); fail_this: kthe err; / * përhap gabimin * /)

Në të njëjtën kohë, kryhet një test për restaurimin e tre komponentëve të modulit. Operatori goto vikorystovuutsya kur vyniknenna reestratsii dhe për të prodhuar para rivendosjes së komponentëve të rivendosur përpara modulit zupinka zupinkennya.

Pjesa e poshtme e operatorit goto nuk e shpejton leximin e kodit - mashtrimi i "memorizimit" të rivendosjes së njëpasnjëshme të operacioneve të modulit dhe fshirja e modulit cleanup_() për transmetimin e informacionit në formën e informacionit. Funksioni cleanup_module () është krijuar për të shfaqur një kërkesë dhe ekzekutohet automatikisht kur thirret një modul. Vlera që keni aktivizuar funksionin init_module () është fajtore
të jetë një kod faljeje i modulit. Në kernelin Linux, kodi i faljes është një numër negativ pa vlerë të shtuar në titujt ... Shtoni titujt në modulin tuaj në mënyrë që të siguroni kujtesë simbolike për kodet e rezervuara të faljes, si -ENODEV, -ENOMEM, etj. Vikoristannya takoї mnemonics vvazhaєnya stil i mirë programimi. Megjithatë, duhet respektuar që versionet e shërbimeve nga paketa modutils janë rrotulluar gabimisht;
në përgjithësi, një grup faljesh me natyrë absolutisht të ndryshme mund të rrotullohen nga funksioni init_modules (). Në versionet e mbetura të paketës qia
prikre korrigjohet grumbulli i plumbit.

Kodi për funksionin cleanup_module () për një pamje hover mund të jetë, për shembull, si ky:

Moduli_pastrimi i zbrazët (i pavlefshëm) (çregjistro_ata (ptr3, "kafkë"); çregjistro_that (ptr2, "kafkë"); çregjistro_this (ptr1, "kafkë"); kthim;)

Nëse kodi juaj i inicializimit dhe përfundimi është i palosur, nuk ka përshkrime këtu, atëherë deklarata goto mund të bëhet për të lexuar tekstin nga programet, kështu që kodi i përfundimit është për shkak të përsëritjeve në funksionin init_module () nga deklaratat goto për tranzicionet pa Për një arsye për të marrë më shumë truke kur zgjidhni funksionin cleanup_module () nga funksioni init_module () për të transmetuar informacione rreth përditësimit të suksesshëm kur moduli anulohet.

Fundi i një funksioni të tillë të shkruar init_module () dhe cleanup_module () është treguar më poshtë. Në një sërë aplikacionesh, ka dushe të këndimit global që mbartin informacione për shkëmbimin e inovacionit të suksesshëm.

Strukto diçka * artikull1; struct diçka tjetër * item2; int stuff_ok; void cleanup_module (void) (if (artikull 1) release_thing (article1); if (item2) release_thing2 (item2); if (stuff_ok) unregister_stuff (); return;) int init_module (void) (int err = -ENOMEM; item1 = allocate_thing (argumentet); artikulli 2 = alokoj_gjënë2 (argumentet2); nëse (! artikull2 ||! artikulli2) do të dështojë; err = regjistër_stuff (artikulli 1, artikulli 2); nëse (! gaboj) stuff_ok = 1; përndryshe duhet të dështoj; kthe 0; / * sukses * / dështim: cleanup_module (); kthe gabim;)

Pavarësisht nga palosja e inicializimit të modulit tuaj, mund të përdorni një nga mënyrat për të kontrolluar inicializimin e modulit.

Kurth për modulin

Sistemi duhet të zëvendësojë tapën e modulit të lëkurës në mënyrë që të rritet fuqia e gjallërimit të modulit pa sobë. Sistemi kërkon informacion, prandaj moduli nuk mund të jetë i gjallë, sepse nuk ka asnjë mënyrë për të bërë asgjë - nuk mund të shihni drejtuesin e sistemit të skedarëve, sepse nuk mund ta montoni sistemin e skedarëve ose nuk mund të vivantoni modulin e një shtojcë simbolike vikoristovuє tsei pristіy. Ne vend te pare,
mund të çojë në përplasje të sistemit - gabim segmentimi ose panik kernel.

Në bërthamat më të fundit, sistemi mund t'ju japë një kontrollues automatik për mekanizmin e modulit vicorist, i cili mund të shihet në shpërndarjen fyese. Në mënyrë të pavarur nga versioni i kernelit, ju mund t'i kontrolloni manualisht këto skedarë vikoristovuvati. Pra, kodi që transferohet në vicoristovuvati në versionet e vjetra të kernelit është fajtor për modelin vicorisovuvati të modulit Vikorisovuvany kërkohet në tre makrot e ardhshme:

MOD_INC_USE_COUNT Zbіlshu chiller vicoristannya i modulit të rrjedhës MOD_DEC_USE_COUNT Zmenshu lichilnik vicoristannya e modulit të rrjedhës MOD_IN_USE U kthye djathtas sapo nuk kishte akses në këtë modul.

Vlerat makro në , І era e keqe manipulohet nga një strukturë e brendshme e veçantë, e cila i jepet akses direkt ndaj çdo neglizhence. Në të djathtë, struktura e brendshme dhe mënyra e menaxhimit të të dhënave mund të ndryshojnë nga versioni në version, në atë kohë, pasi ndërfaqja e thirrur e makrove bëhet e pathyeshme.

Respekt, nuk keni nevojë të ndryshoni MOD_IN_USE në kodin e funksionit cleanup_module (), kështu që konvertimi do të kontrollohet automatikisht përpara wiki cleanup_module () në wiki të sistemit sys_delete_module (), që është vlera në kernel / modul.c.

Kontrolli i saktë i njësisë së mbylljes së modulit është kritik për stabilitetin e sistemit. Mbani mend, thelbi mund të përditësohet automatikisht në çdo orë. Shpesh ka një falje në modulet e programueshme të fushës në kontrollin e gabuar të makinës. Për shembull, nëse rryma është e ndezur, kodi i modulit do të aktivizohet kur të përfundojë përpunimi. Është një programues i tillë për transferimin, duke dhënë një detektor vlerash për mbledhjen e statistikave të modulit viktorian, në atë kohë, në fakt, është, në fakt, mbushësi i okupimit rrjedhës të modulit. , në mënyrë që mbushësi i disa proceseve në kodin viktorian të modulit të jetë në të njëjtin moment. Në një renditje të tillë, kur të përpunohet, do të futet në modul, fajtor për viclicati MOD_INC_USE_COUNT be-si diy, i MOD_DEC_USE_COUNT pislya їkh vikonannya.

Ju mund të situatave, për çfarëdo, për çfarëdo arsye të arsyeshme, nëse nuk mund të përfitoni nga moduli, mund të përdorni kontrollin e kamerës në victorian tuaj. Një situatë e tillë shihet shpesh në fazat e zhvillimit të modulit. Për shembull, procesi mund të ndërpritet kur përpiqeni të emërtoni një tregues NULL, ose nuk mund të vivantoni një modul të tillë derisa ta ktheni treguesin në zero. Një nga zgjidhjet e mundshme për një problem të tillë në fazën e përmirësimit të modulit është MOD_INC_USE_COUNTі MOD_DEC_USE_COUNT në kodin bosh. Është më mirë të rregulloni fushën në ioctl () ioctl () wiklik primusovo hodhi çelësin e modulit viktorian në zero. Ne mund ta shohim atë në seksionin "Përdorimi i Argumentit ioctl" në seksionin 5 "Operacionet e Përmirësuara të Drejtuesit Char". Me sa duket, në gatishmërinë e shoferit, ka një manipulim mashtrues të nëpunësit për të qenë fajtor për buty, protestë, në fazën e mirësisë, era e keqe të lejon të kursesh orën e shitjes me pakicë dhe ta pranojmë.

Mund ta gjeni vlerën e transmetimit të skedarit të sistemit për modulin e lëkurës në fushën e tretë të hyrjes së lëkurës në skedarin / proc / module. Skedari Tsey hakmerre informacionin për modulet që janë bllokuar për momentin - një rresht për modul të lëkurës. Fusha e parë e rreshtit është për të marrë hak për emrin e modulit, fusha tjetër - madhësia e huazimeve nga moduli në memorie dhe fusha e tretë - vlera e saktë e vikorystannya. Informacioni Qiu, në një pamje të formatuar,
mund të redaktohen me ndihmën e wiklik lsmod. Nën prapanicë është treguar skedari / proc / modules:

Parport_pc 7604 1 (autoclean) lp 4800 0 (i papërdorur) parport 8084 1 lockd 33256 1 (autoclean) sunrpc 56612 1 (autoclean) ds 6252 1 i82365 1404 pq.220

Këtu kemi një numër modulesh që janë të ngatërruara në sistem. Një tufë modulesh shfaqet në harqet katrore në fushën e parcelave (fusha e mbetur e rreshtit). Mesi i kësaj mund të lidhet, ku modulet paralele me portin lidhen përmes pirgut të moduleve, siç tregohet në Fig. 2-2. Autoclean përdoret për të përcaktuar modulet kerovan kmod ose kerneld. Shih seksionin 11 "kmod dhe modularizimi i avancuar"). Prapor (i papërdorur) do të thotë që moduli nuk është fitues në një moment të caktuar. Në bërthamën 2.0, fusha e madhësisë jepte informacion jo në bajt, por në anët, madhësia për platformat më të mëdha u vendos në 4 KBt.

gjallërimi i modulit

Për një modul tjetër vivant, ju lutemi përdorni programin rmmod. Vivantacioni i modulit është më i thjeshtë se sa vivantacioni i hapësirës së poshtme, kur shfaqet, ai lidhet dinamikisht me bërthamën. Kur një modul është i gjallë, do të shfaqet sistemi wikelike delete_module (), i cili, në çdo rast, do të aktivizojë wikelik-in e funksionit cleanup_module (), moduli do të thirret në të njëjtën mënyrë që vizitori do të sjellë zero në robot.

Siç u përmend tashmë, në funksionin cleanup_module (), mund të shihni shfaqjen e operacionit të inicializimit kur moduli është i kyçur nga funksioni cleanup_module (). Gjithashtu, simbolet e eksportuara të modulit shihen automatikisht.

Funksioni i qartë i përfundimit dhe fillimit

Siç u tha tashmë, kur moduli është i kyçur, thelbi i wiklick është funksioni init_module () dhe kur moduli është i kyçur, ai është cleanup_module (). Sidoqoftë, në versionet aktuale të bërthamës së funksionit, shpesh ka mungesë emri. Duke fiksuar nga kerneli 2.3.23, ekzistonte mundësia e një caktimi të qartë të emrit për funksionin e kyçjes dhe zhbllokimit të modulit. Infeksioni, dhe gjithashtu në mënyrë të qartë emrat viznennya për funksionet cich - ne rekomandojmë stilin e programit.

Prapa e drejtuar. Nëse dëshironi të hapni funksionin e inicializimit të modulit tuaj me funksionin my_init () dhe atë përfundimtar me funksionin my_cleanup (), zëvendësoni init_module () dhe cleanup_module () sa më shpejt të jetë e mundur, atëherë duhet të futni dy makro.
kodi i modulit të skedarit dzherel):

Moduli_fillimi (my_init); module_dalja (my_pastrimi);

Respekt, ju do të përfshini titujt në modulin tuaj për vikorystannya qih .

Bukuria e këtij stili të poligonit qëndron në faktin se funksioni i lëkurës së inicializimit dhe përfundimit të moduleve në bërthamë mund të jetë unik në mënyrën e vet, gjë që është gjithashtu një shtesë e aplikacionit. Për më tepër, fitorja e këtyre funksioneve do t'ju ndihmojë ta përmirësoni atë menjëherë nga fakti që zbatoni kodin e drejtuesit tuaj nga shikuesi i modulit, ose përndryshe futeni në të direkt në kernel. Me sa duket, vlera makro module_init dhe module_exit nuk kërkohet, për sa kohë që funksionaliteti dhe përfundimi juaj mund të kenë emra të rezervuar, pra init_module () dhe cleanup_module (), përkatësisht.

Sapo të njiheni me kernel jerels të versioneve 2.2 ose më shumë, mund të ndryshoni paksa formën e përshkruar për funksionin e inicializimit dhe plotësimit. për shembull:

Static int __init my_init (void) (....) static void __dal my_pastrimi (void) (....)

Atribut viktoriane __fillim para përfundimit të inicializimit do të merret inicializimi i funksionit nga memoria. Megjithatë, procesi është i saktë vetëm për drejtuesit e futur në kernel dhe do të injorohet për modulet. Gjithashtu, për drejtuesit e instaluar në kernel, atributi __daljeËshtë krijuar për të injoruar të gjithë funksionin me një atribut simbolik. Për modulet e garancive do të ketë edhe projeksione.

Atributet Vikoristannya __fillim__initdata për përshkrimin e haraçit) mund të ndryshoni numrin e kujtesës së bërthamës vikoriste. simbol i flamurit __fillim Funksioni іnіtsіalіzatsіy i modulit nuk solli asnjë vigodi as shkodi. Kontrolli në këtë mënyrë nuk është zbatuar ende për modulet, nëse dëshironi, është e mundur, do të zbërthehet në të ardhmen.

Pidvdennya pidsumkiv

Si rezultat, si rezultat i materialit të paraqitur, ne mund të tregojmë versionin e mëposhtëm të modulit "Hello world":

Kodi në skedarin e modulit dzherela ============================================ #përfshi #përfshi #përfshi static int __init my_init_module (void) (EXPORT_NO_SYMBOLS; printk ("<1>Përshëndetje botë \ n "); kthimi 0;); zbrazëti statike __dalja nga moduli_my_cleanup (void) (printk ("<1>Mirupafshim \ n ");); module_init (my_init_module); module_exit (my_cleanup_module); MODULE_LICENSE ("GPL"); ======================== ====================== Dosja e krijuar për përpilimin e modulit ======================== = ===================== CFLAGS = -Wall -D__KERNEL__ -DMODULE -I / lib / module / $ (uname i guaskës -r) / ndërto / përfshin përshëndetje. o: ==============================================

Për të qenë i sinqertë, kur shkruanin Makefiles, ata fituan për dobinë e GNU make, pavarësisht nga mënyra se si ata formojnë një skedar objekti në bazë të një CFLAGS të ndryshueshëm dhe një përpiluesi të qartë në sistem.

Burimet e Vikoristannya

Moduli nuk mund të përdoret për të menaxhuar funksionimin e tij pa regjistruar burimet e sistemit, të tilla si memoria, hyrja/dalja e portit, hyrja/dalja e memories, linjat e transferimit, si dhe kanalet DMA.

Yak një programues, i cili është gjithashtu fajtor se është i vetëdijshëm për kujtesën dinamike të keruvanëve. Menaxhimi i memories dinamike në thelb nuk është më e rëndësishmja nga parimet e ideve të tyre. Programi juaj mund të ruhet me kujtesën e funksionit vicorist kmalloc ()і zvіlniti її, për ndihmë kfree ()... Këto funksione janë edhe më të ngjashme me atë që dini malloc () dhe falas (), për të njëjtën arsye, një argument shtesë i kalohet funksionit kmalloc () - prioriteti. Emërtoni përparësinë e pranimit të vlerës GFP_KERNEL ose GFP_USER. GFP є akronimi për "merr faqe falas" - merr një faqe falas. Menaxhimi dinamik i kujtesës në bërthamë është i detajuar në seksionin 7 "Marrja e kujtesës".

Ekziston një listë e drejtuesve në cilindo nga ndërtesat që kanë nevojë për një ndryshim të qartë në portin e hyrjes / vivod, kujtesën e hyrjes / vivod dhe ndryshimin e linjës. Ashtu si kjo, moduli i kernelit mund të sigurojë qasje të lehtë në të gjitha burimet. Do të doja që memoria e sistemit të mund të përditësonte audion, kujtesa e hyrjes/daljes, porta dhe linja e ndryshimit të luanin një rol të veçantë dhe të mbështesin aplikacionin. Për prapanicën, shoferi ka nevojë për një port, pasi nuk është
gjithçka, si dhe atë që nevojitet për menaxhimin e shtesave. Ale shoferi nuk mund të vikoristovuvat burimin deri në një festë të qetë, për sa kohë që ai nuk mbivendoset, por era e keqe nuk vikoristovovatsya kimos shche.

Zona e memories për të lokalizuar bashkëngjitjet periferike quhet hyrje / dalje e memories, për të krijuar memorie nga sistemi RAM (RAM), unë quhem thjesht memorie.

Porti dhe kujtesa e hyrjes / dorëzimit

Roboti i drejtuesit celular tashmë është i pajisur shumë mirë për portet e leximit dhe shkrimit dhe memorien për hyrje / dalje. Porti dhe kujtesa e hyrjes / vivedennya ob'єdnanі me emrin e huaj - rajoni (ose rajoni) i futur / vivodu.

Fatkeqësisht, nuk është në lëkurën e arkitekturës së gomave që është e mundur të shihet qartë rajoni i futjes / zbatimit të zgjatjes së lëkurës, dhe është e mundur që shoferi të lejojë rregullimin e zonës së duhur, ose, ndoshta, për të shkruar funksionimin e leximit/leximit të thjeshtë. Problemi Qia veçanërisht
për t'u përdorur në autobusin ISA, pasi është e mundur të përdoret për të instaluar bashkëngjitje të thjeshta në një kompjuter personal dhe madje është i popullarizuar në botën industriale në zbatimin e PC / 104 (div. shpërndarë "PC / 104 dhe PC / 104 +" kapitujt 15).

Nëse nuk do të ishte një autobus vikoristovuvalasya për lidhjen e një shtojce harduerike, drejtuesi i bashkëngjitjes është fajtor për garantimin e aksesit ekskluziv në rajonin e tij të hyrjes / vivedennya për marrjen e shumë drejtuesve. Nëse një modul, nëse zvertayutsya para se ta bashkëngjitni me regjistrimin në bashkëngjitje, nuk mund ta merrni, atëherë mund të merrni gjurmë fatale pas jush.

Shitësit Linux kanë zbatuar një mekanizëm për fuqizimin / krijimin e rajoneve të prezantimit / bërjen e porosisë së kokës për instalimin e kolosëve dhe ndërtesave shtesë. I gjithë mekanizmi ka qenë fitimtar prej kohësh për prezantimin/prodhimin e porteve dhe së fundmi është përdorur për mekanizmin e menaxhimit të burimeve. Respektoni se ky mekanizëm është një program abstraksion dhe nuk zgjerohet në aftësitë harduerike. Për shembull, mosautorizimi i aksesit në portet e futura / vivodu në të njëjtën pajisje nuk është një wikklikє be-si një falje e ngjashme me një "gabim segmentimi", pasi pajisja nuk merret me imazhet dhe autorizimin e burimeve të saj.

Informacioni në lidhje me burimet e regjistruara është i disponueshëm në formë teksti në skedarët / proc / ioports dhe / proc / iomem. Ky informacion paraqitet në Linux, i cili mund të riparohet nga kerneli 2.3. Megjithatë, ky libër i është caktuar kernelit 2.4 dhe respekti për kompleksitetin do të paraqitet në versionin përfundimtar.

prishin

Më poshtë tregohet si lloj në skedarin / proc / ioports:

0000-001f: dma1 0020-003f: pic1 0040-005f: kohëmatës 0060-006f: tastierë 0080-008f: dma faqe reg 00a0-00bf: pic2 00c0-00000df: picf2 00c0-00000df: : ide0 02f8-02ff: seriale (set) 0300-031f: NE2000 0376-0376: ide1 03c0-03df: vga + 03f6-03f6: ide0 03f8-03ff: seriale (set) 100PI 1000: Intel 1003: acpi 1004-1005: acpi 1008-100b: acpi 100c-100f: acpi 1100-110f: Intel Corporation 82371AB PIIX4 IDE 1300-131f: pcnet_cs 14B200F: Inteligjente: pcnet_cs 14AB200F140: Intel - 1cff: PCI CardBus # 04 5800-581f: Intel Corporation 82371AB PIIX4 USB d000-dfff: PCI Bus # 01 d000-d0ff: ATI Technologies Inc 3D Rage LT Pro AGP-133

Një rresht i lëkurës së një skedari shfaqet në një pamje prej gjashtëmbëdhjetë inçësh të një sërë portash të lidhura me një drejtues ose një bashkëngjitje me një vashnik. Në versionet e hershme të kernelit, skedari ka të njëjtin format, përveç se arkitektura e portit nuk është dhënë.

Skedari mund të përdoret për të unifikuar numrin e porteve kur një shtesë e re shtohet në sistem. Është veçanërisht i dobishëm kur rregulloni manualisht një kërcyes (jampers). Për një gamë të gjerë njerëzish, ju lehtë mund të mahniteni me listën e porteve fitimtare dhe gamën e vibrimit për një aneks. Unë do të doja të shihja bashkëngjitje më moderne për të mos marrë rregullimet manuale, kështu që nuk është më pak, erë e keqe për t'u marrë kur përgatiten përbërës të tjerë gri.

Sidoqoftë, është edhe më e rëndësishme, pasi struktura e të dhënave është e lidhur me skedarin / proc / ioports dhe është e aksesueshme përmes një shtegu softueri. Për këtë, nëse shoferi do t'i bashkëngjisë një vizon për futjen e informacionit, mund të mësoni për gamën e porteve të prezantimit / dorëzimit. Kjo do të thotë që nëse është e nevojshme të skanoni për një port në shakatë e një aneksi të ri, shoferi, në mënyrë që të shmangë regjistrimin e situatave në port, të zëna nga ndërtesat e njerëzve të tjerë.

Vіdomo, gomat e skanuara të karrierës ISA є risikovannyu zavdannyam. Për këtë, veprimet e drejtuesit, të zgjeruara me kernelin zyrtar Linux, janë unike për një skanim të tillë kur moduli është i kyçur. Vetë Tim, erë e keqe është unike për rizikun e sistemit të drejtimit për regjistrimin në port, fitimtar për zotërimet e tyre. Për fat të mirë, arkitektura aktuale e gomave nuk është e lehtë për t'u përballur me numrin e problemeve.

Ndërfaqja e softuerit është e disponueshme për qasje në regjistrimin e hyrjes / daljes dhe ruhet në tre funksionet e mëposhtme:

Int check_region (fillim i gjatë i panënshkruar, len i gjatë i panënshkruar); struct burim * request_region (fillim i panënshkruar i gjatë, i panënshkruar i gjatë len, char * emri); void release_region (fillim i gjatë i panënshkruar, i gjatë i panënshkruar);

funksionin kontroll_rajon () Ju mund të merrni një wiklican për të ndryshuar zënien e një game të caktuar portash. Vona ktheu kodin negativ të faljes (si -EBUSY ose -EINVAL) në rast mesazhesh negative.

funksionin regjioni_kërkese () Shfaqja e adresës së caktuar për diapazonin rrotullohet, në kohë suksesi, një tregues jo-nul. Shoferi nuk ka nevojë të marrë një zberigati ose vicoristovuvati e kthen treguesin. Gjithçka që duhet bërë është ta ndryshoni atë në NULL. Kodi që është fajtor për kernelin origjinal 2.4 (gjithsesi) nuk kërkon funksionin check_region (). Nuk mendoj se do të kaloj në këtë mënyrë.
Është e pamundur të përdoren funksionet check_region () dhe request_region () midis wiki. Nëse dëshironi të ruani njëfarë konfuzioni me versionet më të vjetra të kernelit, atëherë kërkohet wiki check_region () përpara request_region ().

funksionin rajoni i lëshimit () fajtor buty i viklikanit me shofer zanor para portit vicorist.

Vlera e referencës së treguesit rrotullohet nga funksioni request_region ();

Janë tre funksione, në funksionim, є me makro në .

Prapa viktoriane është e drejtuar në fund pas fitoreve, në mënyrë që të ngulitet për restaurimin e porteve. Prapa e kapjeve me kodin e kafkës fillestare të shoferit. (Kodi për funksionin skull_probe_hw () nuk është tregues këtu, kështu që ju duhet të keni kodin e ruajtur në harduer.)

#përfshi #përfshi static int skull_detect (porta int e panënshkruar, intervali int i panënshkruar) (int err; nëse ((err = check_rajoni (port, diapazoni))< 0) return err; /* busy */ if (skull_probe_hw(port,range) != 0) return -ENODEV; /* not found */ request_region(port,range,"skull"); /* "Can"t fail" */ return 0; }

Në këtë aplikacion, disponueshmëria e gamës së kërkuar të porteve do të ndryshohet. Nëse porti është i paarritshëm, atëherë nuk ka qasje në pajisje.
Përcaktimi i bartjes në aneks mund të specifikohet nga ora e skanimit. Funksioni request_region () nuk është fajtor, në këtë aplikacion,
përfundojnë në dështim. Kerneli nuk mund të bllokojë më shumë se një modul në të njëjtën kohë, kështu që numri i porteve fituese nuk mund të jetë
maє.

Pavarësisht nëse ishte futur / prezantuar nga shoferi, shoferi ishte përgjegjës për të. Shoferi ynë i kafkës është grabitur në funksionin cleanup_module ():

Static void skull_release (porta int e panënshkruar, intervali int i panënshkruar) (rajoni_lëshimi (porti, diapazoni);)

Mekanizmi i furnizimit / gjenerimit të burimeve është i ngjashëm me mekanizmin e rivendosjes / çregjistrimit të moduleve dhe që zbatohet në bazë të skemës fitimtare të operatorit goto.

memorie

Informacioni në lidhje me kujtesën e hyrjes / daljes është i disponueshëm përmes skedarit / proc / iomem. Më poshtë është një prapanicë tipike e një skedari të tillë për një kompjuter personal:

00000000-0009fbff: Sistemi RAM 0009fc00-0009ffff: 000a0000-000bffff Rezervuara: Video zonë RAM 000c0000-000c7fff: Video ROM 000f0000-000fffff: Sistemi ROM 00100000-03feffff: Sistemi RAM 00100000-0022c557: Kernel Kodi 0022c558-0024455f: Kernel dhënave 20000000 2fffffff : Intel Corporation 440BX / ZX - 82443BX / ZX ura Host 68000000-68000fff: Texas Instruments PCI1225 68001000-68001fff: Texas Instruments PCI1225 (# 2) e0000000-e3ffffff: PCI Bus # 01 e4000000-e7ffffff: PCI Bus # 01 e4000000-EFF: ATI Technologies Inc 3D Rage LT Pro AGP-133 e6000000-e6000fff: ATI Technologies Inc 3D Rage LT Pro AGP-133 fffc0000-ffffffff: e rezervuar

Vlera e adresës së diapazonit tregohet në hyrjen e gjashtëmbëdhjetë. Për indikacionet e diapazonit të lëkurës Ares të yogo vlasnik.

Rivendosja e hyrjes në kujtesën e hyrjes / vivod është e ngjashme me restaurimin e porteve të hyrjes / vivod dhe nxitet në thelbin nga i njëjti mekanizëm.

Për të refuzuar dhe aktivizuar gamën e nevojshme të adresës së kujtesës të futur / vivod, shoferi është fajtor për vicoristovuvati wiklici të tilla:

Int check_mem_region (fillim i gjatë i panënshkruar, i gjatë i panënshkruar); int request_mem_region (fillimi i gjatë i panënshkruar, len i gjatë i panënshkruar, emri char *); int release_mem_region (fillim i gjatë i panënshkruar, len i gjatë i panënshkruar);

Jepini drejtuesit vargun vidomy adresën e memories së futur / vivod, kodi për burimin e dhënë mund të ndryshohet, në varësi të prapanicës për gamën e portave:

Nëse (check_mem_region (mem_addr, mem_size)) (printk ("emri i shoferit: memoria tashmë në përdorim \ n"); kthe -EBUSY;) request_mem_region (mem_addr, mem_size, "drivername");

Burimet Rospodil në Linux 2.4

Mekanizmi threading i shpërndarjes së burimeve të prezantimeve të buv në kernelet Linux 2.3.11 do të parandalojë aksesin e shurdhër në menaxhimin e burimeve të sistemit. Mekaniku danez përshkruhet shkurtimisht në shumë. Megjithatë, funksioni i shpërndarjes bazë të burimeve (siç është request_region () dhe іn.) duhet ende të zbatohet në pamjen e makrove dhe për të ruajtur konfuzionin me versionet e hershme të kernelit. Një numër i madh vipadësh nuk kanë nevojë për ndonjë fisnikëri për mekanizmin e vërtetë të rozpodilu, por mund të jetë pak e ndërlikuar kur ka më shumë drejtues të palosshëm.

Sistemi i menaxhimit të burimeve zbatohet në Linux me shumë burime në një mënyrë të vetme. Burimet globale të sistemit (për shembull, portimi / vivodu) mund të shtohen në fund - për shembull, ato mund të shtohen në çdo slot të autobusit harduer. Drejtuesit e këndimit, gjithashtu, nëse bazhanna, mund të shtojnë burime në bazë të strukturës së tyre logjike.

Gama e burimeve vizuale përshkruhet përmes një strukture burimi strukturor, i cili është i zhveshur në tituj :

Burimi strukt (konst char * emri; fillimi i gjatë i panënshkruar, fundi; flamuj të gjatë të panënshkruar; burimi i strukturës * prindi, * vëllau, * fëmija;);

Gama globale (rrënjë) e burimeve zgjerohet çdo orë. Për shembull, struktura e burimeve, e cila përshkruan portin e hyrjes / vivod, është grada fyese:

Burimi i strukturës ioport_resource = ("PCI IO", 0x0000, IO_SPACE_LIMIT, IORESOURCE_IO);

Këtu është një përshkrim i burimit me PCI IO, i cili mbulon gamën e adresave nga zero në IO_SPACE_LIMIT. Vlera e ndryshimit qëndron në formën e platformave fitimtare dhe ndoshta 0xFFFF (hapësirë ​​adresash 16-bit, për arkitekturat x86, IA-64, Alpha, M68k dhe MIPS), 0xFFFFFFFF (32-bit, për hapësirën SPARC) 0xFFFFFFFFFFFFFFFFFF (64 -bit, SPARC64).

Gama e burimeve mund të vendoset pas një wiklik shtesë allocate_resource () . Për shembull, përpara orës së inovacionit të autobusit PCI, për rajonin adresa e autobusit është një burim i ri, i cili përcaktohet si një bashkëngjitje fizike. Nëse kodi i kernelit funksionon në autobusin PCI, ai është caktuar në portet dhe memorien, atëherë ekziston një burim i ri vetëm për të gjithë numrin e rajoneve dhe shpërndahet gjatë javëve të tjera ioport_resource () ose iomem_resource ().

Drejtuesi thjesht mund të kërkojë një nëngrup të një burimi të caktuar (të marrë me qira një pjesë të një burimi global) dhe të tregojë se do të jetë i zënë. Për të ruajtur burimin, klikoni në wiki request_region (), i cili do ta kthejë treguesin në një strukturë të re burimi strukturor, i cili do të përshkruajë mënyrën se si ofrohet burimi, ose NULL në rast falje. Struktura Qia është pjesë e pemës globale të burimeve. Yak tashmë duke folur, duke i shkruar burimit, shoferi nuk e di vlerën e treguesit.

Lexuesi mund të shikojë detajet e skemës së menaxhimit të burimeve në skedarin kernel / resource.c, i cili është zgjeruar në drejtorinë e kernelit. Megjithatë, në të ardhmen do të ketë shumë zhvillime për të arritur njohuritë e fitoreve.

Mekanizmi sferik ka gjeneruar burime për të sjellë një nëngrup burimesh. Nga njëra anë, unë jam qartë i vetëdijshëm për strukturën e bërthamës së dhënë. Edhe një herë, unë do të prish skedarin / proc / ioports:

E800-e8ff: Adaptec AHA-2940U2 / W / 7890 e800-e8be: aic7xxx

Gama Adaptec e800-e8ff Një pjesë e madhe e gamës duke kërkuar shoferin aic7xxx.

Me ndihmën e një menaxhimi të tillë të burimeve, ekzistonte një nëngrup i hapësirës së adresave në diapazon, pasi ato përfaqësojnë marrëdhënien reale të pronësisë. Menaxheri i burimeve nuk mund të shohë të njëjtin gamë adresash, por mund të rregullojë instalimin e një drejtuesi jofunksional.

Konfigurimi automatik dhe manual

Parametrat Deyak_, të nevojshëm për drejtuesin, mund të ndryshojnë nga sistemi në sistem. Për shembull, shoferi është fajtor për fisnikërinë në lidhje me adresat hyrëse/dalëse dhe diapazonin e memories. Për ndërfaqet e mirëorganizuara të autobusëve, ky nuk është problem. Sidoqoftë, njëra, do t'ju duhet t'i kaloni parametrat drejtuesit, në mënyrë që ta ndihmoni të njohë fuqinë, ose të lejoni / rrethojë funksionin deyaky.

Parametrat Tsi, të cilat injektohen në drejtuesin e robotit, shtrihen në bashkëngjitje. Për shembull, mund të jetë numri i versionit të instaluar nga aneksi. Natyrisht, një informacion i tillë është i nevojshëm për shoferin për robotin e duhur me bashkëngjitje. Vlera e parametrave të tillë (konfigurimi i drejtuesit) duhet të arrihet
me dinakëri zavdannya, si të jesh fitimtar në institutin e shoferit.

Përkatësisht, ekzistojnë dy mënyra për të refuzuar vlerën e saktë të këtij parametri - ose është e qartë, ose shoferi është i pavarur, bazuar në përvojën e posedimit. Unë dua që zbulimi automatik i bashkëngjitjes të jetë i çmendur;
Për një koristuvach, konfigurimi është më i lehtë për t'u zbatuar. Shitësi me pakicë i shoferit është fajtor për realizimin e konfigurimit automatik të drejtuesit kudo, herë pas here, menjëherë, shoferi është fajtor për mekanizmin e konfigurimit manual. Natyrisht, me dorë, nëna ka një përparësi më të lartë për konfigurimin automatik. Në fazat e zhvillimit të kallirit, filloni, zbatoni, transferoni vetëm manualisht parametrat te drejtuesi. Konfigurimi automatik, nëse është e mundur, shtoni më shumë.

Shoferi Bagato, në mes të parametrave të tij të konfigurueshëm, heshtin parametrat e operacioneve të kernelit të drejtuesit. Për shembull, drejtuesit IDE në ndërfaqen (Integrated Device Electronics) lejojnë kontrollin e operacioneve DMA. Në një gradë të tillë, nëse shoferi juaj është i mirë, zbulimi automatik i posedimit është i mundur, nëse doni të kontrolloni funksionalitetin e shoferit.

Vlerat e parametrave mund të kalojnë në procesin e bllokimit të modulit me komandat insmod ose modprobe. Pjesën tjetër të orës u bë e mundur leximi i vlerave të parametrave nga skedari i konfigurimit (lidhja /etc/modules.conf). Parametrat Yak mund të transmetohen në vlera të plota dhe të vargut. Kështu, nëse keni nevojë të ndryshoni vlerën e parametrit skull_ival dhe vlerën e vargut të parametrit skull_sval, mund të dërgoni orën e fundit të modulit me parametrat shtesë të komandës insmod:

Insmod skull skull_ival = 666 skull_sval = "bisha"

Sidoqoftë, komanda e parë insmod mund të ndryshojë vlerat e parametrave të modulit, moduli është përgjegjës për vënien në dispozicion të parametrave. Parametrat janë hequr nga makro-vlera shtesë MODULE_PARM, siç tregohet në kokat e moduleve.h. Makro MODULE_PARM pranon dy parametra: іm'ya ndryshimi i rreshtit, i cili është lloji i parë. Duke pasur parasysh makro-vlerat, ai është i ndarë pas kufijve të çdo funksioni dhe ju fton të rriteni në kalli në skedar për të shkruar ndryshimet. Pra, ekzistojnë dy parametra të hamendësuar, ato mund të zhvlerësohen në mënyrën e mëposhtme:

Int skull_ival = 0; char * kafkë_sval; MODULE_PARM (kafkë_ival, "i"); MODULE_PARM (skull_sval, "s");

Në këtë moment, janë në dispozicion pesë lloje të parametrave të modulit:

  • b - vlera një bajt;
  • h - vlera (e shkurtër) dy bajtë;
  • i - e tëra;
  • l - dovge tsіle;
  • s - rresht (char *);

Për disa parametra të vargut, në module, treguesi (char *) është fajtor për denoncimet. Komanda insmod gjeneron memorie për rreshtat e transferuara dhe vlerat e nevojshme. Për makro shtesë MODULE_PARM, mund të formatoni një grup parametrash. Në të gjithë gamën, numri i plotë, i cili transferohet në llojin e shkronjës së viznachaє dozhin massiv. Kur dy numra të plotë specifikohen me vizë, era e keqe do të fillojë në numrin minimal dhe maksimal të vlerave të transmetuara. Për inteligjencë më të detajuar robotike të vlerave të dhëna makro, kthehuni te titujt e skedarëve .

Për shembull, mos keni një grup parametrash në të ardhmen, por jo më pak se dy dhe jo më pak se një numër vlerash. Todi vin mund të përshkruhet në rendin e mëposhtëm:

Int skull_array; MODULE_PARM (array_kafkë, "2-4i");

Përveç kësaj, në kutinë e veglave të programuesit ka një vlerë makro MODULE_PARM_DESC, pasi ju lejon të postoni komente përpara se të transferohen parametrat e modulit. Disa komente ruhen në skedarin e objektit të modulit dhe mund të kërkoni ndihmë shtesë, për shembull, shërbimet objdump, ose mjete shtesë të automatizuara në administrimin e sistemit. Në mënyrë të theksuar vikoristannya jepet makro-vlera:

Porta_bazë Int = 0x300; MODULE_PARM (porta_bazë, "i"); MODULE_PARM_DESC (porta_bazë, "Portja bazë I/O (parazgjedhja 0x300)");

Bazhano, të gjithë parametrat e modulit kanë pak vlerë për ndryshimet. Zmіna qih që do të thotë pas ndihmës së insmod mund të përdoret vetëm në kohë konsumi. Moduli mund të rikonfigurohet duke vendosur në mënyrë të qartë parametrat duke konvertuar vlerat aktuale me vlerat për sugjerimet. Më pas mund të zbatoni mekanizmin e konfigurimit automatik në bazë të një skeme të tillë. Nëse vlera e parametrave mund të jetë vlera për opsionet, atëherë do të shfaqet Autokonfigurimi. Në іnshomu vypadku - vlerat aktuale të vikoristoyutsya. Që të jepet skema e procedurës, është e nevojshme që vlerat për zëvendësimet të mos tregojnë ndonjë nga ndryshimet reale të mundshme të sistemit. Todi mund të lejohet, por një kuptim i tillë nuk mund të instalohet nga përdoruesi në konfigurimin manual.

Prapa fyese do të tregojë shoferin e kafkës viroblya; Në shtojcën e drejtuar, në emërtimin automatik, vizori do të shikojë bashkëngjitjet boshe, në atë orë, kur konfigurohet manualisht, drejtuesi është i ndërlidhur me një bashkëngjitje. Funksioni skull_detect është prezantuar gjithashtu më herët në seksionin që përshkruan portat e hyrjes / vivod. Zbatimi i funksionit skull_init_board () nuk është dhënë, kështu që yak fitoi
për të kryer pajisje-ugar іnіtsіalіzatsіyu.

/ * * Gama e portës: pajisja mund të qëndrojë midis * 0x280 dhe 0x300, me hapa 0x10. Ai përdor porte 0x10. * / #Define SKULL_PORT_FLOOR 0x280 #define SKULL_PORT_CEIL 0x300 #define SKULL_PORT_RANGE 0x010 / * * funksioni i mëposhtëm kryen zbulim automatik, përveç rasteve kur një vlerë specifike * është caktuar nga insmod në "skull_port_base" =skull_port_base; / * 0 detyron zbulimin automatik * / MODULE_PARM (baza e portit_skull, "i"); MODULE_PARM_DESC (skull_port_base, "Base I / O port për kafkën"); static int skull_find_hw (void) / * kthen numrin e pajisjeve * / (/ * baza është ose vlera e kohës së ngarkesës ose provimi i parë * / int base = skull_port_base? skull_port_base: SKULL_PORT_FLOOR; int result = 0; / * loop one koha nëse është caktuar vlera; provoni të gjitha nëse zbulohen automatikisht * / bëni (nëse (skull_detect (bazë, SKULL_PORT_RANGE) == 0) (skull_init_board (bazë); rezultat ++;) bazë + = SKULL_PORT_RANGE; / * përgatituni për provën e ardhshme * / ) ndërsa (baza_port_kafkë == 0 && bazë< SKULL_PORT_CEIL); return result; }

Për sa kohë që ndryshimet e konfigurimit bëhen vetëm në mes të drejtuesit (sepse ato nuk janë publikuar në tabelën e simboleve të kernelit), programuesi mund të thjeshtojë lehtësisht jetën e koristuvache-s jo me preferencat vicioze në kafkën tonë. Për koristuvach, prefikset ts nënkuptojnë troches, dhe dukshmëria їх do të kërkoj një grup komandash nga tastiera.

Për hir të përshkrimeve, ne mund të ofrojmë një përshkrim të tre makro-vlerave që ju lejojnë të ndryshoni përmbajtjen e komenteve në skedarin e objektit.

MODULE_AUTHOR (emri) Shpërndani një rresht me emrat e autorit në skedarin e objektit. MODULE_DESCRIPTION (përmbledhje) Rreshti zgjerohet nga përshkrimi fillestar në modulin në skedarin e objektit. MODULE_SUPPORTED_DEVICE (dev) Unë do të rrit një rresht, me një përshkrim të shtuar nga moduli, do ta shtoj. Linux ka një API të lodhshme dhe të shkëlqyer për shtesë, por vetëm një mungesë. Kërkohet një drejtues kernel për ndërveprimin me zotërimin dhe aksesin në informacionin e privilegjuar në sistem.

Moduli i kernelit Linux është një proces për përpilimin e kodit binar, i cili mund të futet direkt në kernelin Linux, pikërisht në rrethin 0, dhe unaza e brendshme dhe më e vjedhur e komandave në procesorin x86-64. Këtu kodi do të njihet absolutisht pa asnjë ndryshim, por më pas në emrin e sistemit dhe akses në çdo burim të sistemit.

Chi nuk është për njerëz të thjeshtë

Shkrimi i një moduli kernel Linux nuk është i zënë për njerëzit me nerva të dobët. Zmіnyuchi thelbi, shih rizikuєte danі. Kodi i kernelit nuk ka të njëjtin kod standard, si në shtesat më të fundit Linux. Nëse merrni një falje, atëherë mbyllni të gjithë sistemin.

Situata është e mbingarkuar nga fakti se problemi nuk shfaqet domosdoshmërisht menjëherë. Nëse moduli është në sistem menjëherë pasi është kyçur, atëherë është skenari më i bukur për lojën. Më shumë ka kod, është më shumë rrezik i cikleve të pafundme dhe kthesave të kujtesës. Nëse nuk ju intereson, atëherë problemi do të bëhet rritje graduale në botën e makinave robotike. Struktura e rëndësishme e të dhënave dhe rishkrimi i bufferit mund të mbishkruhen.

Është e mundur në harresën kryesore paradigmat tradicionale të zhvillimit të dodatkiv. Për sa kohë që moduli të jetë i instaluar dhe përditësuar, ju do të shkruani kodin që reagon ndaj pod-eve të sistemit dhe jo kodin sipas shabllonit të fundit. Me robotët me një bërthamë, ju shkruani API-në, jo vetë shtesat.

Ju gjithashtu nuk keni akses në bibliotekën standarde. Nëse kerneli dëshiron të bëjë diçka si një funksion printk (për të shërbyer si zëvendësim për printf) dhe kmalloc (i cili është i ngjashëm me malloc), në pjesën kryesore do të mbeteni vetëm me një zalizom. Para kësaj, pas ripërtëritjes së modulit, do të më duhet ta pastroj atë pas vetes. Nuk ka asnjë koleksion të smittya.

komponentët e nevojshëm

Para së gjithash, unë do t'i kthehem qartësisë së të gjitha mjeteve të nevojshme për një robot. Naygolovnishe, kërkohet një makinë Linux. E di, çmimi është i papërshtatshëm! Nëse dëshironi të jeni një shpërndarje Linux, në të gjitha aplikacionet unë kam një Ubuntu 16.04 LTS vicioz, kështu që në zhvillimin e shpërndarjeve të tjera mund të ndryshoni lehtësisht komandat e instalimit.

Me fjalë të tjera, kërkohet një makinë fizike, ose një makinë virtuale. Sidomos unë vvazhayu për gjëra të bukura në makinën virtuale, ju lutem zgjidhni veten. Rajah nuk do të vikoristovouvati makinën tuaj kryesore përmes humbjes së haraçit, nëse bëni një falje. Më duket se them "nëse" dhe jo "yaksho", atëherë do të doja ta lëvizja makinën gjatë procesit. Ndryshimet tuaja të mbetura në kod mund të gjenden ende në bufferin e shkrimit në kohën e panikut të kernelit, kështu që ndryshimet tuaja mund të bëhen. Testimi në makinat virtuale

Para së gjithash, nëse doni një pjesë të fisnikërisë C. Toka e fortë e mesme C ++ është shumë e madhe për bërthamën, kështu që ju duhet të shkruani në një C të pastër të zhveshur. Për ndërveprimin me zotërimet, mos merrni njohuri të montuesit.

Instalimi i mesit të prizës

Në Ubuntu, duhet të ekzekutoni:

Apt-get install build-thesential linux-headers-`unname -r`
Instaloni mjetet e disponueshme dhe kokat e kernelit të kërkuara për këtë stok.

Vë në fund të kompensimit, se si lavdëroni z-pid-in e zvychay koristuvach, dhe jo rrënjën, por keni më shumë privilegje sudo. Sudo kërkohet për të kyçur modulet e kernelit, por unë dua ta provoj sa më shumë që të jetë e mundur jashtë rrënjës.

rregulloj

Vazhdoni të shkruani kodin. Pidgotuєmo mesi ynë:

Mkdir ~ / src / lkm_shembull cd ~ / src / lkm_example
Hapni redaktorin e dashurisë (në vim tim) dhe hapni skedarin lkm_example.c si kjo:

#përfshi #përfshi #përfshi MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("Robert W. Oliver II"); MODULE_DESCRIPTION ("Një shembull i thjeshtë modul Linux."); MODULE_VERSION ("0.01"); static int __init lkm_example_init (void) (printk (KERN_INFO "Hello, World! \ n"); return 0;) static void __exit lkm_example_exit (void) (printk (KERN_INFO "Mirupafshim, Botë! \ nit_xample (inm) module_e ); modul_dalje (lkm_shembull_dalje);
Ne kemi projektuar modulin më të thjeshtë dhe më fleksibël, i cili mund të paraqitet lehtësisht në pjesën e mëposhtme:

  • Përfshirja ka ri-siguruar skedarë të kokës që nevojiten për të shpërndarë kernelin Linux.
  • Në MODULE_LICENSE mund të vendosni një vlerë të ndryshme, nga licenca e modulit. Për të rishikuar listën, ekzekutoni:

    Grep "MODULE_LICENSE" -B 27 / usr / src / linux-headers-`uname -r` / include / linux / module.h

  • Ne do të vendosim init dhe dalje si një funksion statik që rrotullon numrat e plotë.
  • Respekti kafshëror për printk victorian zëvendëso printf. Gjithashtu parametrat printk shfaqen si printf. Për shembull, Prapor KERN_INFO për lakuriqësinë e përparësisë së prerjeve për një rresht të caktuar duhet të zbatohet pa Komi. Kerneli është renditur me fjalime të shumta në funksionin printk të mesëm për të kursyer kujtesën e stivës.
  • Në skedar, mund të kontrolloni module_init dhe module_exit dhe të aktivizoni funksionin e përfshirjes dhe faturimit. Gjatë gjithë kohës ju jep fuqinë për të ndryshuar funksionet.
Megjithatë, ne nuk mund ta përpilojmë skedarin ende. Kërkohet skedari i krijimit. Ka mjaft një stok të tillë bazë. Kafshore respekt, kështu që bëni edhe vibaglivy për glades dhe tabam, kështu ri-lidh, se si vicorist tabi zëvendësojë probilivy de lay.

Obj-m + = lkm_example.o të gjitha: make -C / lib / module / $ (uname shell -r) / build M = $ (PWD) module të pastra: make -C / lib / module / $ (uname i guaskës -r ) / ndërto M = $ (PWD) të pastër
Sapo lançohet make, është faji i përpilimit të suksesshëm të modulit tonë. Skedari që rezulton do të jetë lkm_example.ko. Sapo të dukeni si falje, kthejini ato, në mënyrë që putrat në kodin e daljes të vendosen saktë, dhe jo saktësisht në kodin UTF-8.

Tani mund të përdorni modulin dhe ta konvertoni atë. Për të drejtuar mo:

Sudo insmod lkm_shembull.ko
Nëse gjithçka është në rregull, atëherë nuk do të mundni asgjë. Funksioni printk nuk do të shkruajë daljen në tastierë, por në regjistrin e kernelit. Për të parë, duhet të vraponi:

Sudo dmesg
Ju jeni fajtor për të rregulluar rreshtin "Përshëndetje, Botë!" me një orë mіtkoy në kalli. Kjo do të thotë që moduli ynë i kernelit është bllokuar dhe është shkruar me sukses në regjistrin e kernelit. Ne gjithashtu mund të ndryshojmë mënyrën se si moduli është në memorie:

Lsmod | grep "lkm_example"
Për të parë mo-in e lëshuesit:

Sudo rmmod lkm_shembull
Nëse di të drejtoj dmesg, atëherë posto "Mirupafshim, Botë!" në ditar. Unë mund të ekzekutoj përsëri lsmod dhe ta ndryshoj atë, kështu që moduli është i gjallë.

Yak bachite, procedura për testimin e trokës do të jetë automatike, mund ta automatizoni procedurën duke shtuar:

Test: sudo dmesg -C sudo insmod lkm_example.ko sudo rmmod lkm_example.ko dmesg
në Makefile dhe më pas ekzekutoni:

Bëni testin
për testimin e modulit dhe konvertimin e pamjeve në regjistrin e kernelit pa pasur nevojë të ekzekutohet komanda.

Tani kemi një modul kernel më funksional dhe absolutisht të parëndësishëm!

Le të gërmojmë një trochie glibshe. Nëse dëshironi modulet e bërthamës së ndërtesës, të gjitha pamjet e ndërtesave, ndërveprimi me suplementet është një nga opsionet më të njohura për viktorianët.

Oskіlki dodatkіv zabonono për të rishikuar kujtesën në pafundësinë e kernelit, për ndërveprim me ta API është ngritur. Nëse dua të gjej teknikisht mënyrën e një ndërveprimi të tillë, mënyra më e mirë është të bashkëngjit skedarin në skedar.

Epo, më herët dhe më shumë, unë mund të shoh skedarët e bashkëngjitjes. Komandat nga / dev / zero, / dev / null dhe në mënyrë të ngjashme ndryshojnë shtesat "zero" dhe "null" për të rrotulluar vlerat.

Aplikacioni ynë ka një "Përshëndetje, Botë". Nëse funksioni nuk është aq i mirë sa shtesat, e gjitha një gjë tregon procesin e ndërveprimit me shtesën përmes skedarit të bashkëngjitjes.

Ri-listimi i aksit:

#përfshi #përfshi #përfshi #përfshi #përfshi MODULE_LICENSE ("GPL"); MODULE_AUTHOR ("Robert W. Oliver II"); MODULE_DESCRIPTION ("Një shembull i thjeshtë modul Linux."); MODULE_VERSION ("0.01"); #define DEVICE_NAME "lkm_example" #define EXAMPLE_MSG "Përshëndetje, Botë! \ n" #define MSG_BUFFER_LEN 15 / * Prototipe për funksionet e pajisjes * / static int device_open (struct inode *, struct file *); static int device_release (struct inode *, struct file *); static ssize_t device_read (skedari struct *, char *, size_t, loff_t *); static ssize_t device_write (skedari struct *, const char *, size_t, loff_t *); statike int major_num; statike int pajisja_e_hapur_numërimi = 0; static char msg_buffer; karakter statik * msg_ptr; / * Kjo strukturë tregon për të gjitha funksionet e pajisjes * / static struct file_operations file_ops = (.read = pajisja_lexuar, .write = pajisja_shkruaj, .open = pajisja_open, .release = pajisja_lëshimi); / * Kur një proces lexon nga pajisja jonë, ai thirret. * / Static ssize_t device_read (skedari struct * flip, char * buffer, size_t len, loff_t * offset) (int bytes_read = 0; / * Nëse jemi në fund, kthehuni përsëri në fillim * / nëse (* msg_ptr = = 0) (msg_ptr = msg_buffer;) / * Vendosni të dhënat në buffer * / ndërsa (len && * msg_ptr) (/ * Buffer është në të dhënat e përdoruesit, jo në kernel, kështu që nuk mund të referoni * vetëm me një tregues. Funksioni put_user e trajton këtë për ne * / put_user (* (msg_ptr ++), buffer ++); len--; bytes_read ++;) kthen bytes_read;) / * Thirret kur një proces përpiqet të shkruajë në pajisjen tonë * / statike ssize_t device_write (skedari struct * flip, const char * buffer, size_t len, loff_t * offset) (/ * Kjo është një pajisje vetëm për lexim * / printk (KERN_ALERT "Ky operacion nuk mbështetet. \ n"); kthe -EINVAL; ) / * Thirret kur një proces hap pajisjen tonë * / static int device_open (struct inode * inode, struct file * file) (/ * Nëse pajisja është e hapur, kthehu i zënë * / nëse (device_open_count) (return -EBUSY;) device_open_count + +; try_module_get (KJO _MODULI);< 0) { printk(KERN_ALERT “Could not register device: %d\n”, major_num); return major_num; } else { printk(KERN_INFO “lkm_example module loaded with device major number %d\n”, major_num); return 0; } } static void __exit lkm_example_exit(void) { /* Remember - we have to clean up after ourselves. Unregister the character device. */ unregister_chrdev(major_num, DEVICE_NAME); printk(KERN_INFO “Goodbye, World!\n”); } /* Register module functions */ module_init(lkm_example_init); module_exit(lkm_example_exit);

Testi i vitheve të lëmuara

Tani prapanica jonë është më e fortë, nuk është vetëm një ndryshim në rast se jemi të kyçur dhe të gjallë, kështu që procedura e provës është më pak se një suvor. Makefile ndryshohet vetëm për lidhjen e modulit, pa yogo vivantage.

Obj-m + = lkm_example.o të gjitha: make -C / lib / module / $ (uname shell -r) / build M = $ (PWD) module të pastra: make -C / lib / module / $ (uname i guaskës -r ) / build M = $ (PWD) test i pastër: # Vendosim një - përpara komandës rmmod për t'i thënë make për të injoruar # një gabim në rast se moduli nuk është i ngarkuar. -sudo rmmod lkm_example # Pastro regjistrin e kernelit pa echo sudo dmesg -C # Fut modulin sudo insmod lkm_example.ko # Shfaq regjistrin e kernelit dmesg
Tani, kur kryeni testin e krijimit, ndryshoni pamjen e numrit kryesor për bashkëngjitjen. Ne caktojmë automatikisht një kernel në aplikacionin tonë. Megjithatë, numri kërkohet për hapjen e aneksit të ri.

Merrni një numër, ndryshoni atë në rezultatin e testit të krijimit dhe zgjidhni atë për bashkëngjitjen e skedarit, në mënyrë që të mund të vendosni një lidhje me modulin tonë të kernelit nga hapësira e hapur e një koristuvach.

Sudo mknod / dev / lkm_shembull me MAJOR 0
(Në të njëjtin aplikacion, zëvendësoni MAJOR me vlerat, ne do ta mohojmë atë në rezultatin e testit të make ose dmesg)

Parametri c në komandën mknod i thotë mknod të hapë skedarin simbolik të bashkëngjitjes.

Tani mund ta korrigjojmë në vend të bashkëngjitjes:

Cat / dev / lkm_shembull
Ose lundroni përmes komandës dd:

Dd nëse = / dev / lkm_shembull i = test bs = 14 numërim = 100
Mund të modifikoni gjithashtu aksesin në skedar nga skedarët e të dhënave. Nuk është e nevojshme të përpiloni komponentë shtesë - lundroni nga skriptet Python, Ruby dhe PHP - qasja në të dhëna.

Nëse mbaronim me një shtesë, pashë modulin tim yo dhe vivantage:

Sudo rm / dev / lkm_shembull sudo rmmod lkm_shembull

visnovok

Ju jam mirënjohës, jeni të nderuar me hapësirat tona të zbrazëta në pafundësinë e bërthamës. Nëse doni të tregoni prapanicë primitive, dhe strukturat mund të jenë fitimtare për hapjen e moduleve të fuqisë, në mënyrë që të mund të palosni edhe më shumë fabrikën.

Vetëm mos harroni se në hapësirën e hapur të bërthamës gjithçka është për këndvështrimin tuaj. Atje, për kodin tuaj, nuk ka nevojë për një shans tjetër. Nëse jeni duke punuar në një projekt për një klient, planifikoni një paraqitje paraprakisht, përndryshe do të duhet një orë për t'u përmirësuar. Kodi i bërthamës është fajtor për të qenë ideal, sa më shumë që të jetë e mundur, në mënyrë që të garantojë integritetin dhe besueshmërinë e sistemeve në të cilat lëshohen verërat.

Bëhuni gati për projektin - ju lutem, faleminderit!
Lexoni gjithashtu
Sberbank (si dhe Oschadbank) Sberbank (si dhe Oschadbank) Zgjidhja e problemeve të licencës për Autocad Chi nuk fillon autocad Windows 7 Zgjidhja e problemeve të licencës për Autocad Chi nuk fillon autocad Windows 7 Udhëzime për regjistrimin e kodit PIN të CryptoPro, para orës së regjistrimit të disa dokumenteve - Udhëzime - AT Udhëzime për regjistrimin e kodit PIN të CryptoPro, para orës së regjistrimit të disa dokumenteve - Udhëzime - NË "PEK-Torg"