SMI-flash-aseman tunnistustietojen muuttaminen. Prosessin PID:n muuttaminen Linuxissa ydinmoduulin avulla

Huomio! PID:n muuttamisen jälkeen ohjaimemme eivät sovellu värähtelyyn. Muita tarvitaan. Jos unohdat tämän, yritykset asentaa oscill uuteen tietokoneeseen epäonnistuvat.

PID - Tuotteen tunnus/numero tuotteen ominaisuudet USB-laitteet yhdessä VID:n (Vendor Identifier - valmistajan numero) kanssa luonnehtivat tätä laitetta yksilöllisesti isäntäpuolelta. Jokaisen liitetyn laitteen ohjaimet asennetaan ja niitä käytetään VID/PID:n avulla.

Oskilloskooppi usb.oscill niille on määritetty ainutlaatuinen VID+PID, joten ne toimitetaan Windows 98, 98SE, ME, 2000, XP, Vista, Seven ajureilla (ja ne ovat ladattavissa tältä sivustolta). Kuitenkin seuraavissa tapauksissa:

  • oscillin käyttö Linux-käyttöjärjestelmässä (ohjelmisto sisään virtuaalikone) - vaihtoehto FreeBSD:lle
  • oscillin yhdistäminen Pocket PC:hen / Windows Mobileen virtuaalisen COM-portin kautta
  • Windows Seven 64-bittinen pakollisella ohjaimen allekirjoituksella

Saatat joutua käyttämään tavallisia Silabsin ohjaimia, jotka edellyttävät PID-tunnuksen vaihtamista värähtelee PID Silabsissa. Se voi olla tehty erityinen apuohjelma AsetaPID:

On suositeltavaa vaihtaa PID EA61:ssä ja käyttää ohjelmiston uutta versiota ja DLL-ajuria Silabs v3.X. Tämä ohjelmisto tarjoaa automaattisen ja manuaalisen USB-valinta ohjaimet v2.0 ja v3.X välillä. Manuaalista valintaa varten sinun on tehtävä: Link-Setup-Port-Driver-V3

Huomio! PID:n muuttaminen tällä apuohjelmalla on mahdollista vain käynnissä olevassa tietokoneessa Windowsin ohjaus, jossa nykyistä PID:tä vastaava ohjain on jo asennettu. Muuten SetPID ei näe värähtelee. Toisin sanoen oskillin on oltava läsnä "Ohjauspaneelin" "Laitehallinnassa". Algoritmi:

  1. jos tämän osan USB- (tai VCP)-ohjain on jo asennettu, setpid-apuohjelma näyttää PID=840E, ja voit muuttaa PID:n yleiseksi SILABSiksi;
  2. SetPID menettää värähtelyn, se katoaa myös Laitehallinnasta;
  3. Windows löytää uuden laitteen, jolle sinun on ladattava standardiohjain Silabsilta PID EA60:lle tai PID EA61:lle
  4. tämä ohjain on allekirjoitettu ja komentotulkin pitäisi alkaa toimia sen kanssa.

Käänteinen menettely:

  1. asennuksen jälkeen tavallinen kuljettaja, SetPID-apuohjelma havaitsee värähtelyn PID=EA60 tai EA61
  2. voit palauttaa mukautetun OSCILL PID:n painamalla vastaavaa painiketta
  3. SetPID näyttää alkuperäisen PID:n värähtelee= 840E

PID:n vaihtamiseen voit käyttää setpidin lisäksi Silabsin apuohjelmaa: valitse tällä sivulla an144.pdf Ja an144sw.zip

Huomautus: Käyttäjä Usatenko foorumilla julkaisi reseptin PID:n vaihtamiseen ainoa tietokone Win7 64:n kanssa

Tämä on pääartikkeli, jossa tarkastelemme kuinka klassisella tavalla muuttamalla flash-aseman tietoja, verrataan sitä kahteen eksoottiseen, jotka on kuvattu yksityiskohtaisesti erillisissä artikkeleissa.

Niissä kuvataan menetelmiä sellaisten tietojen muuttamiseksi, joita ei voi muuttaa yksinkertaisesti muokkaamalla ohjelman asetuksia. Lyhyesti sanottuna ongelman ratkaisemiseen käytettiin epätyypillistä lähestymistapaa.

JOHDANTO

Miksi ohjaimet ovat hyviä SMI, joten koska niitä ei ole ollenkaan tarpeen ommella vaihtaaksesi sarjanumero ja useimmat muut tiedot. Tämä puolestaan ​​vähentää riskiä saada kuollut flash-asema lopussa.

Mutta sinun ei silti tarvitse rentoutua, minkä tahansa menetelmän käyttäminen voi johtaa tarpeeseen lisämuotoilu, ja jäätymistä. Tämä johtuu pääasiassa häiriöistä joissakin apuohjelmajakeluissa SMI MPTool. Joten yhdessä versiossa tunnistetiedot eivät jostain syystä halua päivittyä, toisessa sarjanumeron keskeyttämisen jälkeen se vaatii muotoilua jne. Joskus sinun on vain löydettävä täysin yhteensopiva jakelu flash-asemasi kanssa ja muutettava se täysin.

Alle olen sijoittanut pienen lautasen, jossa tein visuaalisen vertailun mahdollisuuksista erilaisia ​​menetelmiä muutoksia tunnistetiedot. Kuten siitä voidaan nähdä, universaali menetelmä ei, ja yksittäisten elementtien yhdistelmä on juuri se ratkaisu, joka ehdottaa itseään.

TEKNIIKOJEN VERTAILEVA ANALYYSI
VAKIOMENETELMÄ SMI DEBUG TIEDOSTOJEN MUOKKAAMINEN
VID-PID: + + +
Myyjä-tuote: + + +
Sarjanumero: + + +
Versio: + +
MP päivämäärä: +
ISP Ver: +
Esitestiversio: + +
MP-paketin numero: + +
Flashset: + +
VAIKEUSASTE: HELPOSTI KESKIVERTO KESKIVERRON YLÄPUOLELLA

SMI MPTOOL TASKUVALUN KAUTTA

Kuten jo johdannossa kirjoitin, ompelu ei ole ollenkaan välttämätöntä tietojen muuttamisen ongelman ratkaisemiseksi. Riittää, kun jätät valintaruudut aktiiviseksi ensimmäisellä asetussivulla oikealla Kirjoita CID Ja Lataa ISP.

Ja vielä enemmän puolesta vanha malli SM3252C, voit yleensä jättää vain yhden linnun Kirjoita CID.

Täydellinen vilkkuminen saavutetaan ylimääräinen sisällyttäminen vaihtoehdot: Esitesti Ja Muoto (FAT32).

Katsotaan erikseen Sarjanumero, koska se on monimutkaisin, ja vasta sitten kaikki muut parametrit.

SARJANUMERO

Ensi silmäyksellä saattaa tuntua, että manuaalisen muokkauksen ansiosta voit asettaa sarjan pituuden SMI-flash-asemat alla 13 merkkiä sisältyvät tuotantolaitokseen SMIMPTool. Mutta sellaisenaan alaraja sisään 13 tavua ei ole sovelluksessa olemassa olevasta parametrista huolimatta SN pituus.

Ensin asetetaan parametrin arvo Sarjanumero, joka määrittää muodostustavan:
13-32 tavua (vakioarvo, josta sinun pitäisi muokata sitä)
Satunnainen SN (satunnaisia ​​symboleja)
EI Sarja (sarjanumero puuttuu)
EI sarjapäivitystä (säilytä sama arvo)

Jos haluat koodata tietyn sarjanumeron, ilmoita se sarakkeessa Sarjan maski.

Symboli # sarjanumerossa, mikä tarkoittaa mielivaltaista arvoa, jota käytetään generoitaessa sarjanumeroa moodeissa Satunnainen SN Ja 13-32 tavua.

SN pituus: pituusarvo, 13-32 merkkiä. Ei vaihtoehtoa Chk SN Len, joka ohjaa tiukasti määritetyn sarja-parametrin pituutta SN pituus rajoittaa ruokahaluasi vain maksimipituuteensa.

Sarjan maski– maski, jolla sarjanumero luodaan. Jokaisella seuraavalla flash-asemalla on eri numero kuin edellisellä, joka tulee arvosta Aloita sarja ennen Lopeta sarja symbolien vaihtaminen merkin alla ritilät (# ).
Aloita sarjaalkuarvo, ensimmäiselle flash-asemalle.
Lopeta sarja– lopullinen arvo.

Katsotaanpa esimerkkiä luvun luomisesta esimerkkitilassa Satunnainen SN:
Kysytään Sarjan maski = A.A.#USBDEVRU###################
Saamme seuraavan sarjanumeron: A.A. Z USBDEVRU 0ORFR1BYNRB7UBY317E

Nuo. symboleja A.A. Ja USBDEVRU jäi, loput korvattiin satunnaisesti.

KAIKKI MUU

Selitä muutosprosessi VID-PID, REV, MYYJÄ-TUOTE ei ole erityistä merkitystä, selitän vain lyhyesti, missä kaikki on. Kutsumme elementtejä SMI MPTool kuten sovelluksessa on tapana ChipGenius.

VID Ja PID Ilman minua se on selvää, kirjoitamme tarvittaessa omat arvomme.

(nimi sisään SMI MPTool) = (V ChipGenius)

USB Vendor Str = Laitteen toimittaja
USB Product Str = Laitteen nimi

Tiedustelu myyjä = Valmistaja
Tuotekysely = tuotemalli

bcdDevice- tämä on versio ( Tarkistus), sama arvo on asetettu Laitteen versio Ja Tuoteversio. Kun käytät muita menetelmiä, voit muuttaa niitä erikseen ja siksi laittamassani taulukossa MIINUS sopivassa sarakkeessa.

SMI REFIXINFO:n kautta

On kompakti kannettava työkalu, joka on ihanteellinen täysin valmistautumattomille käyttäjille.

Riittää, kun aktivoit muutettavien parametrien alareunassa olevat valintaruudut ja valitset ne sitten ohjelman yläosasta.

Valitettavasti apuohjelma on vanhentunut eikä yhteensopiva nykyisten sirujen kanssa. Toimii ilmeisesti vanhempien mallien kanssa SMI SM3257AA, jota 2000-luvun lopulta lähtien ei löydy päiväsaikaan.

Lisäksi se ei salli laitteen sarjanumeron vaihtamista, mikä on melkoista merkittävä haitta. Voit muokata seuraavia parametreja: VID, PID, Laitteen toimittaja, Laitteen nimi, Laitteen versio, Valmistaja Ja tuotemalli.

DYNA MPTOOL FLASHERin kautta

Siinä on paljon ominaisuuksia ja omituisuuksia, joten suosittelen välttämään apuohjelmia, jos mahdollista.

Niille, jotka jotenkin sotkevat flash-aseman ja haluavat flash-muistin tarvittavilla tiedoilla, näytän kuvakaappauksissa vastaavat ohjelma-asetukset.

: OpenCard Config:

: Laitteen kokoonpano:

Ottaen huomioon sen kanssa DYNA Ommeltujen flash-asemien kanssa on yleensä paljon ongelmia, paras ratkaisu niille olisi muokata tietoja manuaalisesti .

SMI QCTOOLIN KAUTTA

On myös toinen vaihtoehto, kuten apuohjelman käyttö SMI QCTool I1027, mutta tämä on silti liian eksoottinen vaihtoehto.

En osaa sanoa tarkalleen minkä sirumallien kanssa tämä apuohjelma on yhteensopiva, mutta ei varmasti montaa ja ne ovat kaikki vanhoja. Se on esimerkiksi yhteensopiva flash-asemani kanssa SMI SM3252C.

Harkitse sisään tätä materiaalia kysymys sovelluksen käytöstä SMIQCTool Emme ota enkä suosittele sinua ottamaan häneen yhteyttä. Sanon sen vain kaavioissa Myyjä, Tuote, Label joka sijaitsee apuohjelman pääikkunassa, sinun on syötettävä flash-asemasi arvot, jotta se ei näytä virheitä punaisena, kuten: Etikettivirhe, SCSI-toimittajan virhe Ja SCSI Tuotevirhe.

No, annan sinulle pari kuvakaappausta apuohjelman asetuksista, ja sitten voit tehdä sen itse, jos haluat.

Jos haluat yksityiskohtaisen pohdinnan sarjanumeron tai muun parametrin muuttamiseen liittyvästä ongelmastasi, siirry osoitteeseen -.

  • Epänormaali ohjelmointi
  • Ohjelmointi
  • Tässä artikkelissa yritämme luoda ydinmoduulin, joka voi jo muuttaa PID:n käynnissä oleva prosessi Linux-käyttöjärjestelmässä ja kokeile myös prosesseja, jotka ovat saaneet muuttuneen PID:n.


    Varoitus: PID:n muuttaminen on epätyypillinen prosessi, ja tietyissä olosuhteissa voi johtaa ytimen paniikkiin.

    Testimoduulimme toteuttaa /dev/test character -laitteen, joka muuttaa prosessin PID:tä lukiessaan siitä. Kiitos artikkelista merkkilaitteen toteuttamisen esimerkistä. Täysi koodi moduuli on artikkelin lopussa. Tietysti eniten oikea päätös Itse ytimeen oli mahdollista lisätä järjestelmäkutsu, mutta tämä vaatisi ytimen kääntämistä uudelleen.

    Ympäristö

    Kaikki moduulien testaustoiminnot suoritettiin virtuaalisesti VirtualBox kone 64-bittisellä LInux-jakelulla ja ytimen versiolla 4.14.4-1. Yhteydenpito koneeseen tapahtui SSH:lla.

    Yritys #1 yksinkertainen ratkaisu

    Muutama sana nykyisestä: nykyinen muuttuja osoittaa task_struct-rakenteeseen, jossa on kuvaus ytimen prosessista (PID, UID, GID, cmdline, nimiavaruudet jne.)

    Ensimmäinen ajatus oli yksinkertaisesti muuttaa nykyinen->pid-parametri ydinmoduulista halutuksi.

    Static ssize_t device_read(struct file *filp, char *puskuri, size_t pituus, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("uusi PID: %d.\n",current->pid); , )
    Moduulin toimivuuden tarkistamiseksi kirjoitin ohjelman C++:lla:

    #sisältää #sisältää #sisältää int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
    Ladataan moduuli insmod-komennolla, luodaan /dev/test ja kokeillaan.

    # ./a.out Vanhempani PID 293 Oma PID 782 Uusi PID 782
    PID ei ole muuttunut. Tämä ei ehkä ole ainoa paikka, jossa PID on määritetty.

    Yritä #2 lisää PID-kenttiä

    Jos nykyinen->pid ei ole prosessin tunniste, niin mikä se on? Pikakatsaus getpid()-koodiin osoitti task_struct-rakenteeseen, joka kuvaa Linux-prosessia ja pid.c-tiedostoa ytimen lähdekoodissa. Tarvitsemasi funktio on __task_pid_nr_ns. Toimintokoodissa on kutsu task->pids.pid, muutamme tätä parametria

    Kokoa ja kokeile

    Koska testasin SSH:n kautta, sain ohjelman tulosteen ennen kuin ydin kaatui:

    Vanhempani PID 293 Oma PID 1689 Uusi PID 1689
    Ensimmäinen tulos on jo jotain. Mutta PID ei ole vieläkään muuttunut.

    Yritä #3 ei-vietäviä ytimen symboleja

    Tarkempi tarkastelu pid.c:tä tuotti funktion, joka tekee mitä tarvitsemme
    static void __change_pid(struct task_struct *tehtävä, enum pid_type tyyppi,
    struct pid *uusi)
    Toiminto hyväksyy tehtävän, jota varten on tarpeen muuttaa PID, PID-tyyppi ja itse asiassa uusi PID. Toiminto luo uuden PID:n
    struct pid *alloc_pid(struct pid_namespace *ns)

    Tämä funktio hyväksyy vain nimitilan, jossa uusi PID sijaitsee. Tämä tila voidaan hankkia komennolla task_active_pid_ns.
    Mutta on yksi ongelma: ydin ei vie näitä ytimen symboleja, eikä niitä voi käyttää moduuleissa. Eräs upea auttoi minua ratkaisemaan tämän ongelman. Find_sym-funktiokoodi on otettu sieltä.

    Staattinen asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); staattinen asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TESTIohjain ladattu!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) staattinen koko_t device_read(struct file * filp, char *puskuri, pituus_t, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(tehtävä_aktiivinen_pid_ns(nykyinen)); change_pidR(nykyinen ,PIDTYPE_PID,newpid) printk("uusi PID: %d.\n",current->pid ... )
    Kääntää, käynnistää

    Vanhempani PID 299 Oma PID 750 Uusi PID 751
    PID muutettu! Ydin myönsi ohjelmallemme automaattisesti ilmaisen PID:n. Mutta onko mahdollista käyttää PID:tä, joka on ollut toisen prosessin, kuten PID 1:n, käytössä? Lisätään koodi allokoinnin jälkeen

    Newpid->numbers.nr = 1;
    Kääntää, käynnistää

    Vanhempani PID 314 Oma PID 1172 Uusi PID 1
    Saamme oikean PID 1:n!

    Bash on aiheuttanut virheen, joka estää tehtävien vaihtamisen %n-komennolla toimimasta, mutta kaikki muut toiminnot toimivat hyvin.

    Mielenkiintoisia ominaisuuksia prosesseista, joiden PID on muuttunut

    PID 0: ei voi kirjautua sisään

    Palataan koodiin ja muutetaan PID arvoksi 0.

    Newpid->numbers.nr = 0;
    Kääntää, käynnistää

    Vanhempani PID284 Oma PID 1517 Uusi PID 0
    Joten PID 0 ei ole niin erityinen? Iloitsemme, kirjoitamme exit ja...

    Tykinkuula putoaa! Ydin määritteli tehtävämme IDLE TASK:ksi ja nähtyään sen valmistumisen yksinkertaisesti kaatui. Ilmeisesti ohjelmamme on palattava "normaaliin" PID:ään ennen poistumista.

    Näkymätön prosessi

    Palataan koodiin ja asetetaan PID, joka ei taatusti ole varattu
    uusitunnus->numerot.nr = 12345;

    Kääntää, käynnistää

    Vanhempani PID296 Oma PID 735 Uusi PID 12345
    Katsotaan mitä /proc

    1 148 19 224 288 37 79 86 93 konsolit fb kcore lukot osiot vaihtavat versiota 10 149 2 226 29 4 8 87 acpi cpuinfo tiedostojärjestelmät avainkäyttäjät meminfo sched_debug sys 08 28 20 8 20 8 asound crypto fs avaimet misc schedstat sysrq- trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo -laitteet keskeyttävät kmsg-moduulit scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 väylä diskstats iomem kpagecgroup -kiinnikkeet 3 70 76 81 3 1 7 2 8 8 dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline-ohjain irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
    Kuten näemme, /proc ei tunnista prosessiamme, vaikka meillä olisi käytössä ilmainen PID. Edellinen PID ei myöskään ole /proc:ssa, ja tämä on hyvin outoa. Ehkä olemme eri nimiavaruudessa, emmekä siksi näy main /proc:lle. Asennataan uusi /proc ja katsotaan mitä siellä on

    1 14 18 210 25 291 738 81 9 väylälaitteet fs avainkäyttäjät lukot sivutyyppiinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats keskeytykset 2 291 osiot stat 291 76 83 92 cmdline dma iomem kmsg sek sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acggerssq info 13 17 208 23 29 6 8 86 sound cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kryptotiedostojärjestelmät kcore loadavg net slabinfo säiettä-self zoneinfo
    Prosessiamme ei edelleenkään ole olemassa, mikä tarkoittaa, että olemme normaalissa nimiavaruudessa. Tarkistetaan

    Ps -e | grep bash
    296 pts/0 00:00:00 bash

    Vain yksi bash, josta käynnistimme ohjelman. Luettelossa ei ole edellinen eikä nykyinen PID.



    Tässä artikkelissa yritämme luoda ydinmoduulin, joka voi muuttaa jo käynnissä olevan prosessin PID:tä Linuxissa, ja myös kokeilla prosesseja, jotka ovat saaneet muuttuneen PID:n.


    Varoitus: PID:n muuttaminen on epätyypillinen prosessi, ja tietyissä olosuhteissa voi johtaa ytimen paniikkiin.

    Testimoduulimme toteuttaa /dev/test character -laitteen, joka muuttaa prosessin PID:tä lukiessaan siitä. Kiitos tästä artikkelista esimerkistä merkkilaitteen toteuttamisesta. Koko moduulin koodi on artikkelin lopussa. Tietenkin oikea ratkaisu oli lisätä järjestelmäkutsu itse ytimeen, mutta se vaatisi ytimen kääntämistä uudelleen.

    Ympäristö

    Kaikki moduulien testaustoiminnot suoritettiin VirtualBox-virtuaalikoneessa, jossa oli 64-bittinen LInux-jakelu ja ytimen versio 4.14.4-1. Yhteydenpito koneeseen tapahtui SSH:lla.

    Yritys #1 yksinkertainen ratkaisu

    Muutama sana nykyisestä: nykyinen muuttuja osoittaa task_struct-rakenteeseen, jossa on kuvaus ytimen prosessista (PID, UID, GID, cmdline, nimiavaruudet jne.)

    Ensimmäinen ajatus oli yksinkertaisesti muuttaa nykyinen->pid-parametri ydinmoduulista halutuksi.

    Static ssize_t device_read(struct file *filp, char *puskuri, size_t pituus, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("uusi PID: %d.\n",current->pid); , )
    Moduulin toimivuuden tarkistamiseksi kirjoitin ohjelman C++:lla:

    #sisältää #sisältää #sisältää int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
    Ladataan moduuli insmod-komennolla, luodaan /dev/test ja kokeillaan.

    # ./a.out Vanhempani PID 293 Oma PID 782 Uusi PID 782
    PID ei ole muuttunut. Tämä ei ehkä ole ainoa paikka, jossa PID on määritetty.

    Yritä #2 lisää PID-kenttiä

    Jos nykyinen->pid ei ole prosessin tunniste, niin mikä se on? Pikakatsaus getpid()-koodiin osoitti task_struct-rakenteeseen, joka kuvaa Linux-prosessia ja pid.c-tiedostoa ytimen lähdekoodissa. Tarvitsemasi funktio on __task_pid_nr_ns. Toimintokoodissa on kutsu task->pids.pid, muutamme tätä parametria

    Kokoa ja kokeile

    Koska testasin SSH:n kautta, sain ohjelman tulosteen ennen kuin ydin kaatui:

    Vanhempani PID 293 Oma PID 1689 Uusi PID 1689
    Ensimmäinen tulos on jo jotain. Mutta PID ei ole vieläkään muuttunut.

    Yritä #3 ei-vietäviä ytimen symboleja

    Tarkempi tarkastelu pid.c:tä tuotti funktion, joka tekee mitä tarvitsemme
    static void __change_pid(struct task_struct *tehtävä, enum pid_type tyyppi,
    struct pid *uusi)
    Toiminto hyväksyy tehtävän, jota varten on tarpeen muuttaa PID, PID-tyyppi ja itse asiassa uusi PID. Toiminto luo uuden PID:n
    struct pid *alloc_pid(struct pid_namespace *ns)

    Tämä funktio hyväksyy vain nimitilan, jossa uusi PID sijaitsee. Tämä tila voidaan hankkia komennolla task_active_pid_ns.
    Mutta on yksi ongelma: ydin ei vie näitä ytimen symboleja, eikä niitä voi käyttää moduuleissa. Eräs upea auttoi minua ratkaisemaan tämän ongelman. Find_sym-funktiokoodi on otettu sieltä.

    Staattinen asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); staattinen asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TESTIohjain ladattu!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) staattinen koko_t device_read(struct file * filp, char *puskuri, pituus_t, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(tehtävä_aktiivinen_pid_ns(nykyinen)); change_pidR(nykyinen ,PIDTYPE_PID,newpid) printk("uusi PID: %d.\n",current->pid ... )
    Kääntää, käynnistää

    Vanhempani PID 299 Oma PID 750 Uusi PID 751
    PID muutettu! Ydin myönsi ohjelmallemme automaattisesti ilmaisen PID:n. Mutta onko mahdollista käyttää PID:tä, joka on ollut toisen prosessin, kuten PID 1:n, käytössä? Lisätään koodi allokoinnin jälkeen

    Newpid->numbers.nr = 1;
    Kääntää, käynnistää

    Vanhempani PID 314 Oma PID 1172 Uusi PID 1
    Saamme oikean PID 1:n!

    Bash on aiheuttanut virheen, joka estää tehtävien vaihtamisen %n-komennolla toimimasta, mutta kaikki muut toiminnot toimivat hyvin.

    Mielenkiintoisia ominaisuuksia prosesseista, joiden PID on muuttunut

    PID 0: ei voi kirjautua sisään

    Palataan koodiin ja muutetaan PID arvoksi 0.

    Newpid->numbers.nr = 0;
    Kääntää, käynnistää

    Vanhempani PID284 Oma PID 1517 Uusi PID 0
    Joten PID 0 ei ole niin erityinen? Iloitsemme, kirjoitamme exit ja...

    Tykinkuula putoaa! Ydin määritteli tehtävämme IDLE TASK:ksi ja nähtyään sen valmistumisen yksinkertaisesti kaatui. Ilmeisesti ohjelmamme on palattava "normaaliin" PID:ään ennen poistumista.

    Näkymätön prosessi

    Palataan koodiin ja asetetaan PID, joka ei taatusti ole varattu
    uusitunnus->numerot.nr = 12345;

    Kääntää, käynnistää

    Vanhempani PID296 Oma PID 735 Uusi PID 12345
    Katsotaan mitä /proc

    1 148 19 224 288 37 79 86 93 konsolit fb kcore lukot osiot vaihtavat versiota 10 149 2 226 29 4 8 87 acpi cpuinfo tiedostojärjestelmät avainkäyttäjät meminfo sched_debug sys 08 28 20 8 20 8 asound crypto fs avaimet misc schedstat sysrq- trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo -laitteet keskeyttävät kmsg-moduulit scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 väylä diskstats iomem kpagecgroup -kiinnikkeet 3 70 76 81 3 1 7 2 8 8 dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline-ohjain irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
    Kuten näemme, /proc ei tunnista prosessiamme, vaikka meillä olisi käytössä ilmainen PID. Edellinen PID ei myöskään ole /proc:ssa, ja tämä on hyvin outoa. Ehkä olemme eri nimiavaruudessa, emmekä siksi näy main /proc:lle. Asennataan uusi /proc ja katsotaan mitä siellä on

    1 14 18 210 25 291 738 81 9 väylälaitteet fs avainkäyttäjät lukot sivutyyppiinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats keskeytykset 2 291 osiot stat 291 76 83 92 cmdline dma iomem kmsg sek sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acggerssq info 13 17 208 23 29 6 8 86 sound cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kryptotiedostojärjestelmät kcore loadavg net slabinfo säiettä-self zoneinfo
    Prosessiamme ei edelleenkään ole olemassa, mikä tarkoittaa, että olemme normaalissa nimiavaruudessa. Tarkistetaan

    Ps -e | grep bash
    296 pts/0 00:00:00 bash

    Vain yksi bash, josta käynnistimme ohjelman. Luettelossa ei ole edellinen eikä nykyinen PID.