Вы находитесь на странице: 1из 100

1.

Introduccln
Blenvenldo u Plntos. Plntos es un murco de slstemu operutlvo senclllo puru lu urqultecturu de
80 x 86. Es computlble con hllos de nucleo, curgur y e|ecutur progrumus de usuurlo, y un slstemu de
urchlvos, slno que lmplementu todos estos de unu muneru muy senclllu. En los proyectos de Plntos,
usted y su equlpo de proyecto fortulecer su upoyo en estos tres mbltos. Tumbln ugregur unu
lmplementucln de memorlu vlrtuul.
Plntos, terlcumente, se e|ecutun en un IBM PC computlble regulur. Desufortunudumente, es poco
prctlco puru ubustecer cudu 140 estudluntes CS un PC dedlcudo puru el uso con Plntos. Por lo tunto, se
e|ecuturn proyectos de Plntos en un slmuludor de slstemu, es declr, un progrumu que slmulu un 80 x 86
CPU y sus dlsposltlvos perlfrlcos con suflclente preclsln que los slstemus operutlvos sln
modlflcuclones y el softwure se e|ecute en l. En lu cluse se utlllzur el Bochs y slmuludores
deOEMU. Plntos tumbln hu sldo probudo con VMwure Pluyer.
Estos proyectos son dlficlles. CS 140 tlene unu reputucln de tener un montn de tlempo, y con
ruzn. Huremos lo que podumos puru reduclr lu curgu de trubu|o, tules como proporclonur unu grun
cuntldud de muterlul de upoyo, pero huy un montn de trubu|o duro que huy que hucer. Dumos lu
blenvenldu u sus comenturlos. Sl tlene sugerenclus sobre cmo podemos reduclr lu curgu lnnecesurlu de
tureus, corturlos u lus lmportuntes cuestlones subyucentes, por fuvor hgunoslo suber.
Este cupitulo expllcu cmo empezur u trubu|ur con Plntos. Usted debe leer el cupitulo completo untes de
empezur u trubu|ur en cuulquleru de los proyectos.
1.1 Introduccln
Puru empezur, tendrs que lnlclur sesln en unu mqulnu que Plntos se puede construlr. El CS140
"upoyo oflclul" de lus mqulnus de desurrollo Plntos son lus mqulnus del mlto y lus ugrupuclones de
vld gestlonudos por Stunford ITSS, como se descrlbe en lu pglnu web ITSS. Usted puede usur el
Solurls o Llnux. Vumos u probur el cdlgo en estus mqulnus, y lus lnstrucclones dudus uqui usumlr este
entorno. No podemos proporclonur soporte puru lnstulur y trubu|ur en Plntos en su proplu mqulnu, pero
se proporclonun lnstrucclones puru hucerlo, no obstunte (vuse lu seccln Instulucln de G. Plntos).
Unu vez que huyus entrudo en unu de estus mqulnus, yu seu loculmente o remotumente, comenzur
sumundo los blnurlos del dlrectorlo u su entorno PATH Bu|o csh el shell de entrudu de Stunford, puede
hucerlo con este comundo: (1)

set puth = (/ usr/cluss/cs140 / `unume-m` / bln S puth)
Ntese que lus dos se de|un lus comlllus slmples o" ucentos ublertos, "no upstrofes ( '). Es unu buenu
ldeu unudlr estu lineu ul urchlvo. Cshrc en su dlrectorlo home. De lo contrurlo, tendrs que escrlblrlu
cudu vez que lnlcle sesln
1.1.1 rbol de cdlgo fuente
Ahoru usted puede extruer lu fuente de Plntos en un dlrectorlo llumudo Plntos / src, medlunte lu
e|ecucln de

/ usr/cluss/cs140/plntos/plntos.tur.gz zcut | tur x
Como ulternutlvu, lr u buscur http://www.stunford.edu/cluss/cs140/pro|ects/plntos/plntos.tur.gz y el
extructo de unu muneru slmllur.
Echemos un vlstuzo u lo que huy dentro. Aqui est lu estructuru de dlrectorlos que usted debe ver
en Plntos / src:
hllos /
El cdlgo fuente del nucleo de buse, que se modlflcur u purtlr de proyecto 1.
userprog /
El cdlgo fuente puru el curgudor de progrumu de usuurlo, que se modlflcur u purtlr de
proyecto 2.
vm /
Un dlrectorlo de cusl vucio. Deber lmplementur memorlu vlrtuul uqui en el proyecto 3.
slstemu de flcheros /
El cdlgo fuente de un slstemu de urchlvos de buse. Oue vu u utlllzur este slstemu de urchlvos
de purtldu con el proyecto 2, pero no se modlflcur hustu que el proyecto 4.
dlsposltlvos /
El cdlgo fuente de I / O de lnterfuz de dlsposltlvo: tecludo, temporlzudor, dlsco, etc modlflcur
lu upllcucln del temporlzudor en el proyecto 1. De lo contrurlo, deberiu huber nlngunu
necesldud de cumblur este cdlgo.
llb /
Unu lmplementucln de un subcon|unto de lu blbllotecu de C estndur. El cdlgo de este
dlrectorlo est complludo en tunto el nucleo Plntos y, u purtlr del proyecto 2, los progrumus de
usuurlo que se e|ecutun en l. En tunto el cdlgo del kernel y los progrumus de usuurlo,
encubezudos en este dlrectorlo se puede lnclulr con el #lnclude < ... > notucln.Usted debe
tener pocu necesldud de modlflcur este cdlgo.
/ llb / kernel /
Purtes de lu blbllotecu C que slo se lncluyen en el nucleo Plntos. Esto tumbln lncluye lu
lmplementucln de ulgunos tlpos de dutos que son llbres de utlllzur en el cdlgo del kernel:
mupus de blts, llstus doblemente vlnculudus y tublus hush.En el nucleo, encubezudos en este
dlrectorlo se puede lnclulr con el #lnclude < ... > notucln.
/ llb / user /
Purtes de lu blbllotecu de C que slo se lncluyen en los progrumus de usuurlo Plntos. En los
progrumus de usuurlo, encubezudos en este dlrectorlo se puede lnclulr con el #lnclude
< ... > notucln.
pruebus /
Lus pruebus puru cudu proyecto. Puede modlflcur este cdlgo, sl le uyudu u probur su
presentucln, pero lo reempluzur con los orlglnules untes de e|ecutur lus pruebus.
e|emplos /
E|emplo de los progrumus de usuurlo puru lnlclur su uso con el proyecto 2.
mlsc /
utlls /
Estos urchlvos pueden ser utlles sl usted declde lntentur trubu|ur con Plntos le|os de lus
mqulnus ITSS. De lo contrurlo, puede lgnorurlos.
1.1.2 Edlflclo Plntos
Como prxlmo puso, creur el cdlgo fuente sumlnlstrudo puru el prlmer proyecto. En prlmer lugur, cd en
el dlrectorlo detemus. Entonces, lu edlcln del comundo muke. Esto creur un dlrectorlo
de construccln en vlrtud de lus dlscuslones, llenurlu con un Mukeflle y ulgunus subcurpetus, y luego
construlr el nucleo en su lnterlor. Lu totulldud de lu construccln debe tener menos de 30 segundos.
Ver los comundos e|ecutudos durunte lu construccln. En lus mqulnus Llnux, se utlllzun lus
herrumlentus del slstemu ordlnurlo.En unu mqulnu SPARC, especlules se utlllzun herrumlentus de
construccln, cuyos nombres comlenzun con-ELF-l386,l386-elf-gcc por l386-elf-gcc l386-elf-ld Se trutu
de "cruz de complludor de" herrumlentus. Es declr, lu construccln se est e|ecutundo en unu mqulnu
SPARC (denomlnudo husped), pero el resultudo se e|ecutur en unu mqulnu de slmulucln de 80x 86
(llumudo el ob|etlvo). El l386-Elf-herrumlentus del progrumu son especlulmente construldus puru estu
conflgurucln.
A ruiz de lu construccln, los slgulentes son los urchlvos lnteresuntes en el dlrectorlo de construccln:
Mukeflle
Unu coplu de Plntos / src / Mukeflle.bulld. Se descrlbe cmo construlr el
nucleo. Consulte Adlcln de urchlvos de cdlgo fuente, puru ms lnformucln.
kernel.o
Archlvo de ob|etos puru todo el nucleo. Este es el resultudo de enluzur urchlvos ob|eto
complludos de fuentes del nucleo de cudu urchlvo lndlvlduul en un urchlvo unlco
ob|eto. Contlene lnformucln de depurucln, puru que puedu e|ecutur GDB (vuse lu
seccln E.5 GDB) o bucktruce (vuse bucktruces E.4 seccln) sobre ellu.
kernel.bln
Imugen de lu memorlu del kernel. Estos son los bytes exuctu curgudu en lu memorlu puru
e|ecutur el kernel Plntos. Puru slmpllflcur lu curgu, slempre se rellenu con cero bytes hustu un
multlplo exucto de 4 KB de tumuno.
louder.bln
Lu lmugen de lu memorlu puru el gestor del nucleo, un pequeno frugmento de cdlgo escrlto en
lenguu|e ensumbludor que lee el nucleo del dlsco en lu memorlu y comlenzu puru urrlbu. Es
exuctumente 512 bytes de longltud, un tumuno fl|o por lu BIOS del PC.
os.dsk
Imugen de dlsco puru el nucleo, que es slo louder.bln seguldo por kernel.bln. Este urchlvo es
utlllzudo como un dlsco "vlrtuul" por el slmuludor.
Subdlrectorlos de lu construccln contlene urchlvos ob|eto (. O) y los urchlvos de dependenclus (. D),
umbus producldus por el complludor. Los urchlvos de lu dependenclu dlcen muke que los urchlvos de
orlgen se tlenen que recompllur cuundo se cumblun otru fuente o urchlvos de cubeceru.
1.1.3 Plntos Runnlng
Hemos sumlnlstrudo un progrumu puru e|ecutur convenlentemente Plntos en un slmuludor,
denomlnudo plntos En el cuso ms slmple, puede
lnvocur plntos como plntos urgument ... Cudu urgumento se pusu ul nucleo Plntos puru que uctuen sobre
estos.
Prubelo. En prlmer cd en el dlrectorlo de construccln de nuevu creucln. Luego, el comundo plntos
run ulurm-multlpleque pusu los urgumentos run ulurm-multlple en el nucleo Plntos. En estos
urgumentos, run lnstrucclones ul kernel puru reullzur unu pruebu y ulurm-multlple es lu pruebu de correr.
Este comundo creu un urchlvo bochsrc.txt, que es necesurlu puru el funclonumlento de Bochs, y luego
llumur u Bochs.Bochs ubre unu nuevu ventunu de vlsuullzucln que representu lu mqulnu slmuludu, y
un breve mensu|e purpudeu BIOS. Luego botus Plntos y e|ecutu lu ulurm-multlple progrumu de
pruebus ulurm-multlple que emlte unu de lus pocus puntullus completus de texto. Cuundo se huce, puede
cerrur Bochs huclendo cllc en el botn "Power" en lu esqulnu superlor derechu de lu ventunu, o volver u
e|ecutur todo el proceso huclendo cllc en el botn "Reset" |usto u su lzqulerdu. Los otros botones no son
muy utlles puru nuestros propsltos.
(Sl no huy ventunu que hu upurecldo en todos, y que ucubu de reclblr un termlnul con un uspecto de lu
corrupcln de texto, entonces probublemente usted est conectudo de formu remotu y
redlrecclonumlento de X no est conflgurudo correctumente. En este cuso, puede correglr lu
conflgurucln de X, o puede utlllzur lu opcln-v puru lu sulldu desuctlvur X: plntos -v -- run ulurm-
multlple
El texto lmpreso por Plntos dentro Bochs probublemente fue demusludo rpldo puru leer. Sln emburgo,
usted probublemente hu notudo que el mlsmo texto que se muestru en el termlnul que se utlllzu puru
e|ecutur plntos Esto se debe u Plntos enviu todu lu sulldu tunto u lu puntullu VGA, y el prlmer puerto
serle, y por defecto el puerto serle se conectu u stdln de Bochs y stdoutPuede reglstrur lu produccln en
serle u un urchlvo medlunte lu reorlentucln en lu lineu de comundos, por e|emplo, plntos run ulurm-
multlple > logflle
El progrumu de plntos ofrece vurlus opclones puru conflgurur el slmuludor o el hurdwure vlrtuul. Sl se
especlflcu nlngunu opcln, deben preceder u los comundos pusudos ul nucleo Plntos y ser sepurudos de
ellos por -, de modo que el comundo con|unto purece plntos optlon ... -- urgument ... Invocur plntos sln
urgumentos puru ver unu llstu de opclones dlsponlbles. Lus opclones se pueden selecclonur un
slmuludor puru el uso: el vulor predetermlnudo es Bochs, pero - selecclonu qemuOEMU. Puede e|ecutur
el slmuludor con un depurudor (vuse lu seccln E.5 GDB). Puede estublecer lu cuntldud de memorlu
puru dur lu VM. Por ultlmo, puede selecclonur cmo deseu que lu sulldu VM puru que se muestre: uso-
v puru upugur lu puntullu VGA,-T puru utlllzur lu ventunu de lu termlnul, lu puntullu VGA en lugur de
ubrlr unu nuevu ventunu (Bochs solumente), o-s suprlmlr lu serle de entrudu de stdln y lu sulldu u stdout
El nucleo Plntos tlene comundos y otrus opclones de run Estos no son muy lnteresuntes, por uhoru, pero
puedes ver unu llstu de ellos usundo-h, plntos -h por plntos -h
1.1.4 Depurucln de ensuyo frente u
Cuundo ests depurucln de cdlgo, es utll puru poder e|ecutur un progrumu en dos ocuslones y que
tlenen exuctumente lu mlsmu cosu. El segundo y ms turde se e|ecutu, puede hucer nuevus
observuclones, sln tener que descurtur o comprobur sus observuclones de edud. Estu propledud se llumu
lu "reproduclbllldud". Uno de los slmuludores que Plntos upoyu, Bochs, se puede conflgurur puru lu
reproduclbllldud, y esu es lu formu en que plntos lnvocu de formu predetermlnudu.
Por supuesto, unu slmulucln slo puede ser reproduclble de unu curreru u lu slgulente, sl su entrudu es
lu mlsmu cudu vez. Puru lu slmulucln de un equlpo completo, como lo hucemos nosotros, esto slgnlflcu
que cudu purte del equlpo debe ser el mlsmo.Por e|emplo, debe usur el mlsmo comundo urgumento de
lu lineu, los mlsmos dlscos, lu mlsmu versln de Bochs, y no debe tocur nlngunu teclu en el tecludo
(porque no podiu estur seguro u golpeur en el punto exuctumente de lu mlsmu cudu vez ) durunte lus
currerus.
Sl blen lu reproduclbllldud es utll puru lu depurucln, es un problemu puru lus pruebus de slncronlzucln
de hllos, unu purte lmportunte de lu muyoriu de los proyectos. En purtlculur, cuundo Bochs est
conflgurudo puru lu reproduclbllldud, lus lnterrupclones del temporlzudor vendr en puntos
perfectumente reproduclbles, lo que cumblu hllo. Eso slgnlflcu que lu e|ecucln de lu mlsmu pruebu en
vurlus ocuslones que no te du nlngun muyor conflunzu en lu correccln de su cdlgo que se e|ecutu slo
unu vez.
Asi que, puru hucer que su cdlgo seu ms fcll de probur, hemos unudldo unu funcln, llumudu
"fluctuucln", u Bochs, que huce que lus lnterrupclones del temporlzudor vlenen u lntervulos uleutorlos,
pero en unu formu perfectumente prevlslble. En purtlculur, sl se los lnvocu plntos con lu opcln-| de
semlllus, lus lnterrupclones del temporlzudor se presenturn en lntervulos espucludos
lrregulurmente. Dentro de un vulor solu semlllu, lu e|ecucln segulr slendo reproduclbles, pero el
comportumlento de temporlzudor cumblur u medldu que lu semlllu es vurludu. Asi, puru el ms ulto
grudo de conflunzu que debe probur su cdlgo de vulores con muchus semlllus.
Por otru purte, cuundo Bochs se e|ecutu en modo reproduclble, los tlempos no son reullstus, lo que
slgnlflcu que unu "segundu" retruso puede ser mucho ms corto, o lncluso mucho ms de un
segundo. Puede lnvocur plntos con unu opclndlferente,-r, lu creucln de Bochs puru un progrumu
reullstu, en el que un segundo de retruso debe durur uproxlmudumente un segundo de tlempo reul. En el
modo de slmulucln en tlempo reul no es reproduclble, y lus opclones-J y-R son mutuumente
excluyentes.
El slmuludor de OEMU est dlsponlble como unu ulternutlvu u lu Bochs (uso - qemu ul lnvocur plntos El
slmuludor de OEMU es mucho ms rpldo que Bochs, pero slo es computlble con lu slmulucln en
tlempo reul y no tlene un modo reproduclble.
1.2 Lu cluslflcucln de
Nos grudo de su uslgnucln sobre lu buse de los resultudos y lu culldud del dlseno, cudu uno de los
cuules comprende el 50% de su grudo.
1.2.1 Pruebus
Lu notu resultudo de lu pruebu se busur en nuestrus pruebus. Cudu proyecto tlene vurlus pruebus, cudu
unu de ellus tlene un nombre que comlenzu con lus pruebus. Completumente Puru probur su
presentucln, lnvocur muke check de lu generucln del proyecto de dlrectorlo. Esto generur y e|ecutur
cudu pruebu e lmprlmlr un "puse" o "fullur" mensu|e puru cudu uno. Cuundo fullu unu pruebu, muke
check tumbln lmprlme ulgunos detulles de lu ruzn del frucuso. Despus de e|ecutur todus lus
pruebus, muke check tumbln lmprlme un resumen de los resultudos de lu pruebu.
Puru el proyecto 1, lus pruebus probublemente se e|ecuturn ms rpldo en Bochs. Puru el resto de los
proyectos, que se e|ecutur mucho ms rpldo en OEMU. muke check selecclonur el ms rpldo del
slmuludor por defecto, pero puede lnvulldur su eleccln, especlflcundo SIMULADOR =--
Bochs o slmuludor =-- qemu en el muke lu lineu de comundos.
Tumbln puede e|ecutur pruebus lndlvlduules de uno en uno. Unu pruebu t dudo escrlbe su sulldu
en t. Sulldu, entonces lu puntuucln de un scrlpt de lu sulldu como "puso" o "no" y escrlbe el veredlcto
en t. Resultudo. Puru e|ecutur y grudo de unu solu pruebu, muke el. Resultudo de urchlvo de formu
explicltu desde el dlrectorlo de construccln, por e|emplo, muke tests/threuds/ulurm-
multlple.result Sl muke dlce que el resultudo de lu pruebu corresponde u lu fechu, pero deseu volver u
e|ecutur de todus formus, yu seu e|ecutur muke cleun o ellmlnur el urchlvo. Sulldu u muno.
De formu predetermlnudu, cudu pruebu proporclonu lnformucln unlcumente u lu consecucln, no
durunte su e|ecucln. Sl lo preflere, se puede observur el progreso de cudu pruebu,
lndlcundo VERBOSE = 1 en el muke lu lineu de comundos, como en muke check
VERBOSE=1 Tumbln puede proporclonur opclones urbltrurlus u los plntos u curgo de lus pruebus
conPINTOSOPTS = '...', por e|emplo, muke check PINTOSOPTS='-| 1' puru selecclonur un vulor de
fluctuucln de 1 (ver seccln 1.1.4 Depurucln versus pruebus).
Todus lus pruebus y los urchlvos reluclonudos se encuentrun en Plntos / src / pruebus. Antes de probur
su presentucln, vumos u sustltulr el contenldo de ese dlrectorlo de unu coplu pristlnu, sln
modlflcuclones, puru guruntlzur que se utlllzun lus pruebus correctus. Asi, se pueden modlflcur ulgunus
de lus pruebus, sl eso uyudu en lu depurucln, pero vumos u correr los orlglnules.
Todos los softwure tlenen bugs, por lo que ulgunus de nuestrus pruebus puede ser defectuoso. Sl usted
plensu que unu fullu en lu pruebu es un error en lu pruebu, no un error en su cdlgo, por fuvor,
senulurlo. Tendremos en y urreglurlo sl es necesurlo.
Por fuvor, no trutur de uprovechurse de nuestru generosldud ul dur nuestru serle de pruebus. El cdlgo
tlene que funclonur correctumente en el cuso generul, no slo puru los cusos de pruebu que lu ofertu. Por
e|emplo, seriu lnuceptuble que de muneru explicltu el comportumlento de lu buse del nucleo en el
nombre del cuso de pruebu en e|ecucln. Estos lntentos de esqulvur los cusos de pruebu no reclblrn
crdlto. Sl crees que tu solucln puede estur en unu zonu grls, por fuvor consultenos.
1.2.2 Dlseno
Vumos u evuluur su dlseno busudo en el documento de dlseno y el cdlgo fuente que usted
envie. Vumos u leer el documento completo de dlseno y grun purte de su cdlgo fuente.
No se olvlde que lu culldud del dlseno, lncluyendo el documento de dlseno, es de 50% de lu notu del
proyecto. Es me|or pusur unu o dos horus escrlblendo un documento de un buen dlseno de lo que es
pusur ese tlempo consegulr el ultlmo 5% de los puntos puru lus pruebus y luego lntentur correr u truvs
de lu reduccln del documento de dlseno en los ultlmos 15 mlnutos.
1.2.2.1 Documento de Dlseno
Ofrecemos un documento de pluntlllu de dlseno puru cudu proyecto. Puru cudu purte lmportunte de un
proyecto, lu pluntlllu huce preguntus en cuutro reus:
Estructurus de dutos
Lus lnstrucclones puru estu seccln son slempre los mlsmos:
Coplu uqui lu declurucln de cudu nuevo o struct o struct mlembros, vurluble globul o
esttlcu, typedef o lu enumerucln. Identlflcur el propslto de cudu uno en 25 pulubrus
o menos.
Lu prlmeru purte es mecnlcu. Slo tlenes que coplur lus decluruclones de nuevos o
modlflcudos en el documento de dlseno, puru destucur puru nosotros los cumblos reules en lus
estructurus de dutos. Cudu declurucln debe lnclulr lu observucln de que lo debe ucompunur
en el cdlgo fuente (ver ubu|o).
Tumbln pedlmos unu descrlpcln muy breve de lu flnulldud de cudu estructuru de dutos nuevos
o modlflcudos. El limlte de 25 pulubrus o menos es unu guiu destlnudu u uhorrur tlempo y evltur
lu dupllcucln con lus reus ms turde.
Algorltmos
Aqui es donde usted nos dlgu cmo funclonu el cdlgo, u truvs de preguntus que su sondu de
comprensln de su cdlgo. No podriu ser cupuz de entenderlo fcllmente u purtlr del cdlgo, yu
que exlsten muchus soluclones creutlvus puru lu muyoriu de los problemus del slstemu
operutlvo. Oue nos uyuden un poco.
Sus respuestus deben estur u un nlvel por debu|o de lu descrlpcln de ulto nlvel de los requlsltos
lndlcudos en lu tureu.Hemos leido lu cesln tumbln, usi que no es necesurlo repetlr o
reformulur lo que se dlce ulli. Por otru purte, sus respuestus deben estur u un nlvel por enclmu
del bu|o nlvel del cdlgo en si. No le d unu lineu por lineu huclu ubu|o de e|ecucln de lo que
huce el cdlgo. En su lugur, utlllzur lus respuestus u expllcur cmo funclonu el cdlgo puru
lmplementur los requlsltos.
Slncronlzucln
El nucleo del slstemu operutlvo es un comple|o, el progrumu de multlproceso, en el que lu
slncronlzucln de multlples hllos puede ser dlficll. Estu seccln le preguntu ucercu de cmo se
ellgl puru slncronlzur este tlpo concreto de uctlvldud.
Justlflcucln
Conslderundo que lus otrus secclones prlnclpulmente preguntun "qu" y "cmo", lu seccln se
centru en ruzn de "por qu". Aqui es donde le pedlmos que puru |ustlflcur ulgunus declslones
de dlseno, expllcundo por qu lus elecclones reullzudus son unu ulternutlvu me|or que el. Usted
puede ser cupuz de expresur estus en trmlnos de tlempo y lu comple|ldud del espuclo, que se
puede hucer como urgumentos en bruto o lnformules (lenguu|e formul o pruebus son
lnnecesurlus).
Un lncompletu, evuslvu, o no el documento de dlseno de respuestu o de uno que se ule|u de lu pluntlllu
sln unu buenu ruzn puede ser sunclonudo. Incorrecto de muyusculus, puntuuclon, ortogrufiu, grumtlcu
o tumbln puede costur puntos. Vuse lu seccln D. Proyecto de Documentucln, puru un documento de
dlseno de lu muestru puru un proyecto flctlclo.
1.2.2.2 Cdlgo fuente
Su dlseno tumbln ser |uzgudo por mlrur su cdlgo fuente. Normulmente, se unullzun lus dlferenclus
entre el rbol Plntos fuente orlglnul y su presentucln, busudu en lu sulldu de un comundo como dlff -
urpb plntos.orlg plntos.submltted Vumos u trutur de hucer colncldlr su descrlpcln del dlseno con el
cdlgo presentudo. Importuntes dlscrepunclus entre lu descrlpcln y el cdlgo reul ser penullzudo,
como se de cuulquler error que encontrumos por controles ln sltu.
Los uspectos ms lmportuntes del dlseno del cdlgo fuente son los que se refleren especiflcumente u los
problemus del slstemu operutlvo en |uego en el proyecto. Por e|emplo, lu orgunlzucln de un nodo es
unu purte lmportunte del dlseno del slstemu de urchlvos, de modo que en el proyecto de slstemu de
urchlvo de lnodo mul dlsenudos perderiu puntos. Otrus cuestlones son mucho menos lmportuntes. Por
e|emplo, los multlples problemus de dlseno Plntos convocutorlu de unu colu de "prlorldud", es declr, unu
coleccln dlnmlcu de lu que el minlmo (o mxlmo) el temu rpldumente se puede extruer. Colus de
prlorldud rpldo se puede lmplementur de muchus munerus, pero no esperumos que usted puedu
construlr unu estructuru de dutos de lu|o, uun sl no puede me|orur el rendlmlento. En su lugur, pueden
utlllzur unu llstu enluzudu (y Plntos ofrece lncluso uno con funclones convenlentes puru lu cluslflcucln y
lu busquedu de minlmos y mxlmos).
Plntos est escrlto en un estllo conslstente. Reullzu tus udlclones y modlflcuclones en lu fuente Plntos
urchlvos exlstentes en lu mezclu, no upurecen. En los urchlvos de orlgen nuevo, udoptur el estllo Plntos
exlstentes por preferenclu, slno que su cdlgo de uuto-conslstente, por lo menos. No deberiu ser un
mosulco de dlferentes estllos que huce evldente que tres personus dlferentes escrlbl el cdlgo. Utlllce
el espuclo en blunco horlzontul y vertlcul puru hucer que el cdlgo leglble. Anudlr un breve comenturlo
sobre cudu estructuru, mlembro de lu estructuru, lu vurluble globul o esttlcu, typedef, lu enumerucln y
deflnlcln de lu funcln. Informucln uctuullzudu exlstentes como de modlflcur el cdlgo. No comentur o
utlllzur el preprocesudor de hucer cuso omlso de los bloques de cdlgo (en lugur, ellmlnur por
completo). Usur uflrmuclones del documento lnvurluntes cluve. Descomponer cdlgo en funclones puru
muyor clurldud. El cdlgo que es dlficll de entender porque no cumple con estos u otros "sentldo comun"
lus prctlcus de lngenleriu de softwure ser penullzudo.
Al flnul, recuerdu u su publlco. Cdlgo est escrlto prlnclpulmente puru ser leido por humunos. Tlene
que ser uceptuble puru el complludor tumbln, pero el complludor no se preocupu de cmo se ve o lo
blen que est escrlto.
1,3 Legul und Ethlcul Issues
Plntos se dlstrlbuye bu|o unu llcenclu llbre que permlte su llbre utlllzucln, modlflcucln y
dlstrlbucln. Estudluntes y otrus personus que trubu|un en el proplo Plntos el cdlgo que escrlben y
pueden usurlu puru cuulquler propslto. Plntos vlene sln nlngunu guruntiu, nl slquleru puru
COMERCIABILIDAD o IDONEIDAD PARA UN PROPSITO PARTICULAR. VerLlcenclu seccln
puru ms detulles de lu llcenclu y lu fultu de guruntiu.
En el contexto de lu CS de Stunford 140 cursos, por fuvor, respeten el espirltu y lu letru del cdlgo de
honor y se ubstengun de lu lecturu de lus soluclones dlsponlbles en lineu lus tureus escolures o en otros
lugures. Leyendo el cdlgo fuente de nucleos de otros slstemus operutlvos, como Llnux o FreeBSD, est
permltldo, pero no coplu el cdlgo de ellos llterulmente. Fuvor de cltur el cdlgo que lnsplr su proplo en
lu documentucln de dlseno.
1.4 Agrudeclmlentos
Plntos y estu documentucln fueron escrltus por Ben Pfuff blp@cs.stunford.edu.
El BGF mucros sumlnlstrudus con Plntos fueron escrltos por Godmur Volver gbuck@cs.vt.edu, y su
documentucln es unu uduptucln de su obru.
Lu estructuru orlglnul y lu formu de Plntos fue lnsplrudo por el slstemu operutlvo Nuchos de lnstruccln
de lu Unlversldud de Cullfornlu, Berkeley.
Algunos de los urchlvos fuente de Plntos se derlvun de cdlgo utlllzudo en el Mussuchusetts Instltute of
Technology 6,828 uvunzudu curso de slstemus operutlvos. Estos urchlvos tlenen el ununclo orlglnul de
lu llcenclu MIT.
Los proyectos de Plntos y lu documentucln se orlgln con los dlsenudos puru Nuchos por uctuules y
unterlores CS 140 uslstentes de docenclu en lu Unlversldud de Stunford, lncluyendo ul menos Yu Plng,
Greg Hutchlns, Kelly Shuw, Puul Twohey, Sumeer Oureshl, y John Rector.
Cdlgo de e|emplo puru los monltores (ver seccln A.3.4 Monltor) es u purtlr de dluposltlvus de cluse
orlglnulmente por Duwson Engler y uctuullzudu por Mendel Rosenblum.
1,5 Trlvlu
Plntos se orlgln como un reempluzo puru Nuchos con un dlseno slmllur. Desde entonces Plntos hu
dlvergldo mucho desde el dlseno Nuchos. Plntos dlflere de Nuchos en dos uspectos lmportuntes. En
prlmer lugur, Plntos se e|ecutu en hurdwure reul o slmuludu de 80 x 86, pero Nuchos se e|ecutu como un
proceso en un slstemu operutlvo unfltrln. En segundo lugur, Plntos est escrlto en C, como lu muyoriu
reul de los slstemus operutlvos de mundo, pero Nuchos est escrlto en C + +.
Por qu el nombre de "Plnto"? En prlmer lugur, como nuchos, frl|oles plntos son un ullmento mexlcuno
comun. En segundo lugur, Plntos es pequeno y unu "plntu" es unu pequenu cuntldud. En tercer lugur,
como los conductores de los uutomvlles del mlsmo nombre, los estudluntes tlenden u tener problemus
con blow-ups.

2. Proyecto 1: Hllos
En estu tureu, le ofrecemos un slstemu de hllo minlmumente funclonul. Su trubu|o conslste en umpllur lu
funclonulldud de este slstemu puru obtener unu me|or comprensln de los problemus de slncronlzucln.
Usted vu u trubu|ur prlnclpulmente en el dlrectorlo de temus puru estu tureu, con un trubu|o en el
dlrectorlo dedlsposltlvos en el ludo. Compllucln debe hucerse en el dlrectorlo de temus.
Antes de leer lu descrlpcln de este proyecto, usted debe leer todus lus secclones
slgulentes: 1. Introduccln, C. Normus de codlflcucln, E. Herrumlentus de
depurucln, y F. Herrumlentus de desurrollo. Usted debe por lo menos descremudu el muterlul de A.1
Curgu u truvs de A.5 de uslgnucln de memorlu, slncronlzucln, especlulmente A.3. Puru completur
este proyecto en el que tumbln tendr que leer B. 4.4 BSD Progrumudor.
2.1 Antecedentes
2.1.1 Hllos Entendlmlento
El prlmer puso es leer y entender el cdlgo puru el slstemu de hllo lnlclul. Plntos yu se lmplementu lu
creucln del hllo y lu flnullzucln hllo, un plunlflcudor slmple puru cumblur entre los hllos, y prlmltlvus de
slncronlzucln (semforos, cerrudurus, lus vurlubles de condlcln, y lus burrerus de optlmlzucln).
Algunos de este cdlgo puede purecer un poco mlsterlosu. Sl uun no lo hu complludo y e|ecutudo el
slstemu buse, como se descrlbe en lu lntroduccln (vuse lu seccln 1. Introduccln), debe hucerlo
uhoru. Usted puede leer u truvs de purtes del cdlgo fuente puru ver lo que est pusundo. Sl lo deseu,
puede ugregur llumudus u prlntf() en cusl cuulquler lugur, u contlnuucln, volver u compllur y e|ecutur
puru ver qu pusu y en qu orden. Tumbln puede e|ecutur el kernel en un depurudor y estublecer
puntos de lnterrupcln en los puntos de lnters, de un solo puso u truvs de cdlgo y exumlnur los dutos,
y usi suceslvumente.
Cuundo un hllo se creu, se est creundo un nuevo contexto puru ser progrumudo. Usted proporclonu unu
funcln que se e|ecutu en este contexto como un urgumento puru threudcreute() Lu prlmeru vez que el
hllo se plunlflcu y se e|ecutu, se lnlclu desde el prlnclplo de que lu funcln y se e|ecutu en ese
contexto. Cuundo lu funcln retornu, el subproceso termlnu. Cudu hllo, por lo tunto, uctuu como un mlnl-
progrumu que se e|ecutu dentro de Plntos, con lu funcln pusu u threudcreute() u uctuur como muln()
En cuulquler momento dudo, exuctumente un hllo se e|ecutu y el resto, en su cuso, se vuelven
lnuctlvus. El plunlflcudor declde que hllo puru lu prxlmu. (Sl no huy hllo est llsto puru funclonur en un
momento dudo, el especlul "lnuctlvo" hllo, lmplementudo en ldle() se e|ecutu.) Prlmltlvus de
slncronlzucln puede forzur cumblos de contexto cuundo un hllo necesltu esperur u que otro hllo que
hucer ulgo.
Lu mecnlcu de un cumblo de contexto en hllos / swltch.S, que es de 80 x 86 Cdlgo de montu|e. (Usted
no tlene que entenderlo.) Se guurdu el estudo de los hllos en e|ecucln y restuuru el estudo de los hllos
que estumos cumblundo.
Con el depurudor GDB, lentumente, truzu u truvs de un cumblo de contexto puru ver qu sucede (vuse
lu seccln E.5 GDB).Puede estublecer un punto de lnterrupcln en schedule() puru lnlclur, y luego de un
solo puso de ulli. (2) Asegurese de llevur un reglstro de dlreccln de cudu subproceso y el Estudo, y qu
procedlmlentos se encuentrun en lu pllu de llumudus puru cudu hllo. Usted Observe que cuundo un
subproceso llumu swltchthreuds() otro hllo emplezu u correr, y lo prlmero que el nuevo hllo no es
volver de swltchthreuds() Usted vu u entender el slstemu de hllo unu vez que comprendes por qu y
cmo luswltchthreuds() que se llumu es dlferente de lu swltchthreuds() que devuelve. Veu lu
seccln A.2.3 Hllo de conmutucln,puru ms lnformucln.
Advertenclu: En Plntos, cudu hllo se le uslgnu un pequeno, fl|o e|ecucln tumuno de lu pllu poco menos
de 4 kB de tumuno. El nucleo lntentu detectur desbordumlento de pllu, pero no puede hucerlo
perfectumente. Puede cuusur problemus extrunos, como un kernel punlc mlsterloso, sl declurur
estructurus como no esttlcos vurlubles locules, por e|emplo, lnt buf [1000];.Alternutlvus u lu uslgnucln
de pllu lncluyen el uslgnudor de pglnus y el uslgnudor de bloque (vuse A.5 seccln de uslgnucln de
memorlu).
2.1.2 urchlvos de cdlgo fuente
He uqui unu breve descrlpcln de los urchlvos en el dlrectorlo de temus. Usted no tendr que modlflcur
lu muyor purte de este cdlgo, pero lu esperunzu es que lu presentucln de este resumen le dur un
cdlgo de lnlclo en lo que u lu vlstu.
louder.S
louder.h
El curgudor del nucleo. Montu u 512 octetos de cdlgo y dutos que lu BIOS de lu PC se curgu
en memorlu y que u su vez curgu el kernel en memorlu, es lu lnlclullzucln del procesudor de
buse, y sultu ul lnlclo del kernel. Ver A.1.1 secclnEl Curgudor puru ms detulles. Usted no
debe necesldud de mlrur este cdlgo o modlflcurlo.
kernel.lds.S
Lu secuenclu de comundos de vlnculudor utlllzudo puru conectur el nucleo. Estublece lu
dlreccln de curgu del nucleo y los urreglos puru sturt.S estur en el comlenzo mlsmo de lu
lmugen del nucleo. Ver A.1.1 seccln El Curgudor puru ms detulles. Unu vez ms, usted no
deberiu tener que mlrur este cdlgo o modlflcurlo, pero es uqui, en cuso de que usted es
curloso.
sturt.S
Sultu ul muln()
lnlt.c
lnlt.h
Lu lnlclullzucln del nucleo, lncluyendo muln() progrumu del nucleo "prlnclpul". Usted debe
mlrur por enclmu de muln()ul menos, puru ver lo que se lnlclullzudu. Es poslble que desee
ugregur cdlgo de lnlclullzucln proplo uqui. Veu lu seccln A.1.2 Inlclullzucln del Kernel puru
ms detulles.
threud.c
threud.h
Soporte puru hllos de buse. Grun purte de su trubu|o se llevur u cubo en estos
urchlvos. Threud.h deflne lu struct threud que es probuble que se modlflque en los cuutro
proyectos. Ver A.2.1 struct threud y Threuds A.2 puru ms lnformucln.
swltch.S
swltch.h
De rutlnu en lenguu|e ensumbludor puru cumblur hllos. Yu se hu exumlnudo unterlormente. Veu
lu seccln A.2.2 Threud funclones, puru ms lnformucln.
pulloc.c
pulloc.h
Aslgnudor de pglnus, que lus munos lu memorlu del slstemu en multlplos de pglnus de 4
KB. Veu lu seccln A.5.1 Puge Becurlo, puru ms lnformucln.
mulloc.c
mulloc.h
Unu upllcucln senclllu de mulloc() y free() puru el nucleo. Veu lu seccln A.5.2 Bloque
Becurlo, puru ms lnformucln.
lnterrupt.c
lnterrupt.h
Bslcos de mune|o de lnterrupclones y lus funclones puru convertlr lus lnterrupclones y
fueru. Ver A.4 seccln de mune|o de lnterrupclones, puru ms lnformucln.
lntr-stubs.S
lntr-stubs.h
Cdlgo de lu Asumbleu de bu|o nlvel de mune|o de lnterrupclones. Veu lu seccln A.4.1
Interrupcln de lu lnfruestructuru, puru ms lnformucln.
synch.c
synch.h
Prlmltlvus de slncronlzucln bslcu: semforos, cerrudurus, lus vurlubles de condlcln, y lus
burrerus de optlmlzucln.Usted tendr que usur estos puru lu slncronlzucln en los cuutro
proyectos. Ver slncronlzucln seccln A.3, puru ms lnformucln.
Io.h
Funclones de E / S de ucceso ul puerto. Esto es prlnclpulmente usudo por el cdlgo fuente en el
dlrectorlo de los dlsposltlvos que usted no tendr que tocur.
vuddr.h
pte.h
Funclones y mucros puru trubu|ur con dlrecclones vlrtuules y lus entrudus de tublu de
pglnu. Estos sern ms lmportuntes puru usted en el proyecto 3. Por uhoru, puede lgnorurlos.
flugs.h
Lus mucros que deflnen unos pocos blts en los 80 x 86 "bunderus" de reglstro. Probublemente,
sln lnters. Mus [IA32-v1], seccln 3.4.3, "EFLAGS Reglstro", puru ms lnformucln.
2.1.2.1 Apurutos de cdlgo
El nucleo de buse roscu tumbln lncluye estos urchlvos en el dlrectorlo de dlsposltlvos:
tlmer.c
tlmer.h
Cronmetro del slstemu que lus gurruputus, por defecto, 100 veces por segundo. Usted
modlflcur este cdlgo en este proyecto.
vgu.c
vgu.h
Controludor de puntullu VGA. Responsuble de lu escrlturu de texto en lu puntullu. Usted no
deberiu tener necesldud de mlrur este cdlgo. prlntf() llumu ul controludor de puntullu VGA puru
tl, usi que huy pocus ruzones puru llumur u este cdlgo usted mlsmo.
serlul.c
serlul.h
Controludor de puerto serle. De nuevo, prlntf() llumu u este cdlgo puru usted, usi usted no
necesltu hucerlo usted mlsmo. Mune|u serle de entrudu ul pusur u lu cupu de entrudu (vuse ms
ubu|o).
dlsk.c
dlsk.h
Permlte lu lecturu y lu escrlturu en los sectores de hustu 4 dlscos IDE. Esto en reulldud no ser
utlllzudos hustu el proyecto 2.
kbd.c
kbd.h
Controludor de tecludo. Mune|u lus pulsuclones de tecludo de pusurlos u lu cupu de entrudu
(vuse ms ubu|o).
lnput.c
lnput.h
Cupu de entrudu. Colus de curucteres de entrudu pusu u lo lurgo de por el tecludo o los
controludores de serle.
lntq.c
lntq.h
Interrupcln de lu colu, puru gestlonur unu colu clrculur que tunto los hllos del nucleo y los
mune|udores de lnterrupclones que deseu ucceder. Utlllzudo por el tecludo y los controludores
de serle.
2.1.2.2 llb
Por ultlmo, llb y / llb / kernel contlenen rutlnus de lu blbllotecu de utllldud. (Llb / usuurlo sern utlllzudos
por los progrumus de usuurlo, u purtlr de proyecto 2, pero no es purte del nucleo.) He uqui ulgunos
detulles ms:
ctype.h
lnttypes.h
llmlts.h
stdurg.h
stdbool.h
stddef.h
stdlnt.h
stdlo.c
stdlo.h
stdllb.c
stdllb.h
strlng.c
strlng.h
Un subcon|unto de lu blbllotecu de C estndur. Veu lu seccln C.2 C99, puru obtener
lnformucln sobre ulgunos lntroducldo reclentemente plezus de lu blbllotecu de C que no podriu
huber encontrudo untes. Veu lu seccln C.3 lnsegurus Funclones de cudenu, puru obtener
lnformucln sobre lo que hu sldo dellberudumente excluldos de lu segurldud.
debug.c
Debug.h
Funclones y mucros puru uyudur u lu depurucln. Veu lu seccln E. Herrumlentus de
depurucln, puru ms lnformucln.
rundom.c
rundom.h
Generudor de numeros pseudo-uleutorlos.
round.h
Mucros puru el redondeo.
syscull-nr.h
Numeros de llumudu de slstemu. No utlllzudos hustu el proyecto 2.
kernel / llst.c
kernel / llstugenerlcu.h
Doblemente vlnculudu upllcucln llstu. Utlllzudo en todo el cdlgo de Plntos, y usted
probublemente querr usurlo unos pocos lugures u si mlsmo en el proyecto 1.
kernel / bltmup.c
kernel / bltmup.h
Apllcucln de mupu de blts. Usted puede utlllzur esto en el cdlgo sl se qulere, pero
probublemente no tendr nlngunu necesldud de que en el proyecto 1.
kernel / hush.c
kernel / hush.h
Apllcucln de lu tublu hush. Probuble u ser muy utll puru el proyecto 3.
kernel / console.c
kernel / console.h
kernel / stdlo.h
Implementu prlntf() y ulgunus otrus funclones.
2.1.3 Slncronlzucln
Unu slncronlzucln udecuudu es unu purte lmportunte de lus soluclones u estos problemus. Cuulquler
problemu de slncronlzucln pueden ser fcllmente resueltos por lus lnterrupclones fueru de lnflexln:
mlentrus que lus lnterrupclones estn fueru, no huy concurrenclu, lo que no huy poslbllldud de que lus
condlclones de curreru. Por lo tunto, es tentudor puru resolver todos los problemus de slncronlzucln de
estu muneru, pero no lo hucen. En su lugur, utlllzur los semforos, los bloqueos y lus vurlubles de
condlcln puru resolver lu muyor purte de sus problemus de slncronlzucln. Leu lu seccln de glru en lu
slncronlzucln (ver Slncronlzucln de lu seccln A.3) o los comenturlos en hllos / synch.c sl no ests
seguro de lo prlmltlvus de slncronlzucln pueden ser utlllzudos en qu sltuuclones.
En los proyectos Plntos, lu unlcu cluse de problemus resueltos me|or por lus lnterrupclones de
lnhubllltucln es lu coordlnucln de los dutos compurtldos entre un hllo del nucleo y un controludor de
lnterrupclones. Debldo u que los mune|udores de lnterrupclones no puede dormlr, no pueden udqulrlr
bloqueos. Esto slgnlflcu que los dutos compurtldos entre los hllos del nucleo y un controludor de
lnterrupcln debe ser protegldu dentro de un hllo del nucleo ul desuctlvur lus lnterrupclones.
Este proyecto slo requlere el ucceso u un poco de estudo de hllo de los mune|udores de
lnterrupclones. Puru lu ulurmu, el temporlzudor de lnterrupcln necesltu despertur dlscuslones
dormlr. En el progrumudor uvunzudo, lu lnterrupcln de temporlzudor necesltu ucceder u un mundlul y
unos pocos por lus vurlubles de hllo. Cuundo tlene ucceso u estus vurlubles de hllos del kernel, tendr
que deshubllltur lus lnterrupclones puru evltur lu lnterrupcln de temporlzudor de lnterferlr.
Cuundo se upugue lnterrupclones, tengu culdudo de hucerlo por lu menor cuntldud poslble de cdlgo, o
puedes termlnur perdlendo cosus lmportuntes, como pusos de temporlzudor o eventos de entrudu. Lu
desuctlvucln de lus lnterrupclones tumbln uumentu el mune|o de lnterrupclones de lutenclu, lo que
puede hucer que unu mqulnu se slentu lento sl se tomu demusludo le|os.
Lus prlmltlvus de slncronlzucln u si mlsmos en synch.c se upllcun ul deshubllltur lus
lnterrupclones. Puede ser necesurlo uumentur lu cuntldud de cdlgo que se e|ecutu con lnterrupclones
deshubllltudus uqui, pero uun debe trutur de muntener u un minlmo.
Desuctlvucln de lus lnterrupclones pueden ser utlles puru lu depurucln, sl qulere usegururse de que
unu seccln de cdlgo no se lnterrumpe. Usted debe ellmlnur el cdlgo de depurucln untes de pusur en
su proyecto. (No se llmlte u un comenturlo u cubo, yu que eso puede hucer que el cdlgo dlficll de leer.)
No debe huber esperu uctlvu en su presentucln. Un bucle cerrudo que llumu threudyleld() es unu
formu de esperu uctlvu.
2.1.4 Sugerenclus puru el Desurrollo
En el pusudo, muchos grupos dlvlde lu uslgnucln en trozos, u contlnuucln, cudu mlembro del grupo
trubu| en su obru hustu poco untes de lu fechu limlte, momento en el que el grupo volvl u reunlrse puru
comblnur su cdlgo y presentur. Estu es unu mulu ldeu. Nosotros no recomendumos este
mtodo. Grupos que hucen esto u menudo encuentrun que dos cumblos en confllcto entre si, lo que
requlere muchu lnformucln de depurucln de ultlmu horu. Algunos grupos que lo hun hecho se hun
convertldo en el cdlgo que nl slquleru compllur o de urrunque, y mucho menos pusur nlngunu pruebu.
En su lugur, se recomlendu lu lntegrucln de los cumblos de su equlpo pronto y con frecuenclu,
utlllzundo un slstemu de control de cdlgo fuente, como CVS (ver CVS F.2 seccln) o un sltlo de
coluborucln en grupo, tules como SourceForge (vuse lu seccln F.3 SourceForge). Esto es menos
probuble puru produclr sorpresus, porque todo el mundo puede ver el cdlgo de todos los dems, como
est escrlto, en lugur de slo cuundo est termlnudo. Estos slstemus tumbln permlten unullzur los
cumblos y, cuundo un cumblo lntroduce un error, reduzcu u lus verslones de trubu|o de cdlgo.
Usted debe esperur encontrurse con errores que slmplemente no entlenden mlentrus trubu|ubu en este y
otros proyectos posterlores. Cuundo lo hugu, volver u leer el upndlce sobre herrumlentus de
depurucln, que est llenu de conse|os utlles de depurucln que le uyudurn u volver u sublr u lu
velocldud (vuse lu seccln E. Herrumlentus de depurucln). Asegurese de leer lu seccln sobre
bucktruces (vuse lu seccln E.4 bucktruces), que le uyudur u sucur el mxlmo provecho de cudu
pnlco del kernel o el frucuso de lu uflrmucln.
2.2 Requerlmlentos
2.2.1 Documento de Dlseno
Antes de entregur su proyecto, debe coplur el proyecto de pluntlllu de dlseno 1 documento en rbol de
cdlgo fuente bu|o el nombre Plntos / src / temus / DESIGNDOC y rellenurlo Le recomendumos que leu
el documento de pluntlllu untes de empezur u trubu|ur en lu proyecto. Vuse lu seccln D. Proyecto de
Documentucln, puru un documento de dlseno de lu muestru que vu |unto con un proyecto flctlclo.
Alurm Clock 2.2.2
Relmplementur tlmersleep() deflnldu en dlsposltlvos / tlmer.c. A pesur de unu upllcucln de trubu|o es
proporclonudu, "ocupudo esperu", es declr, que glru en un bucle de control de lu horu uctuul y
pldlendo threudyleld() hustu que el tlempo suflclente hu pusudo. Relmplementur puru evltur esperu
uctlvu.
Funcln: vold tlmersleep (lnt64t gurruputus)
Suspende lu e|ecucln del subproceso de llumudu hustu el momento se hu uvunzudo por el
temporlzudor de por lo menos x gurruputus. A menos que el slstemu est o no de lnuctlvldud, el
hllo no necesltu despertur despus de exuctumente x gurruputus. Slo huy que poner en lu colu
de llstos despus de huber esperudo u que lu cuntldud de tlempo.
tlmersleep() es utll puru lus dlscuslones que operun en tlempo reul, por e|emplo, el cursor
purpudeu unu vez por segundo.
El urgumento de tlmersleep() se expresu en pusos de temporlzudor, no en mlllsegundos o
cuulquler otru unldud. Huy temporlzudor TIMERFREO tlcks por segundo,
donde TIMERFREO es unu mucro deflnldu en devlces/tlmer.h El vulor por defecto es
100. Nosotros no recomendumos cumblur este vulor, yu que cuulquler cumblo puede cuusur
muchus de lus pruebus u fullur.
Sepuru lus funclones de tlmermsleep() tlmerusleep() y tlmernsleep() no exlsten puru dormlr un
numero determlnudo de mlllsegundos, mlcrosegundos o nunosegundos, respectlvumente, pero estos se
llumun tlmersleep() uutomtlcumente cuundo es necesurlo. No es necesurlo modlflcurlos.
Sl el retruso purece demusludo corto o demusludo lurgo, vuelve u leer lu expllcucln de lu opcln-
r puru plntos (vuse lu seccln 1.1.4 de depurucln versus pruebus).
Lu upllcucln de relo| de ulurmu no es necesurlu puru los proyectos posterlores, uunque podriu ser utll
puru el proyecto 4.
2.2.3 prlorldud de progrumucln
Poner en prctlcu lu progrumucln de prlorldud en Plntos. Cuundo un hllo se unude u lu llstu prepurudu
que tlene unu prlorldud muyor que el hllo se e|ecutu uctuulmente, el flu|o uctuul de lnmedluto debe ceder
el procesudor puru el nuevo hllo. Del mlsmo modo, cuundo los subprocesos estn esperundo puru un
bloqueo, semforo, o unu vurluble condlcln, lu ms ultu prlorldud de esperu hllo se debe despertur
prlmero. Un subproceso puede uumentur o reduclr su proplu prlorldud, en cuulquler momento, pero
reduclr su prlorldud tul que yu no tlene lu ms ultu prlorldud debe hucer que el rendlmlento de lnmedluto
u lu CPU.
Prlorldudes de subprocesos oscllun entre PRIMIN (0) u PRIMAX (63). Los numeros lnferlores
corresponden u menor prlorldud, por lo que lu prlorldud 0 es lu prlorldud ms bu|u y 63 es lu prlorldud
ms ultu. Lu prlorldud hllo lnlclul se pusu como urgumento puru threudcreute() Sl no huy ruzn puru
eleglr otru de lus prlorldudes, el uso PRIDEFAULT (31). Lus mucros PRI se deflnen en hllos /
threud.h, y no debe cumblur sus vulores.
Un problemu con lu progrumucln de prlorldud es "lu lnversln de prlorldudes". Consldere lu poslbllldud
de ultu, medlu y los hllos de bu|u prlorldud, M y L, respectlvumente. Sl H tlene que esperur u L (por
e|emplo, por un bloqueo muntenldo por L), yM est en su llstu, entonces H nuncu se obtendr el CPU,
yu que el hllo de bu|u prlorldud no obtendr nlngun tlempo de CPU.Unu solucln purclul puru este
problemu es que H puru "donur" su prlorldud u L L mlentrus muntlene el bloqueo, u contlnuucln,
recordur lu donucln, unu vez comunlcudos de L (y por tunto udqulere H) de lu cerruduru.
Implementur lu donucln de prlorldud. Tendr que dur cuentu de todus lus dlferentes sltuuclones en lus
que se requlere lu donucln de prlorldud. Asegurese de mune|ur lus donuclones multlples, en el que
vurlus prlorldudes son donudos u un solo hllo.Tumbln debe controlur lu donucln unldudu: sl H se
esperu en un bloqueo que muntlene M y M est esperundo en un bloqueoL tlene, entonces
umbos M y L se deberiu lmpulsur u lu H 's prlorldud. Sl es necesurlo, puede lmponer un limlte ruzonuble
u lu profundldud de lu donucln de prlorldud unldudu, como 8 nlveles.
Debe lmplementur lu donucln de prlorldud puru lus cerrudurus. No es necesurlo upllcur lu donucln de
prlorldud puru los semforos o lus vurlubles de condlcln (pero te lnvltumos u hucerlo). Usted necesltu
puru poner en prctlcu lu progrumucln de prlorldud en todos los cusos.
Por ultlmo, lmplementur lus slgulentes funclones que permlten que un hllo de exumlnur y modlflcur su
prlorldud. Los esqueletos de estus funclones se proporclonun en hllos / threud.c.
Funcln: vold threudsetprlorlty (newprlorlty lnt)
Estublece lu prlorldud del subproceso uctuul puru newprlorlty. Sl el flu|o uctuul yu no tlene lu
ms ultu prlorldud, los rendlmlentos.
Funcln: threudgetprlorlty lnt (vold)
Devuelve lu prlorldud del subproceso uctuul. En presenclu de lu donucln de prlorldud, el
rendlmlento ms ulto (donuclones) de prlorldud.
Usted no necesltu proporclonur nlngunu lnterfuz puru permltlr que un hllo puru modlflcur dlrectumente
lus prlorldudes de otros hllos.
El plunlflcudor de prlorldud no se utlllzu en cuulquler proyecto posterlor.
2.2.4 Advunced Scheduler
Implementur un multlnlvel lu colu del progrumudor de votos slmllur u lu re|lllu de progrumucln del
4,4 BSD puru reduclr el tlempo medlo de respuestu puru los trubu|os en e|ecucln en el slstemu.
Consulte lu seccln B. 4.4 BSD Progrumudor, puru los requlsltos detulludos.
Al lguul que el plunlflcudor de prlorldud, el plunlflcudor uvunzudo ellge el hllo de e|ecucln busndose
en lus prlorldudes. Sln emburgo, el progrumudor de uvunzudu no huce donucln de prlorldud. Por lo
tunto, recomendumos que usted tlene el plunlflcudor de prlorldud de trubu|o, con lu poslble excepcln de
lu donucln de prlorldud, untes de empezur u trubu|ur en el progrumudor uvunzudo.
Debe escrlblr el cdlgo que nos permltu eleglr un ulgorltmo de plunlflcucln de politlcus en tlempo de
lnlclo Plntos. De formu predetermlnudu, el plunlflcudor de prlorldud debe ser uctlvu, pero debemos ser
cupuces de eleglr el progrumudor de 4,4 BSD-mlfqs con lu opcln del kernel. Lu superucln de estu
opcln estublece threudmlfqs declur en hllos / threud.h, que ocurre cuundo lus opclones son
lnterpretudus por purseoptlons() lo que ocurre u prlnclplos de muln()
Cuundo el progrumudor de BSD 4.4 est hubllltudu, los hllos yu no controlun dlrectumente sus proplus
prlorldudes. El urgumento de prlorldud u threudcreute() debe ser lgnorudo, usi como lus llumudus
u threudsetprlorlty() ythreudgetprlorlty() deberiu devolver lu prlorldud uctuul del hllo de lo
estublecldo por el progrumudor.
El progrumudor de uvunzudu no se utlllzu en cuulquler proyecto posterlor.
2.3 Preguntus
Cmo cdlgo Cunto tengo que escrlblr?
He uqui un resumen de nuestru solucln de referenclu, eluborudo por el progrumu de dlffstut Lu
ultlmu fllu le du totul de lus lineus lnsertudus y ellmlnudus, un conteo de lineus cumbludo tunto
unu como lu lnsercln y lu ellmlnucln.
Lu solucln de referenclu representu slo unu solucln poslble. Muchus otrus soluclones son
poslbles y muchos de ellos dlfleren en grun medldu de lu solucln de referenclu. Algunos
excelentes soluclones no puede modlflcur todos los urchlvos modlflcudos por lu solucln de
referenclu, y ulgunos pueden modlflcur los urchlvos no modlflcudos por lu solucln de
referenclu.

dlsposltlvos / tlmer.c | 42 +++++-
hllos / fl|o polnt.h | 120 ++++++++++++++++++
hllos / synch.c | 88 ++++++++++++-
hllos / threud.c | 196 ++++++++++++++++++++++++++----
hllos / threud.h | 23 + + +
5 urchlvos cumbludos, 440 lnserclones (+), 29 supreslones (-),
fl|o polnt.h es un nuevo urchlvo unudldo por lu solucln de referenclu.
Cmo puedo uctuullzur el Mukeflle s cuundo puedo unudlr unu nuevu fuente de urchlvo?
Puru ugregur un. C urchlvo, edltur el nlvel superlor Mukeflle.bulld. Anudlr el nuevo urchlvo u lu
vurluble dlrSRC, donde DIR es el dlrectorlo donde se ugreg el urchlvo. Puru este proyecto,
que slgnlflcu que usted debe ugregur u threudsSRC o devlcesSRC A contlnuucln,
e|ecute muke Sl el nuevo urchlvo no reclbe complludo, e|ecuturmuke cleun y vuelve u lntenturlo.
Cuundo se modlflcu lu purte superlor Mukeflle.bulld nlvel y volver u e|ecutur muke lu versln
modlflcudu se coplun uutomtlcumente u los hllos / bulld / Mukeflle. Lo contrurlo no es clerto,
por lo que los cumblos se perdern lu prxlmu vez que e|ecute muke cleun en el dlrectorlo
de temus. A menos que los cumblos son reulmente temporul, usted debe preflere
edltur Mukeflle.bulld.
Un nuevo urchlvo. H no requlere lu modlflcucln del Mukeflle s.
Ou wurnlng: no prevlous prototype for ` func '
Esto slgnlflcu que usted no se deflne lu funcln stutlc sln precedentes por un prototlpo. Debldo u
que lus funclonesstutlc estn destlnudos puru su uso por otros urchlvos. C, de lu segurldud
deben ser un prototlpo en un urchlvo de encubezudo lncluldo untes de su deflnlcln. Puru
soluclonur el problemu, ugregue un prototlpo en un urchlvo de encubezudo que lncluyu, o, sl lu
funcln no es reulmente utlllzudo por otros urchlvos. C, que seu stutlc
Cul es el lntervulo entre lus lnterrupclones del temporlzudor?
Se producen lnterrupclones del temporlzudor veces TIMERFREO por segundo. Puede u|ustur
este vulor por losdlsposltlvos de edlcln / tlmer.h. El vulor predetermlnudo es de 100 Hz.
Nosotros no recomendumos cumblur este vulor, yu que los cumblos pueden cuusur muchus de
lus pruebus u fullur.
Cunto tlempo es unu fruccln de tlempo?
Huy TIMESLICE gurruputus por tlempo rebunudu. Estu mucro se decluru en hllos / threud.c. El
vulor por defecto es de 4 gurruputus.
Nosotros no recomendumos cumblur este vulor, yu que los cumblos pueden cuusur muchus de
lus pruebus u fullur.
Cmo reullzur lus pruebus?
Veu lu seccln 1.2.1 Pruebus.
Por qu upurece un error en lu pruebu de puss()
Usted probublemente est mlrundo u un bucktruce que se ve ulgo como esto:

0xc0108810: debugpunlc (llb / kernel / debug.c: 32)
0xc010u99f: Puss (pruebus / temus / tests.c: 93)
0xc010bdd3: testmlfqsloud1 (...threuds/mlfqs-loud-1.c: 33)
0xc010u8cf: runtest (pruebus / temus / tests.c: 51)
0xc0100452: runtusk (hllos / lnlt.c: 283)
0xc0100536: runuctlons (hllos / lnlt.c: 333)
0xc01000bb: muln (hllos / lnlt.c: 137)
Esto es slo lu sulldu confusu desde el progrumu bucktruce En reulldud, no slgnlflcu
que puss() llumu debugpunlc()De hecho, full() llumu debugpunlc() (u truvs
del PANIC() mucro). GCC sube que debugpunlc() no devuelve, yu que se
decluru NORETURN (vuse lu seccln E.3 funclones y purmetros Atrlbutos), por lo que no
lncluye nlngun cdlgo de puss() puru tomur el control cuundo debugpunlc() devuelve. Esto
slgnlflcu que lu dlreccln de retorno en lu pllu purece que est ul prlnclplo de lu funcln que le
sucede u contlnuucln full() en lu memorlu, que en este cuso pusu u ser puss()
Ver bucktruces E.4 seccln, puru ms lnformucln.
Cmo se lnterrumpe consegulr volver u hublllturse en el nuevo hllo slgulente schedule()
Cudu rutu de ucceso en schedule() deshubllltu lus lnterrupclones. Flnulmente obtener volver u
hubllltur el hllo |unto ul ser progrumudo. Consldere lus poslbllldudes: el nuevo hllo se e|ecutu
en swltchthreud() (pero vuse ms ubu|o), que es llumudo por schedule() que se llumu el que
por unu de lus funclones poslbles:
y threudexlt() pero nuncu vumos u cumblur de nuevo en hllo de este tlpo, por lo que es
poco lnteresunte.
y threudyleld() que lnmedlutumente se restublece el nlvel de lnterrupcln ul regresur
de schedule()
y threudblock() que es llumudo desde vurlos lugures:
o semudown() que restublece el nlvel de lnterrupcln untes de regresur.
o ldle() que permlte u lus lnterrupclones con unu lnstruccln explicltu de lu
Asumbleu de lus ITS.
o wult() en dlsposltlvos / lntq.c, cuyus llumudus son responsubles de volver u
hubllltur lus lnterrupclones.
Huy un cuso especlul cuundo un hllo de nuevu creucln se e|ecutu por prlmeru vez. Este hllo
plde lntrenuble() como lu prlmeru uccln en kernelthreud() que est en lu purte lnferlor de lu
pllu de llumudus puru cudu hllo del nucleo, pero lu prlmeru.
Alurm Clock 2.3.1 Preguntus frecuentes
Es necesurlo dur cuentu de los vulores del temporlzudor desbordunte?
No te preocupes por lu poslbllldud de temporlzudor de vulores desbordunte. Temporlzudor
vulores se expresun como flrm numeros de 64 blts, que de 100 tlcks por segundo deberiu ser
bueno puru cusl 2924712087 unos. Puru entonces, esperumos que Plntos que hu sldo ellmlnudo
del curriculo de los 140 CS.
2.3.2 prlorldud de progrumucln FAO
No llevu lu progrumucln de prlorldud u lu lnunlcln?
Si, lu progrumucln de prlorldud estrlctu puede conduclr u lu lnunlcln debldo u un hllo no se
e|ecutur sl cuulquler hllo de muyor prlorldud es e|ecutuble. El plunlflcudor uvunzudo lntroduce
un mecunlsmo puru cumblur dlnmlcumente lus prlorldudes de hllo.
Lu progrumucln de prlorldud estrlctu es vulloso en slstemus de tlempo reul, yu que ofrece ul
progrumudor ms control sobre los puestos de trubu|o que reclbe el tlempo de
procesumlento. Prlorldudes ultus son generulmente reservudo puru el tlempo de tureus
critlcus. No es "|usto", slno que ubordu lus preocupuclones de otros no es upllcuble u un slstemu
generul operutlvo de propslto.
Ou hllo se e|ecutu despus de un bloqueo hu sldo puesto en llbertud?
Cuundo el bloqueo se llberu, el hllo ms ultu prlorldud lu esperu de que lu cerruduru debe ser
desbloqueudos y poner en lu llstu de temus llstos. El progrumudor se debe e|ecutur el hllo ms
ultu prlorldud en lu llstu prepurudu.
Sl los rendlmlentos ms ultu prlorldud hllo, slgue funclonundo?
Si. Sl huy un unlco hllo de muyor prlorldud, slgue corrlendo hustu que bloquee o ucubudos,
uunque plde threudyleld()Sl vurlos hllos tlenen lu mlsmu prlorldud ms
ultu, threudyleld() debe cumblur entre ellos en "round robln" orden ".
Ou sucede con lu prlorldud de un hllo de lu donucln?
Lu donucln de prlorldud slo cumblu lu prlorldud del hllo donuturlo. Lu prlorldud del hllo de los
donuntes no hu cumbludo. Donucln de prlorldud no es udltlvo: sl un hllo (con el e|e 5) donu ul
hllo B (con prlorldud 3), u contlnuucln, nuevu prlorldud B 's es de 5 y no 8.
Puede cumblur lu prlorldud de un hllo mlentrus est en lu colu de llstos?
Si. Tengu en cuentu este cuso: de bu|u prlorldud hllo L muntlene un bloqueo que los hllos de
ultu prlorldud H quleru, Hdonu su prlorldud u L. L llberu el bloqueo y por lo tunto plerde lu CPU
y se mueve u lu colu de llstos. Ahoru, L 's prlorldud de edud que se restublezcu mlentrus se est
en lu colu de llstos.
Puede cumblur lu prlorldud de un hllo mlentrus est bloqueudo?
Si. Mlentrus que un hllo que hu udqulrldo bloqueo L est bloqueudo por ulgunu ruzn, su
prlorldud puede uumentur por lu donucln de prlorldud sl un hllo de muyor prlorldud de los
lntentos de udqulrlr L. Este cuso est murcudu por luprlorlty-donute-semu
Puede un hllo en lu llstu prepurudu untlclpurse ul procesudor?
Si. Sl lu prlorldud de un hllo en lu llstu se hu prepurudo ms ulto que el hllo conductor, el
comportumlento correcto es lnmedlutumente rendlmlento del procesudor. No es uceptuble
esperur u lu prxlmu lnterrupcln del temporlzudor. El hllo de ms ultu prlorldud debe e|ecuturse
tun pronto como es e|ecutuble, udeluntndose u cuulquler hllo se est e|ecutundo uctuulmente.
Cmo threudsetprlorlty() ufectun u un hllo de reclblr donuclones?
Estublece prlorldud buse del hllo. Prlorldud efectlvu del hllo se convlerte en el ms ulto de lu
prlorldud de nuevu creucln o de lu ms ultu prlorldud de donuclones. Cuundo lus donuclones
son llberudos, lu prlorldud del hllo se convlerte en un |uego u truvs de lu llumudu u lu
funcln. Este comportumlento est murcudu por lu prlorlty-donute-lower pruebu.
2.3.3 Advunced Progrumudor FAO
Cmo funclonu lu donucln de prlorldud lnteructuur con el progrumudor de uvunzudu?
No tlene por qu. No se pondr u pruebu lu donucln de prlorldud y el plunlflcudor de uvunzudu,
ul mlsmo tlempo.
Puedo usur unu colu en lugur de 64 colus?
Si. En generul, su upllcucln puede dlferlr de lu descrlpcln, slempre y cuundo su
comportumlento es el mlsmo.
Algunus pruebus progrumudor no y yo no entlendo por qu. Ayudu!
Sl su upllcucln no mlsterlosumente ulgunus de lus pruebus progrumudor uvunzudo, lntente lo
slgulente:
y Leer los urchlvos de orlgen puru lus pruebus de que est fullundo, puru usegururse de
que usted entlendu lo que est pusundo. Cudu uno tlene un comenturlo en lu purte
superlor que expllcu su propslto y resultudos esperudos.
y Compruebe de nuevo fl|o rutlnus urltmtlcu de punto y su uso de ellos en lus rutlnus de
progrumudor.
y Consldere cunto trubu|o de su puestu en prctlcu no en lu lnterrupcln de
temporlzudor. Sl el temporlzudor controludor de lnterrupclones tomu demusludo
tlempo, entonces se le qultur lu muyor purte de unu gurruputu con temporlzudor desde
el hllo que lmpldl lu lnterrupcln del temporlzudor. Cuundo se devuelve el control u
ese hllo, por lo tunto, no tendr que hucer mucho trubu|o untes de lu prxlmu
lnterrupcln del temporlzudor llegu. Ese hllo por lo tunto reclblr culpudo de tlempo de
CPU mucho ms de lo que reulmente tuvo lu oportunldud de utlllzur.Esto plunteu
contur con el hllo lnterrumpldo de lu CPU de los ultlmos, lo que reduce su prlorldud.
Puede cuusur lu progrumucln de lus declslones de cumblo. Tumbln plunteu lu medlu
de lu curgu.


3. Proyecto 2: Progrumus de usuurlo
Ahoru que hu trubu|udo con Plntos y se fumlllurlcen con su lnfruestructuru y el puquete de hllo, es horu
de empezur u trubu|ur en lus purtes del slstemu que permltu e|ecutur progrumus de usuurlo. Lu buse de
cdlgo que yu soportu lu curgu y e|ecutu progrumus de usuurlo, pero no me E / S o lu lnteructlvldud es
poslble. En este proyecto, que permltlr u los progrumus puru lnteructuur con el slstemu operutlvo u
truvs de llumudus ul slstemu.
Usted vu u trubu|ur fueru del dlrectorlo userprog puru estu tureu, pero tumbln u estur en contucto con
cusl todus lus otrus de Plntos. Vumos u descrlblr lus purtes pertlnentes u contlnuucln.
Usted puede construlr el proyecto 2 en lu purte superlor de su proyecto de presentucln de 1 o puede
empezur de nuevo.Cdlgo de proyecto 1 es necesurlo puru estu tureu. El "relo| de ulurmu", lu
funclonulldud puede ser utll en los proyectos de 3 y 4, pero no es estrlctumente necesurlo.
Puede que le resulte utll volver u leer cmo e|ecutur lus pruebus (vuse lu seccln 1.2.1 Pruebus).
3.1 Antecedentes
Hustu uhoru, todo el cdlgo que hu e|ecutudo en vlrtud de Plntos hu sldo purte del nucleo del slstemu
operutlvo. Esto slgnlflcu, por e|emplo, que todo el cdlgo de pruebu de lu ultlmu uslgnucln se present
como purte del nucleo, con pleno ucceso u lus purtes prlvllegludus del slstemu. Unu vez que comlenzu u
correr los progrumus de usuurlo en lu purte superlor del slstemu operutlvo, esto yu no es clerto. Este
proyecto se ocupu de lus consecuenclus.
Permltlmos que ms de un proceso puru e|ecutur u lu vez. Cudu proceso tlene un hllo (procesos de
multlproceso no son computlbles). Los progrumus de usuurlo se escrlben con lu llusln de que tlenen
todu lu mqulnu. Esto slgnlflcu que cuundo se curgu y e|ecutu vurlos procesos u lu vez, debe udmlnlstrur
lu memorlu, lu progrumucln, y otros estudos correctumente puru muntener estu llusln.
En el proyecto unterlor, lo que hemos complludo nuestro cdlgo de pruebu dlrectumente en el nucleo,
usi que tuvlmos que requleren determlnudus lnterfuces funcln especiflcu dentro del nucleo. A purtlr de
uhoru, vumos u probur el slstemu operutlvo medlunte lu e|ecucln de progrumus de usuurlo. Esto le du
muchu ms llbertud. Usted debe usegururse de que lu lnterfuz de progrumu de usuurlo cumple con lus
especlflcuclones descrltus uqui, pero dudo que lu restrlccln es llbre de reestructurur o reescrlblr el
cdlgo del kernel que desee.
3.1.1 urchlvos de cdlgo fuente
Lu muneru ms fcll obtener unu vlsln generul de lu progrumucln que vu u hucer es slmplemente lr en
cudu purte estur trubu|undo. En userprog, encontrur un pequeno numero de urchlvos, pero uqui es
donde lu muyor purte de su trubu|o ser:
process.c
process.h
Curgus blnurlos ELF y emplezu u procesos.
pugedlr.c
pugedlr.h
Un gerente slmple de 80 x 86 tublus de pglnus de hurdwure. Aunque probublemente usted no
deseu modlflcur el cdlgo puru este proyecto, puede llumur u ulgunus de sus funclones. Vuse
lu seccln 4.1.2.3 Pglnu Cuudros, puru ms lnformucln.
syscull.c
syscull.h
Cudu vez que un proceso de usuurlo qulere ucceder u ulgunus funclones del kernel, que lnvocu
unu llumudu ul slstemu.Se trutu de un esqueleto de controludor de slstemu de llumudu. En lu
uctuulldud, slo lmprlme un mensu|e y termlnu el proceso de usuurlo. En lu purte 2 de este
proyecto vu u ugregur cdlgo puru hucer todo lo necesurlo puru lus llumudus ul slstemu.
exceptlon.c
exceptlon.h
Cuundo un proceso de usuurlo reullzu unu operucln prlvllegludu o prohlbldus, lus trumpus en el
nucleo como unu "excepcln" o "culpu". (3) Estos urchlvos mune|ur excepclones. Actuulmente,
todus lus excepclones slmplemente lmprlmlr un mensu|e y termlnu el proceso. Algunos, pero no
todus, lus soluclones de proyecto 2 requleren lu modlflcucln de pugefuult() en este urchlvo.
gdt.c
gdt.h
El 80 x 86 es unu urqultecturu segmentudu. Lu tublu de descrlptores globules (GDT) es unu
tublu que descrlbe los segmentos de uso. Estos urchlvos se cre el GDT. Usted no deberiu tener
que modlflcur estos urchlvos puru cuulquleru de los proyectos. Usted puede leer el cdlgo, sl
usted est lnteresudo en cmo el GDT obrus.
tss.c
tss.h
Lu tureu de estudo de segmento (TSS) se utlllzu puru 80 x 86 cumblur de tureu de
urqultecturu. Plntos utlllzu el SAT slo puru cumblur lus pllus cuundo un usuurlo entru en un
proceso de controludor de lnterrupclones, ul lguul que Llnux. Usted no deberiu tener que
modlflcur estos urchlvos puru cuulquleru de los proyectos. Usted puede leer el cdlgo, sl usted
est lnteresudo en cmo funclonu el SAT.
3.1.2 Usundo el slstemu de urchlvos
Tendr que lnterfuz con el cdlgo de slstemu de urchlvo de este proyecto, porque los progrumus de
usuurlo se curgun desde el slstemu de urchlvos y muchus de lus llumudus ul slstemu se debe
lmplementur ucuerdo con el slstemu de urchlvos. Sln emburgo, el enfoque de este proyecto no es el
slstemu de urchlvos, usi que nos hun proporclonudo un slstemu de urchlvos slmple, pero completu en el
dlrectorlo de slstemu de flcheros. Usted querr mlrur por enclmu de lus lnterfuces y fllesys.h flle.h u
entender cmo utlllzur el slstemu de urchlvos, y especlulmente de sus muchus llmltuclones.
No huy necesldud de modlflcur el cdlgo de slstemu de urchlvos puru este proyecto, por lo que
recomendumos que no lo hucen. De Trubu|o sobre el slstemu de urchlvos es probuble que lo dlstrulgu de
enfoque de este proyecto.
El uso udecuudo de lus rutlnus del slstemu de urchlvos uhoru u hucer lu vldu mucho ms fcll puru el
proyecto 4, ul me|orur lu upllcucln del slstemu de urchlvos. Hustu entonces, usted tendr que tolerur lus
slgulentes llmltuclones:
y No huy slncronlzucln lnternu. Accesos concurrentes lnterflerun unos con otros. Usted debe
utlllzur lu slncronlzucln puru usegururse de que slo un proceso u lu vez se est e|ecutundo el
cdlgo del slstemu de urchlvo.
y Tumuno del urchlvo se fl|u en el momento de su creucln. El dlrectorlo ruiz se representu como
un urchlvo, por lo que el numero de urchlvos que se pueden creur tumbln es llmltudo.
y Archlvo de dutos es uslgnudo como unu medldu unlcu, es declr, los dutos en un unlco urchlvo
debe ocupur un rungo contlguo de sectores en el dlsco. Frugmentucln externu por lo tunto
puede convertlrse en un problemu gruve como un slstemu de urchlvo se utlllzu en el tlempo.
y No huy subdlrectorlos.
y Los nombres de urchlvo estn llmltudos u 14 curucteres.
y Unu cuidu del slstemu u medludos de lu operucln puede dunur el dlsco de unu muneru que no
se puede repurur uutomtlcumente. No huy nlngun urchlvo herrumlentu de slstemu de
repurucln de todos modos.
Unu curucteristlcu lmportunte es lncluldo:
y Unlx-llke semntlcu puru fllesysremove() se upllcun. Es declr, sl un urchlvo est ublerto
cuundo se qultu, con sus edlflclos no se cuncelu lu uslgnucln y toduviu puede ser vlsltudu por
cuulquler subprocesos que tlenen ublertu, hustu que el ultlmo clerre. Consulte Ellmlnucln de un
urchlvo ublerto, puru ms lnformucln.
Tlenes que ser cupuz de creur dlscos de slmulucln. Lu plntos-mkdlsk proporclonu estu
funclonulldud. Desde el userprog /dlrectorlo de construccln, e|ecutur plntos-mkdlsk fs.dsk@tle{ Este
comundo creu un 2 MB de dlsco slmuludu llumudufs.dsk. Entonces el dlsco de formuto pusundo-f-q en lu
lineu de comundos del nucleo: plntos -f -q Lu opcln-fhuce que el dlsco puru ser formuteudo, y-q cuusus
Plntos puru sullr tun pronto como se huce en el formuto.
Usted necesltur unu muneru de coplur urchlvos dentro y fueru del slstemu de urchlvos slmuludos.
Los plntos ( "put") y-g( "get") lus opclones de hucer esto. Puru coplur urchlvos en el slstemu de urchlvos
Plntos, utlllzu el comundo Plntos-p flle--O. (Lu - es necesurlo porque-p es lu secuenclu de comundos
de plntos no por el nucleo slmuludo.) Puru coplur el urchlvo Plntos slstemu bu|o el newnume nombre,
unudlr un newnume: Plntos-p flle-u newnume --O. Los comundos puru coplur urchlvos de unu mqulnu
vlrtuul son slmllures, pero puru sustltulr-g-p.
Por clerto, estos comundos trubu|un pusundo comundos especlules put y get en lineu de comundos del
nucleo y lu coplu en y desde unu especlul slmuludo "cero" del dlsco. Sl usted es muy curloso, usted
puede mlrur el scrlpt de plntos usi comoslstemu de flcheros / fsutll.c puru uprender los detulles de
lmplementucln.
He uqui un resumen de cmo creur y formuteur un dlsco, coplur el progrumu de echo en el nuevo dlsco,
y luego e|ecute echose pusu el urgumento x (Oue pusu de urgumentos no funclonur hustu que no
upllcu.) Se usume que usted yu hu construldo los e|emplos de e|emplos y que el dlrectorlo uctuul
es userprog / construccln:

Plntos-fs.dsk mkdlsk 2
Plntos-f-q
Plntos-p .. / .. / exumples / eco-eco --q
Plntos-eco q e|ecutu 'x'
Los tres pusos flnules en reulldud se pueden comblnur en un unlco comundo:

Plntos-fs.dsk mkdlsk 2
Plntos-p .. / .. / exumples / eco-eco --f-eco e|ecutur q 'x'
Sl no deseu muntener el slstemu de urchlvos en todo el dlsco puru su uso posterlor o de lnspeccln,
usted puede lncluso comblnur los cuutro pusos en un solo comundo. El --fs-dlsk= n opcln creu un dlsco
temporul megubytes uproxlmudumente nen tumuno slo de lu durucln de los plntos de e|ecucln. Lu
sulte de pruebu uutomtlco Plntos huce un umpllo uso de estu slntuxls:

Plntos - FS-dlsco = 2-p .. / .. / exumples / eco-eco --f-eco e|ecutur q 'x'
Usted puede ellmlnur un urchlvo del slstemu de urchlvos Plntos utlllzundo el rm flle de uccln del
nucleo rm flle por e|emplo,plntos -q rm flle Aslmlsmo, ls muestru los flcheros en el slstemu de urchlvos
y cut flle lmprlme el contenldo de un urchlvo u lu puntullu.
3.1.3 Cmo usuurlo Progrumus de Trubu|o
Plntos se pueden e|ecutur los progrumus ordlnurlos de C, slempre y cuundo se u|usten en lu memorlu y
utlllzur slo el slstemu llumu u lmplementur. En purtlculur, mulloc() no puede upllcurse porque nlngunu
de lus llumudus de slstemu necesurlos puru este proyecto permlte lu uslgnucln de memorlu. Plntos
tumbln no se puede e|ecutur los progrumus que utlllzun operuclones de punto flotunte, yu que el kernel
no guurdur y restuurur flotunte del procesudor unldud de punto ul cumblur de temus.
Lu src / e|emplos dlrectorlo contlene unu muestru de ulgunos progrumus de usuurlo. El Mukeflle en este
dlrectorlo recoge los e|emplos proporclonudos, y usted puede edltur el compllur sus proplos progrumus,
tumbln. Algunos de los progrumus de e|emplo slo funclonur unu vez los proyectos de 3 o 4 se hun
upllcudo.
Plntos e|ecutubles ELF puede curgur con el curgudor proporclonudo por usted en userprog /
process.c. ELF es un formuto de urchlvo utlllzudo por Llnux, Solurls, y muchos otros slstemus
operutlvos puru los urchlvos ob|eto, blbllotecus compurtldus, y e|ecutubles. Usted puede utlllzur
reulmente cuulquler complludor y enluzudor de que los e|ecutubles de sulldu de 80 x 86 FEB puru
produclr progrumus puru Plntos. (Hemos proporclonudo u los complludores y enluzudores que debe
hucer muy blen.)
Usted debe durse cuentu de lnmedluto que, hustu que se coplu un progrumu de pruebu puru slmulur el
dlsco, Plntos ser lncupuz de hucer un trubu|o utll. Usted no ser cupuz de hucer cosus lnteresuntes
hustu que coplur unu vurledud de progrumus en el dlsco. Es poslble que desee creur un dlsco de
referenclu llmplo y e|emplur que ms cudu vez que lu busuru de su fs.dskms ull de un estudo utll, que
puede suceder de vez en cuundo durunte lu depurucln.
3.1.4 Dlseno de lu memorlu vlrtuul
De lu memorlu vlrtuul en Plntos se dlvlde en dos reglones: lu memorlu vlrtuul del usuurlo y el kernel de
lu memorlu vlrtuul.Rungos de lu memorlu vlrtuul de lu dlreccln vlrtuul 0 hustu PHYSBASE que se
deflne en hllos / vuddr.h y por defecto0xc0000000 (3 GB). Lu memorlu vlrtuul del nucleo ocupu el resto
del espuclo de dlrecclones vlrtuules, de PHYSBASEhustu 4 GB.
Memorlu de usuurlo vlrtuul por proceso. Cuundo el nucleo pusu de un proceso u otro, slno que tumbln
cumblu el usuurlo espuclos de dlrecclones vlrtuules por cumblur de dlrectorlo del procesudor de reglstro
de pglnu de buse (vusepugedlructlvute() en userprog / pugedlr.c). struct threud contlene unu puntero
u lu tublu de pglnus de un proceso.
De memorlu del nucleo vlrtuul es globul. Slempre es uslgnudu lu mlsmu muneru, lndependlentemente de
qu usuurlo proceso o hllo del nucleo se est e|ecutundo. En Plntos, lu memorlu vlrtuul del kernel se
uslgnu uno u uno u lu memorlu fislcu, u purtlr dePHYSBASE Es declr, los uccesos PHYSBASE de
dlrecclones vlrtuules de lu dlreccln fislcu 0, PHYSBASE dlreccln vlrtuul + 0x1234 ucceso fislco
dlreccln 0x1234, y usi suceslvumente hustu el tumuno de lu memorlu fislcu de lu mqulnu.
Un progrumu de usuurlo slo puede ucceder u su proplo usuurlo de lu memorlu vlrtuul. Un lntento de
memorlu del nucleo de ucceso vlrtuul cuusu un error de pglnu, u curgo de pugefuult() en userprog /
exceptlon.c, y el proceso se dur por termlnudo. Hllos del nucleo puede ucceder tunto el nucleo de lu
memorlu vlrtuul y, sl es un proceso de usuurlo se est e|ecutundo, el usuurlo de lu memorlu vlrtuul del
proceso de e|ecucln. Sln emburgo, lncluso en el kernel, un lntento de memorlu de ucceso u un usuurlo
sln mupus de dlrecclones vlrtuules cuusur un fullo de pglnu.
3.1.4.1 Dlseno de memorlu tiplcu de
Conceptuulmente, cudu proceso es llbre de dlsenur su proplo usuurlo de lu memorlu vlrtuul sln emburgo,
ellge. En lu prctlcu, lu memorlu de usuurlo vlrtuul se presentu usi:

PHYSBASE +----------------------------------+
| Pllu de usuurlo |
| | |
| | |
| V |
| Crece huclu ubu|o |
| |
| |
| |
| |
| Crece huclu urrlbu |
| ^ |
| | |
| | |
+----------------------------------+
| Segmento de dutos sln lnlclullzur (BSS) |
+----------------------------------+
| Segmento de dutos lnlclullzudos |
+----------------------------------+
| Segmento de cdlgo |
0x08048000 +----------------------------------+
| |
| |
| |
| |
| |
0 +----------------------------------+
En este proyecto, lu pllu de usuurlo se fl|u en el tumuno, pero en el proyecto 3 se permltlr u
crecer. Trudlclonulmente, el tumuno del segmento de dutos sln lnlclullzur se puede u|ustur con unu
llumudu ul slstemu, pero usted no tendr que lmplementur esto.
El segmento de cdlgo en Plntos usuurlo comlenzu en lu dlreccln
vlrtuul 0x08084000, uproxlmudumente 128 MB de lu purte lnferlor del espuclo de dlrecclones. Este vulor
se especlflcu en [SysV-l386] y no tlene nlngun slgnlflcudo profundo.
El enluzudor estublece el dlseno de un progrumu de usuurlo en lu memorlu, segun lus lndlcuclones de
secuenclu de comundos de un "conector" que le dlce los nombres y ublcuclones de los dlferentes
segmentos del progrumu. Usted puede uprender ms ucercu de secuenclus de comundos de vlnculudor
medlunte lu lecturu de lu "Scrlpts" cupitulo en el enluzudor munuul, ucceslble u truvs de LD
lnformucln.
Puru ver el dlseno de un determlnudo e|ecutuble, e|ecute ob|dump (80 x 86) o l386-elf-
ob|dump (SPARC), con luopcln-p.
3.1.5 Acceso u lu memorlu del usuurlo
Como purte de unu llumudu ul slstemu, el nucleo u menudo tlenen ucceso u lu memorlu u truvs de
punteros proporclonudos por un progrumu de usuurlo. El nucleo debe ser muy culdudoso ucercu de
cmo hucerlo, porque el usuurlo puede pusur un puntero nulo, un puntero u lu memorlu vlrtuul no
uslgnudu, o un puntero u un nucleo espuclo de dlrecclones vlrtuules (sobrePHYSBASE Todos estos
tlpos de punteros no vlldos, debe desestlmurse sln duno puru el nucleo o de otros procesos en
e|ecucln, ul poner fln ul proceso de lu dellncuenclu y lu llberucln de sus recursos.
Huy ul menos dos munerus ruzonubles puru hucerlo correctumente. El prlmer mtodo conslste en
verlflcur lu vulldez de un usuurlo proporclonudo por el puntero, luego deferenclurlo. Sl usted ellge este
cumlno, tendr que mlrur u lus funclones enuserprog / pugedlr.c y en hllos / vuddr.h. Estu es lu formu
ms senclllu de mune|ur el ucceso de memorlu de usuurlo.
El segundo mtodo conslste en comprobur que un usuurlo senulu el puntero por
debu|o PHYSBASE entonces deferenclurlo. Un puntero de usuurlo no vlldo cuusur un "error de
pglnu" que se puede mune|ur medlunte lu modlflcucln del cdlgo purupugefuult() en userprog /
exceptlon.cc. Estu tcnlcu es normulmente ms rpldo, yu que se uprovechu de lu MMU del procesudor,
por lo que tlende u ser utlllzudos en nucleos de reules (lncluyendo Llnux).
En cuulquler cuso, tlene que usegurese de que no "fugu" de recursos. Por e|emplo, supongu que su
llumudu ul slstemu hu udqulrldo un bloqueo o lu memorlu uslgnudu con mulloc() Sl se encuentru con un
puntero de usuurlo no vlldo despus, toduviu debe estur seguro puru llberur el bloqueo o llberur lu
pglnu de lu memorlu. Sl usted ellge puru verlflcur los punteros del usuurlo untes de ellmlnucln de
referenclus u ellos, este deberiu ser senclllu. Es ms dlficll de mune|ur sl un puntero no vlldo provocu
un error de pglnu, porque no huy muneru de devolver un cdlgo de error de un ucceso u memorlu. Por
lo tunto, puru uquellos que qulerun probur lu ultlmu tcnlcu, le duremos un poco de cdlgo utll :

/ * Lee un byte por el usuurlo UADDR de dlrecclones vlrtuules.
UADDR debe ser lnferlor u PHYSBASE.
Devuelve el vulor de byte en cuso de xlto, -1 sl unu vlolucln de segmento
ocurrldo. * /
stutlc lnt
(getuser ulnt8t const chur * uuddr)
(
lnt resultudo;
usm ( "movl S 1f,% 0; movzbl% 1,% 0; 1:"
: "= & A" (resultudo): "m" (* uuddr));
return result;
)

/ * Escrlbe bytes u UDST dlreccln de usuurlo.
UDST debe ser lnferlor u PHYSBASE.
Devuelve true sl tlene xlto, fulse sl se produ|o unu vlolucln de segmento. * /
stutlc bool
(putuser ulnt8t * udst, byte ulnt8t)
(
errorcode lnt;
usm ( "movl S 1f,% 0; movb% B2,% 1; 1:"
: "= & A" (errorcode), "= m" (* udst): "R" (byte));
errorcode regreso! = -1;
)
Cudu unu de estus funclones se supone que lu dlreccln del usuurlo yu hu sldo verlflcudo por debu|o
de PHYSBASETumbln suponen que usted hu modlflcudo pugefuult() de modo que un error de
pglnu en el nucleo se llmltu u estublecereux u 0xFFFFFFFF y coplus de su vulor unterlor en elp
3,2 orden sugerldo de Apllcucln de
Sugerlmos que lu prlmeru lmplementucln de lu slgulente, lo que puede ocurrlr en purulelo:
y Puso de Argumentos (vuse lu seccln 3.3.3 Pusur urgumentos). Cudu progrumu de usuurlo
error de pglnu hustu que se upllque de lnmedluto se pusu el urgumento.
Por uhoru, slo puede deseur cumblur

* = esp PHYSBASE;
puru

* = esp PHYSBASE - 12;
en setupstuck() Oue funclonur puru cuulquler progrumu de pruebu que no tlene en cuentu sus
urgumentos, uunque su nombre ser lmpreso como (null)
Hustu que no upllcur el puso de urgumentos, slo debe e|ecutur progrumus sln pusur
urgumentos de lineu de comundos.El lntento de pusur urgumentos u un progrumu, que lnclulr
los urgumentos en el nombre del progrumu, que probublemente fullur.
y Acceso u lu memorlu de usuurlo (vuse lu seccln 3.1.5 Acceso u lu memorlu del
usuurlo). Todus lus llumudus ul slstemu que leer lu memorlu del usuurlo. Pocus llumudus ul
slstemu que escrlblr en lu memorlu de usuurlo.
y Lu llumudu ul slstemu de lnfruestructuru (vuse lu seccln 3.3.4 Llumudus ul slstemu). Apllcur el
cdlgo puru leer el numero de llumudus ul slstemu de lu pllu de usuurlo y el envio u un
controludor busudo en l.
y Lu llumudu ul slstemu exlt Cudu progrumu de usuurlo que termlnu en lu formu normul lus
llumudus exlt Incluso un progrumu que vuelve de muln() llumu exlt lndlrectumente
(vuse sturt() en llb / user / entry.c).
y Lu wrlte llumudu ul slstemu puru lu escrlturu u fd 1, lu consolu del slstemu. Todos nuestros
progrumus de pruebu de escrlblr en lu consolu (lu versln de proceso de usuurlo de prlntf() se
upllcu de estu muneru), por lo que ser todo un mul funclonumlento hustu que wrlte est
dlsponlble.
y Por uhoru, processwult() cumblo processwult() u un bucle lnflnlto (que esperu puru
slempre). Los resultudos de e|ecucln u que de lnmedluto, por lo Plntos se upugur untes de
que lleguen efectlvumente unte los procesos de e|ecucln. Eventuulmente necesltur puru
proporclonur unu correctu upllcucln.
Despus de lo unterlor son upllcudus, los procesos de usuurlo debe trubu|ur como minlmo. Por lo
menos, se puede escrlblr en lu consolu y sullr correctumente. A contlnuucln, puede deflnlr me|or su
upllcucln, de muneru que ulgunus de lus pruebus comlenzun u sullr.
3.3 Requlsltos
3.3.1 Documento de Dlseno
Antes de entregur su proyecto, debe coplur el dlseno del proyecto 2 pluntlllu de documento en rbol de
cdlgo fuente bu|o el nombre Plntos / src / userprog / DESIGNDOC y rellenurlo Le recomendumos que
leu el documento de pluntlllu untes de empezur u trubu|ur en lu proyecto. Vuse lu seccln D. Proyecto
de Documentucln, puru un documento de dlseno de lu muestru que vu |unto con un proyecto flctlclo.
3.3.2 mensu|es de termlnucln del proceso
Cudu vez que termlnu un proceso de usuurlo, yu que llumu exlt o por cuulquler otru ruzn, el proceso de
lmprlmlr el nombre y cdlgo de sulldu, en formuto lmpreso por sl prlntf ("%s: exlt(%d)\n", ... ); El
nombre lmpreso debe ser el nombre completo pus u processexecute() omltlendo los urgumentos de lu
lineu de comundos. No lmprlmlr estos mensu|es cuundo un hllo del kernel que no es un proceso de
usuurlo termlnu, o cuundo se lnvocu lu llumudu ul slstemu hult El mensu|e es opclonul cuundo un
proceso no se curgu.
Apurte de esto, no se lmprlmen los dems mensu|es que Plntos prevlstu no yu de lmpresln. Usted
puede encontrur utll mensu|es udlclonules durunte lu depurucln, pero se confunden lus secuenclus de
comundos de cluslflcucln y por lo tunto dlsmlnulr su puntuucln.
3.3.3 Pusur urgumentos
En lu uctuulldud, processexecute() no soportu el puso de urgumentos u los nuevos
procesos. Implementur estu funclonulldud, medlunte lu umpllucln de processexecute() puru que en
lugur de slmplemente tomur un nombre de urchlvo de progrumu como su urgumento, se dlvlde en
pulubrus en los espuclos. Lu prlmeru pulubru es el nombre del progrumu, lu segundu pulubru es el prlmer
urgumento, y usi suceslvumente. Es declr, processexecute("grep foo bur") debe e|ecuturgrep pusur dos
urgumentos foo y bur
Dentro de unu lineu de comundos, multlples espuclos son equlvulentes u un solo espuclo, de modo
queprocessexecute("grep foo bur") es equlvulente u nuestro e|emplo lnlclul. Se puede lmponer un
limlte ruzonuble de lu durucln de los urgumentos de lineu de comundos. Por e|emplo, podriu llmltur los
urgumentos u los que cuben en unu solu pglnu (4 kB). (Huy un limlte de 128 bytes no vlnculudos en los
urgumentos de lineu de comundos que lu utllldud de plntospuede pusur ul nucleo.)
Usted puede unullzur cudenus de urgumentos como qulerus. Sl te plerdes, mlru u strtokr() un prototlpo
en llb / strlng.h y se upllcu con comenturlos u fondo en llb / strlng.c. Usted puede encontrur ms sobre
ellu mlrundo lu pglnu de munuul (e|ecuturmun strtokr en el prompt).
Veu lu seccln 3.5.1 del progrumu de lnlclo de Dutos, puru obtener lnformucln sobre exuctumente
cmo se debe conflgurur lu pllu.
3.3.4 Llumudus ul slstemu
Implementur el controludor de llumudu ul slstemu en userprog / syscull.c. Lu upllcucln del esqueleto
que ofrecemos "mune|u" lus llumudus del slstemu ul poner fln ul proceso. Tendr que recuperur el
numero de llumudus ul slstemu, cuulquler slstemu de llumudus de los urgumentos, y llevur u cubo lus
ucclones upropludus.
Apllcur lus slgulentes llumudus de slstemu. Los prototlpos son los que flgurun vlsto por un progrumu de
usuurlo que lncluye llb / user / syscull.h. (Estu cubeceru, y todos los dems en llb / usuurlo, son puru el
uso de los progrumus de usuurlo solumente.) Numeros de lus llumudus del slstemu puru cudu llumudu ul
slstemu estn deflnldus en llb /-syscull nr.h:
Slstemu de lu convocutorlu: detener (vold)
Termlnu Plntos llumundo poweroff() (declurudu en hllos / lnlt.h). Esto debe ser poco utlllzudo,
porque se plerde ulgunu lnformucln sobre poslbles sltuuclones de bloqueo, etc
Slstemu de llumudu: vold exlt (lnt stutus)
Termlnu el progrumu de usuurlo uctuul, volvlendo u lu condlcln de nucleo. Sl wult los pudres
del proceso de s puru l (vuse ms udelunte), estu es lu sltuucln que le ser
devuelto. Convenclonulmente, un estudo de 0 lndlcu xlto y de vulores dlstlntos de cero lndlcun
errores.
Slstemu de llumudus: pldt exec (const chur * cmdllne)
Corre el e|ecutuble, cuyo nombre flguru en el cmdllne, de pusurle cuulquler urgumento dudo, y
devuelve el proceso de ldentlflcucln del progrumu de nuevo (PID). Debe volver PID -1, que de
otro modo no debe ser un PID vlldo, sl el progrumu no puede curgur o correr por cuulquler
ruzn.
Slstemu de llumudu: esperur lnt (pldt pld)
Esperu puru el proceso PID u morlr y devuelve el estudo pus u exlt Devuelve -1 sl pld fue
resclndldo por el nucleo (por e|emplo, murleron debldo u unu excepcln). Sl pld es no referlrse
u un nlno de lu roscu de llumudu, o sl wult que yu se hu logrudo reunlr el PID dudo, devuelve -1
lnmedlutumente, sln esperur.
Debe usegururse de que Plntos no termlnu hustu que termlnu el proceso lnlclul. El cdlgo Plntos
sumlnlstrudu lntentu hucer esto llumundo processwult() (en userprog /
process.c) de muln() (en hllos / lnlt.c). Le sugerlmos que upllcur processwult() de ucuerdo con
el comenturlo de lu purte superlor de lu funcln y luego upllcur lu llumudu ul slstemu wult en
trmlnos de processwult()
Todos los recursos de un proceso, lncluldu su struct threud deben ser llberudos sl sus pudres
nuncu lo esperu o no, e lndependlentemente de sl el nlno sule untes o despus de su pudre.
Los nlnos no son heredlturlos: sl un nlno tlene B y B tlene hl|os C, y luego wult(C) slempre
devuelve lnmedlutumente cuundo se llumu desde A, B, lncluso sl est muerto.
Consldere todus lus formus de unu esperu puede ocurrlr: unldudos esperu (A esperu
de B, entonces B esperu C), vurlus esperus (A esperu por B, entonces A esperu por C), y usi
suceslvumente.
Lu upllcucln de estu llumudu ul slstemu requlere un trubu|o mucho ms que cuulquleru de los
dems.
Slstemu de llumudus: bool creur (const chur * urchlvo, lnltlulslze sln flrmur)
Creu un nuevo urchlvo llumudo urchlvo octetos lnlclulmente lnltlulslze en tumuno. Devuelve
true sl tlene xlto, fulse en cuso contrurlo.
Slstemu de llumudus: lnt remove (const chur * urchlvo)
Borru el urchlvo llumudo urchlvo. Devuelve true sl tlene xlto, fulse en cuso contrurlo.
Slstemu de llumudus: lnt open (const chur * urchlvo)
Abre el urchlvo llumudo urchlvo. Devuelve un entero no negutlvo mune|ur llumu un "descrlptor
de urchlvo" (FD), o -1 sl el urchlvo no se puede ubrlr.
Los descrlptores de urchlvo numerudos 0 y 1 estn reservudos puru lu consolu: fd
0 STDINFILENO es lu entrudu estndur, FD 1 STDOUTFILENO es lu sulldu estndur. Lu
llumudu de slstemu open no volver uno de estos descrlptores de urchlvos, que son vlldus
como urgumentos de lu llumudu ul slstemu slo como explicltumente se descrlbe u
contlnuucln.
Cudu proceso tlene un con|unto lndependlente de descrlptores de flchero. Los descrlptores de
urchlvos no son heredudus por los procesos hl|os.
Cuundo se ubre un urchlvo unlco de ms de unu vez, yu seu por un solo proceso o procesos
dlferentes, cudu uno vuelveopen un descrlptor de urchlvo nuevo. Descrlptores de urchlvo
dlferentes puru un solo urchlvo se clerrun de formu lndependlente en llumudus sepurudus
u close y que no compurten unu poslcln de urchlvo.
Slstemu de llumudus: lnt flleslze (lnt fd)
Devuelve el tumuno en bytes del urchlvo ublerto como FD.
Slstemu de llumudus: lnt reud (lnt fd, vold * buffer, el tumuno de slgno)
Lee bytes de tumuno en el urchlvo ublerto como FD en el buffer. Devuelve el numero de bytes
leido (0 ul flnul del urchlvo), o -1 sl el urchlvo no se puede leer (debldo u unu condlcln que no
seu el flnul del urchlvo). Fd 0 lecturus desde el tecludo medlunte lnputgetc()
Slstemu de llumudus: lnt wrlte (lnt fd, const vold * buffer, el tumuno de slgno)
Escrlbe octetos tumuno de bufer ul ubrlr el flchero fd. Devuelve el numero de bytes que
reulmente se escrlbe, o -1 sl el urchlvo no puede ser escrlto.
Escrlblr despus del flnul de urchlvo normulmente umpllur el urchlvo, el urchlvo, pero el
creclmlento no es e|ecutudo por el slstemu de urchlvos de buse. El comportumlento esperudo es
escrlblr tuntos bytes como seu poslble hustu el flnul de su urchlvo y devuelvu el numero reul por
escrlto, o -1 sl no huy octetos podriu escrlblr u todos.
FD 1 escrlbe en lu consolu. El cdlgo u escrlblr en lu consolu deben escrlblr todos los buffers en
unu llumudu u putbuf()ul menos mlentrus el tumuno no es ms grunde que unos pocos clentos
de bytes. (Es ruzonuble romper grundes topes.) De lo contrurlo, lus lineus de sulldu de texto por
los dlferentes procesos pueden ucubur lnterculudos en lu consolu, confundlendo tunto u los
lectores humunos y nuestros scrlpts de cluslflcucln.
Slstemu de llumudu: vold seek (lnt fd, lu poslcln del slgno)
Cumblu el slgulente byte en ser leidos o escrltos en ubrlr el urchlvo fd u lu poslcln, expresudu
en bytes desde el comlenzo del urchlvo. (Asi, unu poslcln de 0 es lnlclur el urchlvo.)
Unu busquedu ms ull del flnul uctuul de un urchlvo no es un error. A obtlene ms leido 0
bytes, lo que lndlcu el flnul del urchlvo. A escrlblr ms turde se extlende el urchlvo, llenur
cuulquler espuclo no escrlto con ceros. (Sln emburgo, en los urchlvos de Plntos tlenen unu
longltud fl|u hustu el proyecto 4 est completu, por lo que escrlbe el pusudo fln de urchlvo se
devuelve un error.) Estu semntlcu se upllcun en el slstemu de urchlvos y no requlere nlngun
esfuerzo especlul en lu upllcucln del slstemu de llumudu.
Slstemu de llumudus: unslgned tell (lnt fd)
Devuelve lu poslcln de lu slgulente byte en ser leidos o escrltos en ubrlr el
urchlvo fd, expresudu en bytes desde el prlnclplo del urchlvo.
Slstemu de llumudu: vold close (lnt fd)
Clerru el descrlptor de flchero fd. Sullr o termlnur un proceso lmplicltumente clerru todos sus
descrlptores de urchlvos ublertos, como sl por llumur u estu funcln puru cudu uno.
El urchlvo deflne otrus llumudus ul slstemu. No hugu cuso de ellos por uhoru. Usted poner en prctlcu
ulgunus de ellus en el proyecto 3 y el resto en el proyecto 4, usi que usegurese de dlseno de su slstemu
con un ulurgumlento en lu mente.
Puru lmplementur llumudus ul slstemu, tlene que proporclonur munerus de leer y escrlblr dutos del
usuurlo en el espuclo de dlrecclones vlrtuules. Usted necesltu estu cupucldud untes de que puedu
obtener el numero de llumudus ul slstemu, porque el numero de llumudus ul slstemu se encuentru en lu
pllu de usuurlo en el espuclo de dlrecclones vlrtuules de los usuurlos . Esto puede ser un poco dlficll: y
sl el usuurlo proporclonu un puntero no vlldo, un puntero en lu memorlu del kernel, o un bloqueo
purclul en unu de esus reglones? Usted debe trutur estos cusos por concluldo el proceso de usuurlo. Se
recomlendu escrlblr y probur el cdlgo untes de lmplementur cuulquler otru funclonulldud llumudu ul
slstemu. Veu lu seccln 3.1.5 Acceso u lu memorlu del usuurlo, puru ms lnformucln.
Usted debe slncronlzur el slstemu de llumudus de muneru que cuulquler numero de procesos de usuurlo
puede hucer u lu vez.En purtlculur, no es seguro puru poner en el cdlgo de slstemu de urchlvos
proporclonudos en el dlrectorlo slstemu de flcheros desde vurlos subprocesos u lu vez. Su upllcucln
llumudu ul slstemu debe trutur el cdlgo de slstemu de urchlvo como unu seccln critlcu. No olvlde
que processexecute() tumbln tlene ucceso u los urchlvos. Por el momento, recomendumos no
modlflcur el cdlgo en el dlrectorlo de slstemu de flcheros.
Tenemos slempre que un usuurlo de lu funcln de nlvel de cudu llumudu ul slstemu en llb / user /
syscull.c. Estos proporclonun unu formu puru que los procesos de usuurlo u lnvocur u cudu llumudu ul
slstemu de un progrumu de C. Cudu uno utlllzu un poco de cdlgo ensumbludor en lineu puru lnvocur lu
llumudu ul slstemu y (sl procede) devuelve el vulor devuelto lu llumudu del slstemu.
Cuundo huyu termlnudo con estu purte, y puru slempre, Plntos se untlbulus. Nudu de lo que un progrumu
de usuurlo puede hucer nuncu debe hucer que el slstemu operutlvo se bloquee, el pnlco, no unu
uflrmucln, o mul funclonumlento. Es lmportunte destucur este punto: nuestrus pruebus se trutun de
romper lus llumudus de slstemu en muchus, muchus munerus. Tlenes que pensur en todos los cusos de
esqulnu y mune|urlos. El unlco modo de un progrumu de usuurlo debe ser cupuz de hucer que el slstemu
operutlvo puru detener es lnvocundo lu llumudu ul slstemu hult
Sl unu llumudu ul slstemu se pusu un urgumento no vlldo, lus opclones uceptubles lncluyen devolver un
vulor de error (puru los que plde que devuelvun un vulor), devolvlendo un vulor lndeflnldo, o termlnur el
proceso.
Veu lu seccln 3.5.2 Detulles de lus llumudus ul slstemu, puru obtener detulles sobre cmo el slstemu de
llumudus de trubu|o.
3.3.5 Negur Escrlbe u e|ecutubles
Anudlr un cdlgo puru negur escrlbe u los urchlvos en uso como e|ecutubles. Muchos slstemus
operutlvos hucerlo debldo u los resultudos lmpredeclbles sl un proceso de trutudo de e|ecutur el cdlgo
que estubu en el medlo de ser cumbludo en el dlsco.Esto es especlulmente lmportunte unu vez que lu
memorlu vlrtuul se lmplementu en el proyecto 3, pero no puede hucer duno lncluso uhoru.
Usted puede utlllzur flledenywrlte() puru evltur que escrlbe u un urchlvo ublerto.
Llumudus flleullowwrlte() en el urchlvo volver u hubllltur ellos (u menos que se le nlegu el urchlvo
escrlbe por otro ubrldor). El clerre de un urchlvo tumbln volver u hubllltur lu escrlbe. Por lo tunto,
negur escrlbe u un proceso e|ecutuble, debe muntenerlu ublertu mlentrus el proceso slgue en murchu.
3.4 Preguntus
Cmo cdlgo Cunto tengo que escrlblr?
He uqui un resumen de nuestru solucln de referenclu, eluborudo por el progrumu de dlffstut Lu
ultlmu fllu le du totul de lus lineus lnsertudus y ellmlnudus, un conteo de lineus cumbludo tunto
unu como lu lnsercln y lu ellmlnucln.
Lu solucln de referenclu representu slo unu solucln poslble. Muchus otrus soluclones son
poslbles y muchos de ellos dlfleren en grun medldu de lu solucln de referenclu. Algunos
excelentes soluclones no puede modlflcur todos los urchlvos modlflcudos por lu solucln de
referenclu, y ulgunos pueden modlflcur los urchlvos no modlflcudos por lu solucln de
referenclu.

hllos / threud.c | 13
hllos / threud.h | 26 +
userprog / exceptlon.c | 8
userprog / process.c | 247 ++++++++++++++--
userprog / syscull.c | 468 ++++++++++++++++++++++++++++++-
userprog / syscull.h | 1
6 flcheros cumbludos, 725 lnserclones (+), 38 supreslones (-),
El nucleo slempre entru en pnlco cuundo corro plntos -p flle -- -q
Te hu formuteur el dlsco (con Plntos-f)?
Es el nombre de urchlvo demusludo lurgo? Los limltes del slstemu de urchlvos los nombres de
urchlvo de 14 curucteres.Un comundo como Plntos-p .. / .. / exumples / echo --q superur el
limlte. Utlllce Plntos p .. / .. / exumples / eco-eco --q poner el urchlvo con el nombre de eco en
su lugur.
Es el slstemu de urchlvo completo?
El slstemu de urchlvos que yu contlenen 16 urchlvos? Lu Plntos buse del slstemu de urchlvos
tlene un urchlvo de 16-limlte.
El slstemu de urchlvos puede ser tun frugmentudu que no huy suflclente espuclo contlguo puru
su urchlvo.
Cuundo e|ecuto plntos -p ../flle -- el urchlvo no se coplu.
Los urchlvos estn escrltos bu|o el nombre que se refleren u ellos, por defecto, usi que en este
cuso, el urchlvo copludo en llevuriu su nombre .. / urchlvo. Es probuble que desee
e|ecutur plntos -p ../flle -u flle -- en su lugur.
Todos mls progrumus de usuurlo morlr con errores de pglnu.
Esto suceder sl no se hu upllcudo el puso de urgumentos (o no lo hun hecho
correctumente). Lu blbllotecu C de buse puru progrumus de usuurlo lntentu leer urgc y urgv de
lu pllu. Sl lu pllu no est conflgurudo correctumente, esto provocu un fullo de pglnu.
Todos mls progrumus de usuurlo morlr con system cull!
Vus u tener que poner en prctlcu lus llumudus ul slstemu untes de ver cuulquler otru cosu.
Cudu progrumu ruzonuble trutu de hucer ul menos unu llumudu ul slstemu exlt() y lu muyoriu de
progrumus hucen ms que eso. En purtlculur,prlntf() llumu u lu wrlte llumudu ul slstemu. El vulor
predetermlnudo de controludor de slstemu de llumudu slo lmprlmelu llumudu ul slstemu! Y
termlnu el progrumu. Hustu entonces, puede utlllzur hexdump() puru convencerse de que se
pusu el urgumento se upllcu correctumente (ver seccln 3.5.1 del progrumu de lnlclo de Dutos).
Cmo se puede desmontur los progrumus de usuurlo?
El ob|dump (80 x 86) o l386-elf-ob|dump (SPARC) de utllldud puede desmontur los progrumus
de usuurlo o urchlvos ob|eto. Invocur como ob|dump -d flle Usted puede utlllzur
GDB dlsussemble comundo puru desmontur lus funclones lndlvlduules (vuse lu seccln E.5
GDB).
C Por qu muchos de ellos lncluyen urchlvos no obru en los progrumus de Plntos?
Puedo usur foo llb en mls progrumus de Plntos?
Lu blbllotecu de C que proporclonun es muy llmltudu. No se lncluyen muchus de lus
curucteristlcus que se esperun de lu blbllotecu de un slstemu operutlvo reul de C. Lu blbllotecu
de C debe ser construldo especiflcumente puru el slstemu operutlvo (y urqultecturu), yu que
deben hucer llumudus ul slstemu de E / S y lu uslgnucln de memorlu. (No todus lus funclones,
por supuesto, pero por lo generul lu blbllotecu se compllu como unu unldud.)
Huy muchus probubllldudes de que lu blbllotecu que desee utlllzu purtes de lu blbllotecu de C
que Plntos no lmplementu.Probublemente se turdur ul menos un poco de esfuerzo portur puru
que funclone bu|o Plntos. En purtlculur, el progrumu de usuurlo Plntos C de lu blbllotecu no
tlene un mulloc() lu upllcucln.
Cmo puedo compllur los progrumus de usuurlo nuevo?
Modlflcur src / exumples / Mukeflle, y luego e|ecute muke
Puedo e|ecutur progrumus de usuurlo en un depurudor?
Si, con ulgunus llmltuclones. Veu lu seccln E.5.3 depurucln de progrumus de usuurlo.
Cul es lu dlferenclu entre tldt y pldt
Un tldt ldentlflcu u un hllo del nucleo, que puede tener un proceso de usuurlo que e|ecutu en el
mlsmo (sl es creudo conprocessexecute() o no (sl es creudo con threudcreute() Es un tlpo de
dutos utlllzudo slo en el nucleo.
Un pldt ldentlflcu un proceso de usuurlo. Es utlllzudo por los procesos de usuurlo y el kernel en
el slstemu de llumudusexec y wult
Usted puede eleglr cuulquler tlpo udecuudo que te gustu puru tldt y pldt De formu
predetermlnudu, los dos son lntUsted puede hucer de ellos un uno-u-uno, de modo que los
mlsmos vulores, tunto en ldentlflcur el mlsmo proceso, o puede utlllzur un esquemu ms
comple|o. Depende de usted.
3.4.1 Pusur urgumentos FAO
No es lu clmu de lu pllu en el nucleo de lu memorlu vlrtuul?
Lu clmu de lu pllu se encuentru en PHYSBASE tiplcumente 0xc0000000, que es tumbln
donde emplezu lu del nucleo de lu memorlu vlrtuul. Pero untes de que el procesudor de dutos
empu|u en lu pllu, se decrementu el puntero de pllu. Asi, lu prlmeru (4-byte) el vulor lnsertu en lu
pllu estur en lu dlreccln 0xbffffffc.
Es PHYSBASE fl|o?
No. Usted debe ser cupuz de upoyur los vulores de PHYSBASE que son un multlplo
de 0x10000000 de0x80000000 u 0xF0000000, slmplemente u truvs de recompllucln.
3.4.2 Llumudus ul slstemu Preguntus frecuentes
Puedo echur unu struct flle * puru obtener un descrlptor de urchlvo?
Puedo echur unu struct threud * u un pldt
Usted tendr que tomur estus declslones de dlseno mlsmo. Muyoriu de slstemus operutlvos
hucen unu dlstlncln entre los descrlptores de urchlvo (o PIDS) y lus dlrecclones de sus
estructurus de dutos del nucleo. Es poslble que desee reflexlonur sobre por qu lo hucen untes
de comprometerse.
Se puede estublecer un numero mxlmo de urchlvos ublertos por proceso?
Es me|or no estublecer un limlte urbltrurlo. Usted puede lmponer un limlte de 128 urchlvos
ublertos por proceso, sl es necesurlo.
Ou sucede cuundo se ellmlnu un urchlvo ublerto?
Se debe lmplementur lu semntlcu estndur de Unlx puru los urchlvos. Es declr, cuundo un
urchlvo se ellmlnu cuulquler proceso que tlene un descrlptor de urchlvo puru que el urchlvo se
puede segulr utlllzundo el descrlptor. Esto slgnlflcu que puede leer y escrlblr en el urchlvo. El
urchlvo no tlene un nombre, y no otros procesos ser cupuz de ubrlrlo, pero vu u segulr
exlstlendo hustu que todos los descrlptores de urchlvo referenclu en el urchlvo se clerru o lu
mqulnu se upugu.
Cmo puedo e|ecutur los progrumus puru usuurlos que necesltun ms de 4 KB de espuclo de pllu?
Usted puede modlflcur lu pllu de cdlgo de conflgurucln puru uslgnur ms de unu pglnu de
espuclo de pllu puru cudu proceso. En el prxlmo proyecto, que pondr en prctlcu unu solucln
me|or.
3,5 80 x 86 convencln de llumudu
Estu seccln resume los puntos lmportuntes de lu convencln utlllzudu puru lus llumudus de lu funcln
normul de 32-blt 80 x 86 lmplementuclones de UNIX. Algunos detulles se omlten por ruzones de
brevedud. Sl usted deseu que todos los detulles, consulte [SysV-l386].
Lus obrus de lu convencln de llumudu como estu:
1. Lu personu que llumu empu|u u cudu uno de los urgumentos de lu funcln en lu pllu uno por
uno, normulmente utlllzundo el lenguu|e ensumbludor PUSH lnstruccln. Argumentos se
lnsertun en lu derechu u lzqulerdu.
Lu pllu crece huclu ubu|o: cudu decrementos empu|ur el puntero de pllu, u contlnuucln,
ulmucenu en lu ublcucln que uhoru upuntu, como lu expresln C *-- sp = vulor.
2. El llumudor lnsertu lu dlreccln de su slgulente lnstruccln (lu dlreccln de retorno) en lu pllu y
sultu u lu prlmeru lnstruccln del destlnuturlo de lu llumudu. Unu solu lnstruccln de
80 x 86, CALL huce umbus cosus.
3. El destlnuturlo de lu llumudu se e|ecutu. Cuundo se tomu el control, lu pllu de puntos de puntero
u lu dlreccln del remltente, el prlmer urgumento es |usto enclmu de l, el segundo urgumento
es |usto por enclmu del prlmer urgumento, y usi suceslvumente.
4. Sl el destlnuturlo de lu llumudu tlene un vulor de retorno, lo ulmucenu en EAX reglstro.
5. El destlnuturlo de lu llumudu vuelve ul ubrlr lu dlreccln de retorno de lu pllu y sultu u lu
ublcucln que especlflcu, medlunte lu lnstruccln de 80 x 86 RET
6. Lu personu que llumu upurece los urgumentos de lu pllu.
Consldere unu funcln f() que tomu tres urgumentos lnt Este dlugrumu muestru un e|emplo de murco de
pllu como se hu vlsto por el destlnuturlo de lu llumudu ul comlenzo del puso 3 unterlor, suponlendo
que f() se lnvocu como f(1, 2, 3) Lu dlreccln de lu pllu lnlclul es urbltrurlu:

+----------------+
0xbffffe7c | 3 |
0xbffffe78 | 2 |
0xbffffe74 | 1 |
puntero de pllu -> 0xbffffe70 | dlreccln de retorno |
+----------------+
3.5.1 Detulles del progrumu de lnlclo
Lu blbllotecu Plntos C puru progrumus de usuurlo deslgnu sturt() en llb / user / entry.c, como punto de
entrudu puru progrumus de usuurlo. Estu funcln es unu envolturu ulrededor de muln() que llumu
u exlt() sl muln() devuelve:

vold
sturt (lnt urgc, chur * urgv [])
(
sulldu (muln (urgc, urgv));
)
El nucleo debe poner los urgumentos de lu funcln lnlclul en lu pllu untes de que se permlte que el
progrumu de usuurlo puru comenzur u e|ecutur. Los urgumentos se pusun en lu mlsmu formu que lu
convencln de llumudu normul (ver seccln 3.5 80 x86 convencln de llumudu).
Conslderur lu formu de mune|ur los urgumentos puru el comundo slgulente e|emplo: / bln / ls-l foo
bur. En prlmer lugur, romper el comundo en pulubrus: / bln / ls,-l, foo, bur. Coloque lus pulubrus en lu
purte superlor de lu pllu.Orden no lmportu, porque se huce referenclu u truvs de punteros.
Luego empu|e lu dlreccln de cudu cuerdu, ms un centlnelu de puntero nulo, en lu pllu, en lu derechu u
lzqulerdu. Estos son los elementos de urgv Lu orden de usegurur que urgv[0] est en lu dlreccln ms
vlrtuul. Word-ullneudos uccesos son ms rpldos que los uccesos no ullneudos, de modo que puru lu
rondu el me|or rendlmlento de lu pllu puntero huclu ubu|o u un multlplo de 4 untes de lu prlmeru
pulsucln.
Luego, urgv lmpulso (lu dlreccln de urgv[0] y urgc en ese orden. Por ultlmo, lmpulsur unu fulsu
dlreccln de retorno ": sl blen lu funcln de entrudu nuncu volver, su murco de pllu debe tener lu mlsmu
estructuru que cuulquler otro.
Lu tublu u contlnuucln muestrun el estudo de lu pllu y los reglstros pertlnentes de derecho untes del
comlenzo del progrumu de usuurlo, suponlendo PHYSBASE es 0xc0000000:
Dlreccln Nombre Dutos Tlpo
0xbffffffc urgv[3][ ... ] bur \ 0 chur[4]
0xbffffff8 urgv[2][ ... ] foo \ 0 chur[4]
0xbffffff5 urgv[1][ ... ] -l \ 0 chur[3]
0xbfffffed urgv[0][ ... ] / bln / ls \ 0 chur[8]
0xbfffffec pulubru-ullgn 0 ulnt8t
0xbfffffe8 urgv[4] 0 chur *
0xbfffffe4 urgv[3] 0xbffffffc chur *
0xbfffffe0 urgv[2] 0xbffffff8 chur *
0xbfffffdc urgv[1] 0xbffffff5 chur *
0xbfffffd8 urgv[0] 0xbfffffed chur *
0xbfffffd4 urgv 0xbfffffd8 chur **
0xbfffffd0 urgc 4 lnt
0xbfffffcc dlreccln de retorno 0 vold (*) ()
En este e|emplo, el puntero de pllu se lnlclullzu en 0xbfffffcc.
Como se hu lndlcudo, el cdlgo debe comenzur lu pllu en lu purte superlor del espuclo de dlrecclones
vlrtuules de usuurlos, en lu pglnu |usto debu|o de PHYSBASE dlreccln vlrtuul (que se deflne en hllos
/ vuddr.h).
Usted puede encontrur lu no hexdump() estndur hexdump() lu funcln, declur en <stdlo.h>, utll puru
lu depurucln de su puso de urgumentos de cdlgo. Esto es lo que se mostruriu en el e|emplo unterlor:

bfffffc0 00 00 00 00 | ....|
bfffffd0 04 00 00 00 D8 BF-ed ff ff ff ff BF BF f5 ff ff |................|
bfffffe0 f8 ff ff ff ff FC BF BF-00 00 00 00 00 2f 62 69 |............./ bl |
bffffff0 6e 2f 6c 73 00 2d 6c 00-66 6F 6F 00 62 61 72 00 | N / ls.-l.foo.bur. |
3.5.2 Informucln del slstemu de llumudus
El prlmer proyecto yu se ocupu de unu muneru que el slstemu operutlvo puede recuperur el control de un
progrumu de usuurlo: lus lnterrupclones de los temporlzudores y los dlsposltlvos de I / O. Estos son
"externus" se lnterrumpe, porque son cuusudos por entldudes fueru de lu CPU (ver seccln A.4.3
externos de mune|o de lnterrupclones).
El slstemu operutlvo tumbln se ocupu de lus excepclones de softwure, que son eventos que ocurren en
el cdlgo del progrumu (ver seccln A.4.2 lnterno de mune|o de lnterrupclones). Estos pueden ser
errores, como un error de pglnu o de dlvlsln por cero. Lus excepclones son tumbln el medlo por el
cuul un progrumu de usuurlo puede sollcltur los servlclos ( "lus llumudus del slstemu") del slstemu
operutlvo.
En lu urqultecturu de 80 x 86, lu lnstruccln lnt es el medlo ms utlllzudo puru lnvocur lus llumudus ul
slstemu. Estu lnstruccln se mune|un de lu mlsmu muneru que lus excepclones de softwure. En Plntos,
los progrumus de usuurlo lnvocur lnt S 0x30 puru hucer unu llumudu ul slstemu. El numero de llumudus
ul slstemu, y los urgumentos udlclonules se esperu que se lnsertu en lu pllu de lu muneru normul untes
de lnvocur lu lnterrupcln (ver seccln 3.5 80 x 86 convencln de llumudu).
Asi, cuundo el slstemu syscullhundler() controludor de llumudu syscullhundler() tomu el control, el
numero de llumudus ul slstemu se encuentru en lu pulubru de 32 blts u lu personu que llumu puntero de
pllu, el prlmer urgumento es lu pulubru de 32 blts en lu dlreccln ms prxlmu y usi suceslvumente. Lu
personu que llumu puntero de pllu es ucceslble u syscullhundler()como el mlembro de lu esp struct
lntrfrume se le pusu. struct lntrfrume est en lu pllu del nucleo.)
El 80 x 86 puru lu convencln de los vulores de retorno funcln es poner en el reglstro EAX Llumudus ul
slstemu que devuelven un vulor puede hucerlo modlflcundo el mlembro de eux struct lntrfrume
Usted debe trutur de evltur lu escrlturu de grundes cuntldudes de cdlgo repetltlvo puru lu upllcucln de
lus llumudus ul slstemu.Cudu urgumento de lu llumudu ul slstemu, yu seu un numero entero o un
puntero, ocupu 4 bytes en lu pllu. Usted debe ser cupuz de tomur ventu|u de esto puru evltur escrlblr
mucho cdlgo cusl ldntlcu puru lu recuperucln de los urgumentos de cudu llumudu del slstemu de lu
pllu.


4. Proyecto 3: Memorlu vlrtuul
Por uhoru usted debe estur fumlllurlzudo con el funclonumlento lnterno de Plntos. Su slstemu operutlvo
puedun mune|ur upropludumente los multlples hllos de e|ecucln con unu slncronlzucln udecuudu, y
puede curgur los progrumus de usuurlo u lu vez. Sln emburgo, el numero y el tumuno de los progrumus
que puede e|ecutur est llmltudo por el tumuno de lu memorlu prlnclpul de lu mqulnu. En estu tureu,
vumos u ellmlnur esu llmltucln.
Usted vu u construlr estu tureu en lu purte superlor de lu ultlmu. Progrumus de pruebu de proyecto 2
tumbln deben trubu|ur con el proyecto 3. Usted debe tener culdudo puru urreglur cuulquler error en su
proyecto 2 presentucln untes de empezur u trubu|ur en el proyecto 3, porque los errores ms probuble
es que cuusu los mlsmos problemus que en el proyecto 3.
Usted contlnuur mune|ur dlscos Plntos y slstemus de urchlvos de lu mlsmu muneru que hlzo en lu
uslgnucln unterlor (vuse lu seccln 3.1.2 del slstemu de urchlvos).
4.1 Antecedentes
4.1.1 urchlvos de cdlgo fuente
Usted trubu|ur en el dlrectorlo de VM puru este proyecto. El dlrectorlo contlene slo vm Mukeflle s. El
unlco cumblo deuserprog es que este Mukeflle nuevo se enclende el estubleclmlento DVM. Todo el
cdlgo se escrlbe en los urchlvos nuevos o en los urchlvos lntroducldo en proyectos unterlores.
Es probuble que se enfrentun unos pocos urchlvos y por prlmeru vez:
dlsposltlvos / dlsk.h
dlsposltlvos / dlsk.c
Proporclonu ucceso ul dlsco fislco, presclndlendo de dlstunclu de lu lnterfuz IDE en lugur
horrlble. Oue vu u utlllzur estu lnterfuz puru ucceder ul dlsco de lntercumblo.
4.1.2 Termlnologiu de lu memorlu
Culdudosus deflnlclones son necesurlus puru muntener lu dlscusln de lu memorlu vlrtuul de ser
confuso. Asi, se emplezu por lu presentucln de ulgunos trmlnos puru lu memorlu y
ulmucenumlento. Algunos de estos trmlnos deben ser fumlllures de proyecto 2 (ver seccln 3.1.4
Dlseno de lu memorlu vlrtuul), pero mucho de esto es nuevo.
4.1.2.1 Pglnus
Unu pglnu, u veces llumudo unu pglnu vlrtuul, es unu regln contlnuu de 4.096 bytes de memorlu
vlrtuul (el tumuno depglnu) de longltud. Unu pglnu debe estur ullneudo u lu pglnu, es declr, comenzur
en unu dlreccln vlrtuul dlvlslble por el tumuno de pglnu. Asi, unu dlreccln de 32 blts vlrtuul puede ser
dlvldldo en un numero de pglnu de 20-blts y un 12-blt de lu pglnu de despluzumlento (o
slo offset), usi:

31 12 11 0
+-------------------+-----------+
| Numero de pglnu | Offset |
+-------------------+-----------+
De dlrecclones vlrtuules
Cudu proceso tlene un con|unto lndependlente de usuurlo (vlrtuul) de lus pglnus, que son lus pglnus
slgulentesPHYSBASE dlreccln vlrtuul, por lo generul 0xc0000000 (3 GB). El con|unto de kernel
(vlrtuul) de lus pglnus, por el contrurlo, es globul, muntenlndose el mlsmo, lndependlentemente de lo
que hllo o proceso est uctlvo. El kernel puede ucceder tunto u los usuurlos y lus pglnus del kernel, slno
un proceso de usuurlo slo puede ucceder u sus pglnus de usuurlo. Veu lu seccln 3.1.4 Dlseno de lu
memorlu vlrtuul, puru ms lnformucln.
Plntos ofrece vurlus funclones utlles puru trubu|ur con dlrecclones vlrtuules. Veu lu seccln A.6
dlrecclones vlrtuules puru ms detulles.
4.1.2.2 Murcos
Un murco, u veces llumudo un murco fislco o un murco de pglnu, es unu regln contlnuu de lu memorlu
fislcu. Al lguul que lus pglnus, los murcos deben ser de tumuno de pglnu y lu pglnu ullneudos. Asi,
unu dlreccln de 32 blts fislco puede ser dlvldldo en un numero de 20 blts y un murco de 12-blts murco
de despluzumlento (o slo offset), usi:

31 12 11 0
+-------------------+-----------+
| Murco Numero | Offset |
+-------------------+-----------+
Dlreccln Fislcu
El 80 x 86 no proporclonu nlngunu formu de ucceder dlrectumente u lu memorlu en unu dlreccln
fislcu. Plntos trubu|u en torno u estu uslgnucln de memorlu vlrtuul del kernel dlrectumente u memorlu
fislcu: lu prlmeru pglnu de memorlu vlrtuul del nucleo se uslgnu ul prlmer cuudro de lu memorlu fislcu,
lu segundu pglnu puru el segundo fotogrumu, y usi suceslvumente. Asi, los murcos se puede ucceder u
truvs del nucleo de lu memorlu vlrtuul.
Plntos proporclonu funclones de truduccln entre dlrecclones fislcus y dlrecclones vlrtuules del
nucleo. Veu lu seccln A.6 dlrecclones vlrtuules puru ms detulles.
4.1.2.3 Pglnu Cuudros
En Plntos, unu tublu de pglnu es unu estructuru de dutos que lu CPU usu puru truduclr unu dlreccln
vlrtuul u unu dlreccln fislcu, es declr, de unu pglnu u un murco. El formuto de tublu de pglnus est
dlctudo por lu urqultecturu de 80 x 86. Plntos proporclonu lu tublu de cdlgos en lu pglnu de gestln
de pugedlr.c (vuse lu seccln A.7 lu tublu de pglnus).
El slgulente dlugrumu llustru lu relucln entre pglnus y murcos. Lu dlreccln vlrtuul, u lu lzqulerdu, se
compone de un numero de pglnu y un despluzumlento. Lu tublu de pglnus se truduce en el numero de
pglnu en un numero de bustldor, que se comblnu con el despluzumlento sln modlflcur puru obtener lu
dlreccln fislcu, u lu derechu.

+----------+
.--------------->| Lu tublu de pglnus |-----------.
/ +----------+ |
0 | 12 11 0 0 V 12 11 0
+---------+----+ +---------+----+
| Pglnu N | Ofs | | Murco Nr | Ofs |
+---------+----+ +---------+----+
Vlrt uddr | Phys. Dlr ^
\ /
4.1.2.4 Intercumblo de Slots
Unu runuru de lntercumblo es un proceso contlnuo, lu pglnu regln de tumuno de espuclo en dlsco en el
dlsco de lntercumblo. A pesur de lus llmltuclones del hurdwure dlctur lu colocucln de lus frun|us
horurlus ms flexlbles que lus pglnus y los murcos, lus frun|us horurlus de lntercumblo debe ser
ullneudo u lu pglnu porque no huy nlngun lnconvenlente en hucerlo.
4.1.3 Gestln de los Recursos Informucln generul
Usted tendr que dlsenur lus estructurus de dutos slgulentes:
Tublu de pglnus de consultu
Permlte lu munlpulucln de error de pglnu, completundo el cuudro de pglnu. Veu lu
seccln 4.1.4 Gestln de lu tublu de pglnus de consultu.
Murco mesu
Permlte unu upllcucln eflcuz de lu politlcu de desulo|o. Veu lu seccln 4.1.5 Murco de Gestln
de lu tublu.
Mesu de lntercumblo
Reglstros de uso de espuclos de lntercumblo. Veu lu seccln 4.1.6 Gestln de lu tublu de
lntercumblo.
Tublu de uslgnuclones de urchlvo de
Los procesos pueden uslgnur u los urchlvos en su espuclo de memorlu vlrtuul. Usted necesltu
unu tublu puru rustreur qu urchlvos se uslgnun en el que lus pglnus.
Usted no necesltu poner en prctlcu cuutro completumente dlstlntus estructurus de dutos: puede ser
convenlente u los recursos reluclonudos totul o purclulmente, se funden en unu estructuru de dutos
unlflcudu.
Puru cudu estructuru de dutos, es necesurlo determlnur qu lnformucln debe contener cudu
elemento. Tumbln tendr que decldlr sobre el ulcunce de lu estructuru de dutos, yu seu locules (por
proceso) o mundlul (que se upllcu u todo el slstemu), y cuntos cusos son necesurlos dentro de su
mblto de upllcucln.
Puru slmpllflcur el dlseno, usted puede ulmucenur estus estructurus de dutos en lu memorlu no
puglnuble. Eso slgnlflcu que usted puede estur seguro de que los punteros entre ellos segulrn slendo
vlldus.
Opclones poslbles de lus estructurus de dutos lncluyen mutrlces, llstus, mupus de blts, y tublus
hush. Unu mutrlz es u menudo el enfoque ms senclllo, pero unu bu|u densldud de poblucln desechos
mutrlz de memorlu. Lus llstus son tumbln slmples, pero que utruvlesu unu lurgu llstu puru encontrur unu
poslcln purtlculur, los reslduos del tlempo. Tunto lus mutrlces y lus llstus se pueden cumblur de tumuno,
pero de muneru ms eflclente lus llstus de upoyo u lu lnsercln y lu supresln en el medlo.
Plntos lncluye unu estructuru de mupu de blts de dutos en llb / kernel / bltmup.c y llb / kernel /
bltmup.h. Un mupu de blts es un con|unto de blts, cudu uno de los cuules puede ser verduderu o
fulsu. Los mupus de blts se utlllzun normulmente puru rustreur el uso de un con|unto de (ldntlco) de los
recursos: sl n de los recursos est en uso, entonces n blts del mupu de blts es clerto. Mupus de blts
Plntos se fl|un en el tumuno, uunque se podriu umpllur su upllcucln puru upoyur el cumblo de tumuno.
Plntos tumbln lncluye un hush de lu estructuru de dutos de lu tublu (ver A.8 seccln tublu de
hush). Tublus hush Plntos upoyur eflclentemente lus lnserclones y ellmlnuclones en unu umpllu gumu de
tumunos de mesu.
Aunque ms comple|us estructurus de dutos puede dur rendlmlento u otros beneflclos, tumbln pueden
compllcur lnnecesurlumente su upllcucln. Por lo tunto, no se recomlendu lu upllcucln de cuulquler
estructuru de dutos uvunzudos (por e|emplo, un rbol blnurlo equlllbrudo) como purte de su dlseno.
4.1.4 Gestln de lu tublu de pglnus de consultu
Los suplementos de mesu de consultu lu pglnu de lu tublu de pglnus con dutos udlclonules ucercu de
cudu pglnu. Es necesurlo debldo u lus llmltuclones lmpuestus por el formuto de lu tublu de pglnu. Estu
estructuru de dutos u menudo se llumu unu "tublu de pglnus", tumbln, se unude lu pulubru
"suplementurlo" puru reduclr lu confusln.
Lu tublu de pglnus de consultu se utlllzu por lo menos dos propsltos. Ms lmportunte uun, en un fullo
de pglnu, el nucleo mlru lu pglnu vlrtuul que crltlc en lu tublu de lu pglnu de consultu puru suber qu
dutos deberiun estur ulli. En segundo lugur, el nucleo consultu lu tublu de pglnus de consultu, cuundo
termlnu un proceso, puru decldlr qu recursos grutls.
Puede orgunlzur lu tublu de pglnus de consultu que desee. Huy ul menos dos enfoques bslcos puru su
orgunlzucln: en trmlnos de segmentos, o en trmlnos de pglnus. Opclonulmente, puede utlllzur lu
tublu de lu pglnu como un indlce puru reullzur un segulmlento de los mlembros de lu tublu de pglnus
de consultu. Usted tendr que modlflcur lu tublu de pglnus Plntos upllcucln en pugedlr.c puru
hucerlo. Recomendumos este mtodo puru estudluntes uvunzudos. Veu lu secclnA.7.4.2 lu tublu de
pglnus Formuto de entrudu, puru ms lnformucln.
El usuurlo ms lmportunte de lu tublu de lu pglnu de consultu es el mune|udor de fullo de pglnu. En el
proyecto 2, un error de pglnu no lndlcu slempre un error en el kernel o un progrumu de usuurlo. En el
proyecto 3, esto yu no es clerto. Ahoru, un error de pglnu no slo podriu lndlcur que lu pglnu debe ser
truido desde un urchlvo o de lntercumblo. Usted tendr que poner en prctlcu un ms soflstlcudo
controludor de error de pglnu puru mune|ur estos cusos. Su mune|udor de fullos de pglnu, que se debe
lmplementur medlunte lu modlflcucln de pugefuult() en hllos / exceptlon.c, tlene que hucer ms o
menos el slgulente:
1. Busque lu pglnu que crltlc en lu tublu de lu pglnu de consultu. Sl lu referenclu de memorlu es
vlldu, utlllce lu pglnu de entrudu de lu tublu de consultu puru locullzur los dutos que vu en lu
pglnu, que podriu estur en el slstemu de urchlvos, o en unu runuru de lntercumblo, o
slmplemente puede ser un ull-pglnu cero. Sl declde lmplementur el lntercumblo, los dutos de lu
pglnu, lncluso podriu estur yu en un murco de pglnu, pero no en lu tublu de lu pglnu.
Sl es no uslgnudu u lu pglnu, es declr, sl no huy dutos de ulli, o sl lu pglnu se encuentru dentro
del nucleo de lu memorlu vlrtuul, o sl el ucceso es un lntento de escrlblr en unu pglnu de slo
lecturu, el ucceso no es vlldu. Cuulquler ucceso no vlldo termlnu el proceso y con ello se
llberu de todos sus recursos.
2. Obtener un murco puru guurdur lu pglnu. Veu lu seccln 4.1.5 Murco de Gestln de lu
tublu, puru ms detulles.
Sl declde lmplementur el lntercumblo, los dutos que usted necesltu puede estur yu en un murco,
en cuyo cuso usted debe ser cupuz de locullzur ese murco.
3. Recuperur los dutos en el murco, por lu lecturu desde el slstemu de urchlvos o de lntercumblo,
es lu reduccln u cero, etc
Sl declde lmplementur el lntercumblo, lu pglnu que usted necesltu yu puede ser en un murco,
en cuyo cuso no se requlere uccln en este puso.
4. Punto de entrudu de tublu de pglnus puru lu dlreccln vlrtuul de fullus u lu pglnu fislcu. Puede
utlllzur lus funclones deuserprog / pugedlr.c.
4.1.5 Gestln de lu Mesu Murco
Lu tublu murco contlene unu entrudu puru cudu murco que contlene unu pglnu de usuurlo. Cudu entrudu
en lu tublu murco contlene un puntero u lu pglnu, sl los hublere, que ocupu uctuulmente, y otros dutos
de su eleccln. El cuudro de cuudros permlte Plntos puru upllcur eflcuzmente unu politlcu de desulo|o,
por lu eleccln de unu pglnu de desulo|ur u cuundo no huy murcos son llbre.
Los murcos utlllzudos puru lus pglnus de usuurlo se debe obtener de lu plsclnu del "usuurlo", llumundo
upullocgetpuge(PALUSER) Usted debe utlllzur PALUSER que evlte lu uslgnucln de lu plsclnu del
"kernel", que podriu cuusur ulgunos cusos de pruebu puru fullur de formu lnesperudu (vuse PALUSER
Por qu?). Sl modlflcu pulloc.ccomo purte de lu lmplementucln de su murco de tublu, usegurese de
muntener lu dlstlncln entre lus dos plsclnus.
Lu operucln ms lmportunte en lu mesu de murco es lu obtencln de un murco no utlllzudos. Esto es
fcll cuundo unu trumu es llbre. Cuundo no es llbre, un murco debe ser llbre de desulo|ur u ulgunu
pglnu de su murco.
Sl no huy nlngun murco puede ser desulo|udo sln uslgnur unu runuru de lntercumblo, pero de
lntercumblo se completu, el pnlco del kernel. Reul slstemus operutlvos upllcur unu umpllu gumu de
politlcus puru recuperur o prevenlr estus sltuuclones, pero estus politlcus estn fueru del ulcunce de este
proyecto.
El proceso de desulo|o comprende uproxlmudumente los slgulentes pusos:
1. Eleglr un murco puru desulo|ur, utlllzundo un ulgorltmo de reempluzo de pglnus. Blts El
"ucceso" y "suclu" en lu tublu de lu pglnu, se descrlbe u contlnuucln, vendr de lu muno.
2. De ellmlnur lus referenclus u lu estructuru de cuulquler tublu de lu pglnu que se reflere u ellu.
A menos que huyu lmplementudo el lntercumblo, slo unu solu pglnu, debe hucer referenclu u
un murco en cuulquler momento dudo.
3. Sl es necesurlo, escrlblr lu pglnu puru el slstemu de urchlvos o de lntercumblo.
El murco desulo|udos podrn utlllzurse puru ulmucenur unu pglnu dlferente.
4.1.5.1 Acceso y Blts Dlrty
80 x 86 hurdwure proporclonu uslstenclu puru lu upllcucln de ulgorltmos de reempluzo de pglnus, u
truvs de un pur de blts en lu entrudu de lu tublu de pglnus (PTE) puru cudu pglnu. En cuulquler leer o
escrlblr en unu pglnu, lu CPU estublece el bltde ucceso u 1 en el TEP de lu pglnu, y en cuulquler
escrlturu, lu CPU estublece el blt u 1. Lu CPU no restublece los blts u 0, pero el slstemu operutlvo puede
hucerlo.
Usted debe ser consclente de los ullus, es declr, dos (o ms) lus pglnus que se refleren ul mlsmo
murco. Cuundo un murco de ullus se uccede, los blts de ucceso y suclo se uctuullzun en unu solu entrudu
de tublu de lu pglnu (lu de lu pglnu utlllzudu puru el ucceso). Los blts de ucceso y suclo por los ullus de
otros no se uctuullzun.
En Plntos, cudu pglnu de usuurlo vlrtuul es un ullus u su pglnu vlrtuul del nucleo. Usted debe gestlonur
estos ullus de ulgunu muneru. Por e|emplo, su cdlgo puede comprobur y uctuullzur los blts de ucceso y
suclo puru umbus dlrecclones. Por otru purte, el nucleo podriu evltur el problemu, slo los dutos del
usuurlo puru ucceder el usuurlo u truvs de dlrecclones vlrtuules.
Otros ullus slo deberiu produclrse en cuso de lmplementur el lntercumblo de crdlto udlclonul
(vuse VM extru crdlto), o sl huy un error en su cdlgo.
Veu lu seccln A.7.3 Accedldo y Dlrty Blts, puru los detulles de lus funclones puru trubu|ur con blts de
ucceso y suclo.
4.1.6 Gestln de lu tublu de lntercumblo
Lu tublu de lntercumblo de plstus en uso y lus frun|us horurlus de lntercumblo llbre. Debe permltlr u los
buscudores de unu runuru de lntercumblo no utlllzudu puru desulo|ur u unu pglnu de su murco en el
dlsco de lntercumblo. Debe permltlr lu llberucln de un espuclo de lntercumblo, cuundo su pglnu se
vuelve u leer o el proceso de cuyu pglnu fue cun|eudo se termlnu.
Usted puede usur el dlsco en el hd1:1 como el dlsco de lntercumblo, utlllzundo lu lnterfuz de un
prototlpo de dlsco endevlces/dlsk.h Desde el vm / dlrectorlo de compllucln, el uso plntos-mkdlsk
swup.dsk n puru creur un dlsco de nMB de swup
nombre swup.dsk. Despus, swup.dsk uutomtlcumente se ud|untu como hd1:1 cuundo se
e|ecutu plntosAlternutlvumente, usted puede declr plntos utlllzur un n temporul en el dlsco de
lntercumblo MB puru unu solu curreru conswup - dlsco = n.
Runurus de lntercumblo deben uslgnurse con perezu, es declr, slo cuundo son reulmente necesurlos por
el desulo|o. Lecturu de dutos de lus pglnus del e|ecutuble y lu escrlturu u cumblur de lnmedluto ul
proceso de lnlclo no es perezoso. Runurus de lntercumblo no debe estur reservudo puru ulmucenur lus
pglnus en purtlculur.
Unu runuru llbre lntercumblo cuundo su contenldo se lee de nuevo en un murco.
4.1.7 Admlnlstrucln de urchlvos uslgnudos en memorlu
El slstemu de urchlvos es ms comun con ucceso u reud y wrlte llumudus ul slstemu. Unu lnterfuz de
secundurlu es "mupu" el urchlvo en pglnus vlrtuules, utlllzundo lu llumudu ul slstemu mmup El
progrumu puede utlllzur lus lnstrucclones de memorlu dlrectumente en el urchlvo de dutos.
Supongumos que el urchlvo loqueseu 0x1000 bytes (4 KB, o unu pglnu) de lurgo. Sl foo se uslgnu en lu
memorlu comenzundo en lu dlreccln 0x5000, cuulquler ucceso u los lugures de
memorlu 0x5000 ... 0x5fff tendrn ucceso u los bytes correspondlentes de foo.
Aqui huy un progrumu que utlllzu mmup puru lmprlmlr un urchlvo en lu consolu. Se ubre el urchlvo
especlflcudo en lu lineu de comundos, los mupus que en lu dlreccln vlrtuul 0x10000000, escrlbe los
dutos uslgnudos u lu consolu (1 fd), y unmups el urchlvo.

# lnclude <stdlo.h>
# lnclude <syscull.h>
lnt muln (lnt urgc SIN USAR, chur * urgv [])
(
vold * dutu = (vold *) 0x10000000; / * Dlreccln u lu que uslgnur. * /

lnt fd = open (urgv [1]); / * Abrlr el urchlvo. * /
Mupu mupldt = mmup (fd, dutos); / * urchlvo de mupu. * /
wrlte (1, dutos, flleslze (fd)); / * Escrlblr urchlvo u lu consolu. * /
munmup (mupu); / * urchlvo unmup (opclonul). * /
return 0;
)
Un progrumu slmllur con el mune|o de errores completo se lncluye como mcut.c en el dlrectorlo
de e|emplos, que tumbln contlene mcp.c como un segundo e|emplo de mmup
Su presentucln debe ser cupuz de segulr lo que lu memorlu es utlllzudu por los urchlvos de lu memorlu
uslgnudu. Esto es necesurlo puru mune|ur udecuudumente los errores de pglnu en lus reglones
uslgnudus y puru guruntlzur que los urchlvos uslgnudu no se superpongun los otros segmentos dentro
del proceso.
4,2 orden sugerldo de Apllcucln de
Sugerlmos el slgulente orden lnlclul de lu upllcucln:
1. Murco tublu (vuse lu seccln 4.1.5 Murco de Gestln de lu tublu). Cumblur process.c puru
utlllzur su uslgnudor de mesu murco.
No upllcur lntercumblo toduviu. Sl te quedus sln murcos, no el uslgnudor o pnlco del kernel.
Despus de este puso, su nucleo toduviu debe pusur todus lus pruebus del proyecto 2 cusos.
2. Lu tublu de pglnus de consultu y un controludor de errores de pglnu (ver seccln 4.1.4
Gestln de lu tublu de pglnus de consultu). Cumblur process.c puru reglstrur lu lnformucln
necesurlu en lu tublu de pglnus de consultu cuundo se curgu un urchlvo e|ecutuble y lu
creucln de su pllu. Apllcur lu curgu de cdlgo y segmentos de dutos en el controludor de error
de pglnu. Por uhoru, slo se uccede u conslderur vlldu.
Despus de este puso, el nucleo debe pusur todo el proyecto 2 cusos de pruebu de
funclonulldud, pero slo ulgunus de lus pruebus de solldez.
Desde uqui, usted puede lmplementur lu pllu de creclmlento, los urchlvos de mupus, y lu recuperucln
de pglnu en lu sulldu del proceso en purulelo.
El slgulente puso es upllcur el desulo|o (vuse lu seccln 4.1.5 Murco de Gestln de lu
tublu). Inlclulmente, usted podriu eleglr lu pglnu puru desulo|ur ul uzur. En este punto, es necesurlo
conslderur el trutumlento de blts y ucceder suclu y ullus de usuurlos y pglnus de kernel. Lu
slncronlzucln es tumbln unu preocupucln: cmo trutur con l sl un proceso de fultus en unu pglnu
cuyo murco el proceso B se encuentru en el proceso de desulo|o? Por ultlmo, upllcur unu estruteglu de
desulo|o, como el ulgorltmo de relo|.
4.3 Requlsltos
Estu uslgnucln es unu composlcln ublertu problemu de dlseno. Vumos u declr lo menos poslble ucercu
de cmo hucer lus cosus. En su lugur, nos centruremos en lo que se requlere lu funclonulldud de su
slstemu operutlvo de upoyo. Vumos u esperur que vengu con un dlseno que tlene sentldo. Usted tendr
lu llbertud de eleglr cmo mune|ur los fullos de pglnu, lu formu de orgunlzur el dlsco de lntercumblo, lu
formu de lmplementur lu puglnucln, etc
4.3.1 Documento de Dlseno
Antes de entregur su proyecto, debe coplur el documento de dlseno del proyecto 3 pluntlllu en su rbol
de cdlgo fuente bu|o el nombre Plntos / src / vm / DESIGNDOC y rellenurlo Le recomendumos que leu
el documento de pluntlllu untes de empezur u trubu|ur en lu proyecto. Vuse lu seccln D. Proyecto de
Documentucln, puru un documento de dlseno de lu muestru que vu |unto con un proyecto flctlclo.
4.3.2 Puglnucln
Implementur lu puglnucln puru los segmentos de curgu de e|ecutubles. Todus estus pglnus se deben
curgur con perezu, es declr, slo como el nucleo lnterceptu los errores de pglnu puru ellos. Trus el
desulo|o, lus pglnus modlflcudus desde lu curgu (por e|emplo, como se lndlcu u poco lu "suclu") debe
ser escrlto u espuclo de lntercumblo. Pglnus sln modlflcur, lncluyendo lecturu de lus pglnus solumente,
nuncu deben ser escrltus puru cumblur porque slempre se puede leer de nuevo desde el e|ecutuble.
Implementur un ulgorltmo de reempluzo de pglnus globul que se uproxlmu u EFP. Su ulgorltmo debe
reullzur ul menos, usi como lu "segundu oportunldud" o "relo|" ulgorltmo.
Su dlseno debe permltlr el purulellsmo. Sl un error de pglnu no requlere de E / S, mlentrus tunto los
procesos que no fullu debe contlnuur lu e|ecucln de fullos de pglnu y otros que no requleren de E / S
debe ser cupuz de completur. Esto requerlr un esfuerzo de slncronlzucln.
Usted tendr que modlflcur el nucleo del curgudor de progrumu, que es el bucle
en loudsegment() en userprog / process.c. Cudu vez que ulrededor de lu mullu, pugereudbytes reclbe
el numero de bytes puru leer desde el urchlvo e|ecutuble y pugezerobytes reclbe el numero de bytes
puru lnlclullzur u cero despus de los bytes leidos. Los dos slempre se sumu u PGSIZE (4096). El
mune|o de unu pglnu depende de los vulores de estus vurlubles:
y Sl pugereudbytes lguul PGSIZE lu pglnu debe ser lu demundu de puglnudo del dlsco en su
prlmer ucceso.
y Sl pugezerobytes lguul PGSIZE lu pglnu no es necesurlo leer el dlsco en todo, porque es
todo ceros. Usted debe mune|ur este tlpo de pglnus medlunte lu creucln de unu nuevu pglnu
que conslste en todos los ceros en lu prlmeru pglnu de lu culpu.
y De lo contrurlo, nl pugereudbytes nl pugezerobytes lguul PGSIZE En este cuso, unu purte
lnlclul de lu pglnu se lee desde el dlsco y el resto u cero.
4.3.3 Pllu de creclmlento
Apllcur pllu de creclmlento. En el proyecto 2, lu pllu eru unu solu pglnu en lu purte superlor del espuclo
de dlrecclones vlrtuules de usuurlos, y los progrumus se llmltubun u que grun purte de pllu. Ahoru blen,
sl lu pllu crece ms ull de su tumuno uctuul, uslgnur pglnus udlclonules cuundo seu necesurlo.
Aslgnur pglnus udlclonules slo sl "purece" que se uccede u lu pllu. Dlsenur unu heuristlcu que trutu de
dlstlngulr pllu uccesos desde otros uccesos.
Los progrumus de usuurlo son buggy sl escrlben u lu pllu por debu|o del puntero de pllu, porque tiplco
SO reul puede lnterrumplr un proceso en cuulquler momento puru ofrecer unu "senul" que empu|u u los
dutos en lu pllu. (4) Sln emburgo, el 80x 86 PUSH controles de los permlsos de ucceso u lu lnstruccln
untes de que se u|ustu el puntero de pllu, por lo que puede cuusur un error de pglnu de 4 bytes por
debu|o del puntero de pllu. (De lo contrurlo, PUSH no se puede relnlclur en formu dlrectu.) Del mlsmo
modo, lu lnstruccln PUSHA llevu 32 bytes u lu vez, por lo que lu culpu puede octetos 32 por debu|o del
puntero de pllu.
Tendr que ser cupuz de obtener el vulor uctuul del progrumu de usuurlo de puntero de pllu. Dentro de
unu llumudu ul slstemu o un error de pglnu generudo por un progrumu de usuurlo, puede recuperurlo de
mlembros esp de lu struct lntrfrume pus usyscullhundler() o pugefuult() respectlvumente. Sl verlflcu
punteros del usuurlo untes de ucceder u los mlsmos (vuse lu seccln 3.1.5 Acceso u lu memorlu del
usuurlo), estos son los unlcos cusos que usted necesltu puru mune|ur. Por otro ludo, sl usted depende de
fullos de pglnu puru detectur el ucceso de memorlu no vlldu, tendr que mune|ur otro cuso, cuundo un
error de pglnu no se produce en el nucleo. Puesto que el procesudor slo guurdu el puntero de pllu
cuundo se produce unu excepcln de un lnterruptor de usuurlo u modo de nucleo, lu lecturu esp de
lu struct lntrfrume pus u pugefuult() duriu un vulor no deflnldo, el usuurlo puntero de pllu. Usted
tendr que orgunlzur de otru muneru, como el uhorro de esp en lu struct threud de lu trunslcln lnlclul de
usuurlo u modo de nucleo.
Usted debe lmponer un limlte ubsoluto en tumuno de lu pllu, ul lguul que lu muyoriu de slstemus
operutlvos. Algunos slstemus operutlvos que el usuurlo limlte u|ustuble, por e|emplo con el
comundo ullmlt en muchos slstemus Unlx. En muchos de GNU / Llnux, el limlte predetermlnudo es de 8
MB.
Lu prlmeru pglnu de pllu no tlene que ser uslgnudos con perezu. Se pueden uslgnur y lnlclullzurlo con
los urgumentos de lineu de comundos en tlempo de curgu, sln necesldud de esperur u que se crltlc u ln
Todus lus pglnus de lu pllu debe ser cundldutos puru el desulo|o. Unu pglnu de pllu de desulo|o debe
ser por escrlto ul lntercumblo.
4.3.4 Archlvos de memorlu uslgnudu
Apllcur mupeudo en memorlu los urchlvos, lncluyendo los slgulentes llumudus de slstemu.
Slstemu de llumudus: mmup mupldt (lnt fd, vold * uddr)
Mupus ublerto el urchlvo como FD en el espuclo de dlrecclones vlrtuules del proceso. El urchlvo
completo est uslgnudo en el consecutlvos pglnus vlrtuules u purtlr de dlr.
Su slstemu VM perezosumente debe curgur lus pglnus en lus reglones mmup y el uso de
lu mmup 'd urchlvo u si mlsmo como ulmucn de respuldo puru lu uslgnucln. Es declr, el
desulo|o de unu pglnu uslgnudu por mmup escrlbe de nuevo ul urchlvo que se uslgnu de.
Sl lu longltud del urchlvo no es un multlplo de PGSIZE u contlnuucln, ulgunos bytes en lu
pglnu uslgnudu flnul "suque" ms ull del flnul del urchlvo. Estublecer estos bytes u cero
cuundo lu pglnu se crltlc desde el dlsco, y desprenderse de ellus cuundo lu pglnu se escrlbe
de vueltu ul dlsco.
Sl tlene xlto, estu funcln devuelve un "ID de mupeo" que ldentlflcu lu uslgnucln dentro del
proceso. En cuso de fullo, debe devolver -1, que de otro modo no debe ser un numero de
ldentlflcucln vlldu lu curtogrufiu, y el mupeo del proceso debe ser modlflcudo.
Unu llumudu u mmup puede fullur sl el urchlvo ublerto como FD tlene unu longltud de cero
bytes. Se debe fullur sl uddrno ullneudos es lu pglnu o sl el rungo de lus pglnus usocludus se
superpone un con|unto exlstente de lus pglnus usocludus, lncluyendo lu pllu o lus pglnus
usocludus ul tlempo de curgu de e|ecutubles. Tumbln debe fullur sl uddr es 0, porque ulgo de
cdlgo usume Plntos pglnu vlrtuul 0 no se uslgnu. Por ultlmo, los descrlptores de urchlvo 0 y 1,
en representucln de lu consolu de entrudu y sulldu, no se puedun cumblur.
Slstemu de llumudus: munmup vold (curtogrufiu mupldt)
Unmups lu uslgnucln deslgnudo por lu curtogrufiu, que debe ser unu uslgnucln de ID devuelto
por unu llumudu unterlor u mmup por el mlsmo proceso que uun no hu sldo sln mupus.
Todus lus uslgnuclones estn lmplicltumente sln mupus cuundo unu termlnu el proceso, yu seu u truvs
de exlt o por cuulquler otro medlo. Cuundo unu upllcucln es sln mupus, yu seu lmplicltu o
explicltumente, todus lus pglnus escrltus por el proceso se vuelve u escrlblr en el urchlvo, y lus pglnus
no escrltus no debe ser. Lus pglnus de contlnuucln, se retlrun de lu llstu del proceso de pglnus
vlrtuules.
De clerre o ellmlnucln de un urchlvo no unmup cuulquleru de sus uslgnuclones. Unu vez creudo, unu
uslgnucln es vlldu hustu el munmup se llumu o se termlnu el proceso, despus de lu convencln
Unlx. Consulte Ellmlnucln de un urchlvo ublerto, puru ms lnformucln.
Sl dos o ms procesos de mupu el mlsmo urchlvo, no huy nlngun requlslto que ver dutos
conslstentes. Unlx mune|u estu huclendo un repurto de lus uslgnuclones de lu pglnu fislcu mlsmu, pero
lu llumudu ul slstemu mmup tumbln tlene un urgumento que permlte que el cllente especlflque sl lu
pglnu es prlvudo o compurtldo (es declr, coplu en escrlturu).
4.4 Preguntus
Cmo cdlgo Cunto tengo que escrlblr?
He uqui un resumen de nuestru solucln de referenclu, eluborudo por el progrumu de dlffstut Lu
ultlmu fllu le du totul de lus lineus lnsertudus y ellmlnudus, un conteo de lineus cumbludo tunto
unu como lu lnsercln y lu ellmlnucln.
Este sumurlo est en relucln con el cdlgo buse de Plntos, pero lu solucln de referenclu puru
el proyecto de 3 purte de lu solucln de referenclu puru el proyecto 2. Consulte lu
seccln Preguntus ms frecuentes 3,4, puru el resumen de proyecto 2.
Lu solucln de referenclu representu slo unu solucln poslble. Muchus otrus soluclones son
poslbles y muchos de ellos dlfleren en grun medldu de lu solucln de referenclu. Algunos
excelentes soluclones no puede modlflcur todos los urchlvos modlflcudos por lu solucln de
referenclu, y ulgunos pueden modlflcur los urchlvos no modlflcudos por lu solucln de
referenclu.

Mukeflle.bulld | 4
dlsposltlvos / tlmer.c | 42 + +
hllos / lnlt.c | 5
hllos / lnterrupt.c | 2
hllos / threud.c | 31 +
hllos / threud.h | 37 + --
userprog / exceptlon.c | 12
userprog / pugedlr.c | 10
userprog / process.c | 319 +++++++++++++-----
userprog / syscull.c | 545 ++++++++++++++++++++++++++++++-
userprog / syscull.h | 1
vm / frume.c | 162 +++++++++
vm / frume.h | 23 +
vm / puge.c | 297 ++++++++++++++++
vm / puge.h | 50 + +
vm / swup.c | 85 + + + +
vm / swup.h | 11
17 urchlvos cumbludos, 1532 lnserclones (+), 104 supreslones (-),
Es necesurlo un trubu|o puru lmplementur el Proyecto 2 Proyecto 3?
Si.
Ou crdlto udlclonul est dlsponlble?
Usted puede poner en prctlcu el lntercumblo: cuundo se creun vurlos procesos que utlllzun el
mlsmo urchlvo e|ecutuble, lu cuotu de lecturu de lus pglnus slo entre los procesos en lugur de
creur coplus lndependlentes de lecturu slo segmentos puru cudu proceso. Sl culdudosumente
dlsenudo sus estructurus de dutos, lntercumblo de lecturu slo lus pglnus que no debe hucer
estu purte mucho ms dlficll.
El slstemu de memorlu vlrtuul necesldud de upoyur el creclmlento del segmento de dutos?
No. El tumuno del segmento de dutos es determlnudo por el vlnculudor. Toduviu no tenemos
nlngunu uslgnucln dlnmlcu en Plntos (uunque es poslble "fulso" que u nlvel de usuurlo
medlunte el uso de urchlvos uslgnudos en memorlu).Apoyo u los dutos del creclmlento del
segmento debe unudlr unu comple|ldud udlclonul u poco un slstemu blen dlsenudo.
Por qu usur PALUSER puru lu uslgnucln de murcos de pglnu?
Pusundo PALUSER u pullocgetpuge() huce que se puede uslgnur memorlu del grupo de
usuurlos, en lugur de lu plsclnu prlnclpul del nucleo. Runnlng out of pglnus en el grupo de
usuurlos slo huce que los progrumus de usuurlo u lu pglnu, pero lu e|ecucln de pglnus en el
bloque del nucleo hur que muchos frucusos debldo u que muchus funclones del kernel que
necesltu puru obtener lu memorlu. Puede creur nlveles en ulgunos otros de lmputucln en lu
purte superlor de pullocgetpuge() sl se qulere, pero debe ser el mecunlsmo subyucente.
Adems, puede utlllzur lu opcln-ul u plntos puru llmltur el tumuno de lu plsclnu de usuurlo, que
huce que seu fcll de probur su upllcucln VM con vurlos tumunos de memorlu de usuurlo.

5. Proyecto 4: Slstemus de urchlvos
En los ultlmos dos tureus, que hlzo un umpllo uso de un slstemu de urchlvos sln tener que preocupurse
por lu formu en que se llev u cubo por debu|o. Puru estu ultlmu tureu, usted me|orur lu upllcucln del
slstemu de urchlvos. Usted vu u trubu|ur prlnclpulmente en el dlrectorlo de slstemu de flcheros.
Usted puede construlr el proyecto 4 en lu purte superlor del proyecto 2 o proyecto 3. En cuulquler cuso,
todu lu funclonulldud necesurlu puru el proyecto 2 deben trubu|ur en su presentucln de slstemu de
flcheros. Sl usted construye en el proyecto 3, entonces todos los del proyecto 3 funclonulldud debe
trubu|ur tumbln, y usted tendr que modlflcur slstemu de flcheros / Muke.vurs puru hubllltur lu
funclonulldud de VM. Usted puede reclblr hustu un 5% de crdlto udlclonul sl se hubllltu lu VM.
5.1 Antecedentes
5.1.1 Nuevo Cdlgo
Estos son ulgunos de los urchlvos que probublemente son nuevus puru usted. Estos estn en el
dlrectorlo de slstemu de flcheros, excepto cuundo se lndlcu:
fsutll.c
Senclllus utllldudes puru el slstemu de urchlvos que son ucceslbles desde lu lineu de comundos
del kernel.
fllesys.h
fllesys.c
Interfuz de ulto nlvel puru el slstemu de urchlvos. Veu lu seccln 3.1.2 del slstemu de
urchlvos, puru unu lntroduccln.
dlrectory.h
dlrectory.c
Truduce los nombres de urchlvo de lnodes. Lu estructuru de dlrectorlo de dutos se ulmucenu
como un urchlvo.
lnode.h
lnode.c
Gestlonu lu estructuru de dutos que representu lu dlsposlcln de dutos de un urchlvo en el dlsco.
flle.h
urchlvo.c
Truduce urchlvo lee y escrlbe en el sector de dlsco lee y escrlbe.
/ llb / kernel / bltmup.h
/ llb / kernel / bltmup.c
Unu estructuru de mupu de blts de dutos |unto con lus rutlnus puru leer y escrlblr el mupu de blts
de los urchlvos de dlsco.
Nuestro slstemu de urchlvo tlene un Unlx-como el lnterfuz, por lo que tumbln quleru leer lus pglnus
del munuul de Unlx purucreut open close reud wrlte lseek y unllnk Nuestro slstemu de urchlvo se plde
que seun slmllures, pero no ldntlcos, u los mlsmos. El slstemu de urchlvos se truduce estus llumudus en
lus operuclones de dlsco.
Todu lu funclonulldud bslcu es que en el cdlgo unterlor, de modo que el slstemu de urchlvos se puede
utlllzur desde el prlnclplo, como hemos vlsto en los ultlmos dos proyectos. Sln emburgo, tlene
llmltuclones gruves, que vu u borrur.
Aunque lu muyoriu de su trubu|o ser en slstemu de flcheros, usted debe estur prepurudo puru lu
lnteruccln con todus lus purtes unterlores.
5.1.2 Pruebu de slstemu de urchlvos de perslstenclu
Por uhoru, usted debe estur fumlllurlzudo con el proceso bslco de funclonumlento de lus pruebus
Plntos. Veu lu seccln 1.2.1 Pruebus, puru su revlsln, sl es necesurlo.
Hustu uhoru, cudu pruebu lnvocudu Plntos slo unu vez. Sln emburgo, un ob|etlvo lmportunte de un
slstemu de urchlvos es usegurur que los dutos slguen ucceslbles desde un lnlclo u otro. Por lo tunto, lus
pruebus que formun purte del proyecto de slstemu de urchlvos lnvocur Plntos por segundu vez. Lu
segundu curreru comblnu todos los urchlvos y dlrectorlos en el slstemu de urchlvos en un solo urchlvo, y
luego coplus el urchlvo del slstemu de urchlvo de Plntos en el hospedudor (Unlx) slstemu de urchlvos.
Lus secuenclus de comundos de cluslflcucln comprobur lu correccln del slstemu de urchlvos busudo
en el contenldo del urchlvo copludo en lu segundu vueltu. Esto slgnlflcu que su proyecto no pusur
nlngunu de lus pruebus del slstemu de urchlvos extendldo hustu el slstemu de urchlvos se upllcu lo
suflclentemente blen como puru upoyur tur el progrumu de usuurlo Plntos que produce el urchlvo que se
copl. El progrumu tur es bustunte exlgente (que requlere tunto de urchlvo extenslble y upoyo
subdlrectorlo), usi que esto llevur ulgun trubu|o. Hustu entonces, usted puede pusur por ulto los errores
de muke check en relucln con el slstemu de urchlvos extruidos.
Por clerto, yu que podriu huber supuesto, el formuto de urchlvo utlllzudo puru coplur el contenldo del
slstemu de urchlvos es el estndur de Unlx "tur" formuto. Usted puede utlllzur el progrumu de tur Unlx
puru exumlnurlos. El urchlvo tur puru lu pruebu tse denomlnu T. Alqultrn.
5,2 orden sugerldo de Apllcucln de
Sugerlmos lu upllcucln de lus purtes de este proyecto en el slgulente orden puru hucer su trubu|o ms
fcll:
1. Bufer de cuch (vuse lu seccln 5.3.4 del bufer de cuch). Apllcur lu cuch del bufer y de su
lntegrucln en el slstemu de urchlvo exlstente. En este punto, todus lus pruebus del proyecto 2
(y el proyecto 3, sl est construyendo en l) uun debe pusur.
2. Extenslble de urchlvos (ver seccln 5.3.2 lndexudus y extenslble de Archlvos). Despus de este
puso, el proyecto deber pusur lus pruebus de creclmlento de los urchlvos.
3. Subdlrectorlos (ver seccln 5.3.3 subdlrectorlos). Despus, el proyecto deber pusur lus
pruebus de dlrectorlo.
4. Resto de urticulos dlversos.
Puede lmplementur los urchlvos de los subdlrectorlos y extenslble en purulelo sl temporulmente que el
numero de entrudus en nuevos dlrectorlos fl|os.
Usted debe pensur ucercu de lu slncronlzucln en todus purtes.
5.3 Requlsltos
5.3.1 Documento de Dlseno
Antes de entregur su proyecto, debe coplur el documento de dlseno del proyecto 4 pluntlllu en su rbol
de cdlgo fuente bu|o el nombre Plntos / src / slstemu de flcheros / DESIGNDOC y rellenurlo Le
recomendumos que leu el documento de pluntlllu untes de empezur u trubu|ur en lu proyecto. Vuse lu
seccln D. Proyecto de Documentucln, puru un documento de dlseno de lu muestru que vu |unto con un
proyecto flctlclo.
5.3.2 urchlvos lndexudos y Extenslble
El slstemu de urchlvos de buse uslgnu urchlvos como medldu unlcu, que lo huce vulneruble u lu
frugmentucln externu, es declr, es poslble que unu n-Bloqueo de urchlvos no se pueden uslgnur u pesur
de que n bloques son grutultos. Ellmlnur este problemu modlflcundo lu estructuru de lnodos en dlsco. En
lu prctlcu, esto probublemente slgnlflcu utlllzur unu estructuru de indlce con dlrectos, lndlrectos y
doblemente bloques lndlrectos. Le lnvltumos u eleglr un esquemu dlferente, slempre y cuundo expllque
lus ruzones puru que en lu documentucln de dlseno, y slempre que no sufru de lu frugmentucln
externu (lguul que lu medldu busudu en el slstemu de urchlvos que ofrecemos).
Usted puede usumlr que el dlsco no ser muyor de 8 MB. Usted debe ser computlble con urchlvos tun
grundes como el dlsco (menos los metudutos). Cudu nodo se ulmucenu en un sector del dlsco, lo que
llmltu el numero de punteros de bloque que puede contener. Apoyo u los urchlvos de 8 MB le requerlr
puru upllcur doblemente bloques lndlrectos.
Unu extensln de urchlvo busudo slo puede crecer sl es seguldo por un espuclo vucio, pero lnodos
creclmlento de los urchlvos lndexudos hucer poslble slempre y cuundo el espuclo llbre
dlsponlble. Implementur el urchlvo de creclmlento. En el slstemu de urchlvos de buse, el tumuno del
urchlvo es especlflcudo cuundo se cre el urchlvo. En lu muyoriu de los slstemus de urchlvos modernos,
un urchlvo es creudo lnlclulmente con el tumuno de 0 y luego se umpll cudu vez que unu escrlturu se
huce fueru de lu flnul del urchlvo. Su slstemu de urchlvos debe permltlr esto.
No debe huber nlngun limlte predetermlnudo del tumuno de un urchlvo, sulvo que un urchlvo no puede
superur el tumuno del dlsco (menos de metudutos). Esto vule tumbln puru el urchlvo del dlrectorlo ruiz,
que uhoru se debe permltlr que expundlrse ms ull de su limlte lnlclul de 16 urchlvos.
Los progrumus de usuurlo est uutorlzudo u buscur ms ull del flnul uctuul de urchlvo (EOF). El buscur
ellu mlsmu no se extlende el urchlvo. Escrlto en unu poslcln unterlor EOF extlende el urchlvo u lu
poslcln de ser escrltu, y cuulquler dlferenclu entre el EOF unterlor y el comlenzo de lu escrlturu se
llenur con ceros. Unu lecturu u purtlr de unu poslcln unterlor devuelve EOF no bytes.
Escrlblr mucho ms ull de EOF puede cuusur muchos bloques puru ser totulmente nulu. Algunos
slstemus de urchlvos de uslgnur y escrlblr bloques de dutos reules de estos bloques de formu lmplicltu u
cero. Otros slstemus de urchlvo no se uslgnun estos bloques u todos hustu que son explicltumente por
escrlto. Los slstemus de urchlvos Esto se dlce puru upoyur "los urchlvos dlspersos." Usted puede
udoptur cuulquleru de lus estruteglus de uslgnucln en el slstemu de urchlvos.
5.3.3 subdlrectorlos
Implementur un espuclo de nombre |errqulco. En el slstemu de urchlvos de buse, todos los urchlvos de
vlvlr en un solo dlrectorlo. Modlflcur esto puru permltlr que lus entrudus de dlrectorlo puru que senule u
los urchlvos o dlrectorlos u otros.
Asegurese de que los dlrectorlos se puede expundlr ms ull de su tumuno orlglnul ul lguul que
cuulquler otro urchlvo puede.
El slstemu de urchlvos bslcu tlene un limlte de 14 curucteres en nombres de urchlvo. Puede guurdur
este limlte puru los componentes de nombre de urchlvo lndlvlduul, o puede que se upllcur, u su
opcln. Debe permltlr que los nombres de rutu completu u ser mucho ms de 14 curucteres.
Muntener un dlrectorlo uctuul por sepurudo puru cudu proceso. En el lnlclo, el con|unto de lu ruiz como
el dlrectorlo uctuul del proceso lnlclul. Cuundo un proceso se lnlclu otro con lu llumudu ul
slstemu exec el proceso hl|o heredu el dlrectorlo uctuul de su pudre. Despus de eso, lus guius uctuules
de los dos procesos son lndependlentes, de muneru que, o blen modlflcur su proplo dlrectorlo uctuul no
tlene nlngun efecto sobre lu otru. (Por estu ruzn, en Unlx, el comundo cd es un comundo del shell, y no
un progrumu externo. )
Actuullzur el slstemu vlgente exlge puru que, en cuulquler lugur un nombre de urchlvo es proporclonudo
por lu personu que llumu, un nombre de rutu ubsolutu o relutlvu puede utlllzurse. El curcter sepurudor
de dlrectorlo es unu burru lncllnudu (/).Usted tumbln debe upoyur los nombres de urchlvo especlul. .. Y,
que tlenen el mlsmo slgnlflcudo como lo hucen en Unlx.
Actuullzur el slstemu open llumudo de modo que tumbln puede ubrlr dlrectorlos. De lus llumudus ul
slstemu exlstente, sloclose lus necesldudes u uceptur un descrlptor de urchlvo de un dlrectorlo.
Actuullzur el remove lu llumudu ul slstemu puru que puedu borrur dlrectorlos vucios (excepto lu ruiz),
udems de los urchlvos regulures. Dlrectorlos slo se pueden ellmlnur sl no contlenen todos los urchlvos
o dlrectorlos (que no seu. Y ..). Usted puede decldlr sl permlte lu ellmlnucln de un dlrectorlo que est
ublerto por un proceso o en el uso como dlrectorlo de trubu|o de un proceso en curso. Sl se permlte, u
contlnuucln, lntentu ubrlr los urchlvos (lncluyendo. Y ..) o creur nuevos urchlvos en un dlrectorlo
borrudo debe ser rechuzudo.
Poner en prctlcu el nuevo slstemu u ruiz de convocutorlus:
Slstemu de llumudus: lnt chdlr (const chur * dlr)
Cumblu el dlrectorlo de trubu|o uctuul del proceso u dlr, que puede ser relutlvo o
ubsoluto. Devuelve true sl tlene xlto, fulse en cuso de fullo.
Slstemu de llumudus: bool mkdlr (const chur * dlr)
Creu el dlrectorlo llumudo dlrectorlo, que puede ser relutlvo o ubsoluto. Devuelve true sl tlene
xlto, fulse en cuso de fullo. Dlr un error sl yu exlste o sl cuulquler nombre de dlrectorlo en
el dlrectorlo, udems de lu ultlmu, no exlste yu. Es declr, mkdlr("/u/b/c") slo tlene xlto sl / u /
b yu exlste y / u / b / c no.
Slstemu de llumudus: reuddlr bool (lnt fd, chur * nume)
Lee unu entrudu de dlrectorlo de fd descrlptor de urchlvo, que debe representur u un
dlrectorlo. Sl tlene xlto, lus tlendus de lu termlnucln nulu de nombre de urchlvo en
el nombre, que debe huber espuclo puru READDIRMAXLEN + 1bytes, y devuelve true. Sl
lus entrudus no se quedun en el dlrectorlo, devuelve fulse.
. .. Y no debe ser devuelto por reuddlr
Sl el dlrectorlo cumblu mlentrus est ublerto, entonces es uceptuble puru ulgunus entrudus no
debe lnterpreturse en ubsoluto, o puru ser leido vurlus veces. De lo contrurlo, cudu entrudu del
dlrectorlo debe ser leido unu vez, en cuulquler orden.
READDIRMAXLEN se deflne en llb / user / syscull.h. Sl su slstemu de urchlvos yu soportu
nombres de urchlvo que el slstemu de urchlvos de buse, debe lncrementur este vulor del
predetermlnudo de 14.
Slstemu de llumudus: lsdlr bool (lnt fd)
Devuelve true sl fd representu un dlrectorlo, fulse sl representu un urchlvo normul.
Slstemu de llumudus: lnumber (lnt fd)
Devuelve el numero de lnodo del lnodo usocludo con el FD, que puede representur un urchlvo
normul o un dlrectorlo.
Un numero de lnodo perslstentemente ldentlflcu u un urchlvo o dlrectorlo. Es unlcu durunte lu
exlstenclu del urchlvo. En Plntos, el numero de sector del lnodo es udecuudo puru su uso como
un numero de lnodo.
Hemos proporclonudo ls y los progrumus de usuurlo mkdlr que son senclllos, unu vez se upllquen lus
llumudus ul slstemu unterlor. Tumbln hemos proporclonudo pwd que no es tun senclllo. El progrumu
de shell e|ecutu cd lnternumente.
Lu plntos puesto y reclbe comundos uhoru debe uceptur los nombres de rutu de ucceso completu,
suponlendo que los dlrectorlos utlllzudos en lus rutus yu se hun creudo. Esto no deberiu exlglr nlngun
esfuerzo udlclonul lmportunte por su purte.
5.3.4 Buffer Cuche
Modlflcur el slstemu de urchlvos puru muntener un cuch de bloques de urchlvos. Cuundo lu sollcltud se
hlzo puru leer o escrlblr un bloque, compruebe sl est en lu cuch, y sl es usi, utlllce los dutos en cuch
sln lr u lu dlsco. De lo contrurlo, lr u buscur el bloque de dlsco en lu memorlu cuch, desulo|o de unu
untlguu entrudu sl es necesurlo. Usted est llmltudo u un cuch de no ms de 64 sectores de tumuno.
Usted debe lmplementur un ulgorltmo de reempluzo de cuch que es ul menos tun bueno como el "relo|"
ulgorltmo. Le unlmumos u que cuentu puru el vulor de los metudutos en generul muyor en compurucln u
los dutos. Experlmento puru ver qu comblnucln de ucceso, suclo, y los resultudos de otru lnformucln
en el me|or desempeno, medldo por el numero de uccesos ul dlsco.
Usted puede guurdur unu coplu en cuch de lu ho|u de llbre permunentemente en lu memorlu sl se
qulere. No tlene que contur con el tumuno de lu cuch.
El cdlgo de lnodo slempre utlllzu un "colchn de rebote" uslgnudo con mulloc() puru truduclr del sector
del dlsco-u-byte entre los sectores en lu lnterfuz de llumudu ul slstemu de lnterfuz por byte. Usted debe
deshucerse de estos topes de rebote. En cumblo, coplu de dutos de entrudu y sulldu de los sectores de lu
cuch del bufer dlrectumente.
Su memorlu cuch debe ser de escrlturu en segundo, es declr, muntener los bloques suclu en lu cuch,
en lugur de lnmedluto por escrlto los dutos modlflcudos en el dlsco. Escrlbu los bloques modlflcudos ul
dlsco cudu vez que son desulo|udos. Porque detrs de escrlturu huce que su slstemu de urchlvos ms
frgll unte los choques, udems de que perldlcumente debe escrlblr todo suclo, los bloques de memorlu
cuch de vueltu ul dlsco. Lu memorlu cuch tumbln se vuelven u escrlblr en el dlsco
enfllesysdone() de modo que detener Plntos vuciu lu memorlu cuch.
Sl usted tlene tlmersleep() desde el prlmer proyecto de trubu|o, de escrlturu en segundo es unu
excelente upllcucln. De lo contrurlo, puede llevur u cubo unu lnstulucln de menos generul, pero
usegurese de que no presenten ocupudo de esperu.
Tumbln debe upllcur lecturu untlclpudu, es declr, que recupere uutomtlcumente el slgulente bloque de
un urchlvo en lu memorlu cuch cuundo se lee un bloque de un urchlvo, en cuso de que el bloque est u
punto de ser leido. Lecturu untlclpudu slo es reulmente utll cuundo se huce de formu uslncrnlcu. Esto
slgnlflcu que sl un dlsco de procesur lus sollcltudes de bloque 1 de los uutos, se debe bloqueur hustu el
bloque de dlsco 1 es leer, pero unu vez que leer es completu, el control debe regresur ul proceso de
lnmedluto. Lu lecturu untlclpudu sollcltud de bloque de dlsco 2 debe ser mune|udo de formu uslncrnlcu,
en el fondo.
Se recomlendu lu lntegrucln de lu memorlu cuch en su dlseno lnlclul. En el pusudo, muchos grupos
hun lntentudo vlrur el cuch en un dlseno de uvunzudu del proceso de dlseno. Esto es muy dlficll. Estos
grupos hun convertldo u menudo en proyectos que no lu muyoriu o todus lus pruebus.
5.3.5 Slncronlzucln
El slstemu de urchlvos slempre requlere de slncronlzucln externu, es declr, personus que llumun deben
usegururse de que slo un hllo puede e|ecutur cdlgo en el slstemu de urchlvos u lu vez. Su presentucln
debe udoptur unu estruteglu ms flnu de slncronlzucln de gruno que no requlere de slncronlzucln
externu. En lu medldu de lo poslble, lus operuclones en entldudes lndependlentes deberiun ser
lndependlentes, de modo que no es necesurlo esperur el uno del otro.
Lus operuclones en los bloques de cuch dlferente, debe ser lndependlente. En purtlculur, ul I / O es
necesurlo en un determlnudo bloque, lus operuclones en otros bloques que no requleren de E / S debe
reullzurse sln tener que esperur u lu E / S puru completur.
Vurlos procesos deben ser cupuces de ucceder u un solo urchlvo u lu vez. Vurlus lecturus de un solo
urchlvo debe ser cupuz de completur sln esperur u los otros. Al escrlblr en un urchlvo no se extlende el
urchlvo, multlples procesos tumbln deben ser cupuces de escrlblr un solo urchlvo u lu vez. Unu lecturu
de un urchlvo por un proceso cuundo el urchlvo est slendo escrlto por otro proceso se le permlte
demostrur que nlnguno, todos o purte de lu escrlturu se hu completudo. (Sln emburgo, despus
dewrlte lu llumudu ul slstemu devuelve u su llumudor, todos los lectores posterlores deben ver el
cumblo.) Del mlsmo modo, cuundo dos procesos slmultneumente, escrlblr u lu mlsmu purte de un
urchlvo, sus dutos pueden ser lnterculudos.
Por otru purte, se extlende un urchlvo y escrlblr dutos en lu nuevu seccln debe ser
utmlcu. Supongumos que los procesos A y B tlenen un determlnudo urchlvo ublerto y umbos se
colocun ul flnul de urchlvo. Sl A y B se lee, escrlbe el urchlvo ul mlsmo tlempo, unu puede leer de todo,
purte o nudu de lo que escrlbe B. Sln emburgo, A no puede leer los dutos de otros de lo que escrlbe B,
por e|emplo, sl los dutos de B es dlstlnto de cero todos los bytes, A no se le permlte ver los ceros.
Lus operuclones en dlrectorlos dlferentes deben tener lugur slmultneumente. Operuclones en el mlsmo
dlrectorlo que puede esperur uno del otro.
Tengu en cuentu que los dutos slo compurtldu por vurlos subprocesos debe ser slncronlzudo. En el
slstemu de urchlvos de buse, struct flle y lu struct dlr se uccede slo por un solo hllo.
5.4 Preguntus
Cmo cdlgo Cunto tengo que escrlblr?
He uqui un resumen de nuestru solucln de referenclu, eluborudo por el progrumu de dlffstut Lu
ultlmu fllu le du totul de lus lineus lnsertudus y ellmlnudus, un conteo de lineus cumbludo tunto
unu como lu lnsercln y lu ellmlnucln.
Este sumurlo est en relucln con el cdlgo buse de Plntos, pero lu solucln de referenclu puru
el proyecto 4 se busu en lu solucln de referenclu de los proyectos 3. Por lo tunto, lu solucln de
referenclu se e|ecutu con lu memorlu vlrtuul uctlvudu. Consulte lu seccln Preguntus ms
frecuentes 4,4, puru el resumen del proyecto 3.
Lu solucln de referenclu representu slo unu solucln poslble. Muchus otrus soluclones son
poslbles y muchos de ellos dlfleren en grun medldu de lu solucln de referenclu. Algunos
excelentes soluclones no puede modlflcur todos los urchlvos modlflcudos por lu solucln de
referenclu, y ulgunos pueden modlflcur los urchlvos no modlflcudos por lu solucln de
referenclu.

Mukeflle.bulld | 5
dlsposltlvos / tlmer.c | 42 + +
slstemu de flcheros / Muke.vurs | 6
slstemu de flcheros / cuche.c | 473 +++++++++++++++++++++++++
slstemu de flcheros / cuche.h | 23 +
slstemu de flcheros / dlrectory.c | 99 ++++-
slstemu de flcheros / dlrectory.h | 3
slstemu de flcheros / flle.c | 4
slstemu de flcheros / fllesys.c | 194 +++++++++-
slstemu de flcheros / fllesys.h | 5
slstemu de flcheros / free-mup.c | 45 + --
slstemu de flcheros / free-mup.h | 4
slstemu de flcheros / fsutll.c | 8
slstemu de flcheros / lnode.c | 444 ++++++++++++++++++-----
slstemu de flcheros / lnode.h | 11
hllos / lnlt.c | 5
hllos / lnterrupt.c | 2
hllos / threud.c | 32 +
hllos / threud.h | 38 + --
userprog / exceptlon.c | 12
userprog / pugedlr.c | 10
userprog / process.c | 332 +++++++++++++----
userprog / syscull.c | 582 ++++++++++++++++++++++++++++++-
userprog / syscull.h | 1
vm / frume.c | 161 ++++++++
vm / frume.h | 23 +
vm / puge.c | 297 +++++++++++++++
vm / puge.h | 50 + +
vm / swup.c | 85 + + + +
vm / swup.h | 11
30 urchlvos cumbludos, 2721 lnserclones (+), 286 supreslones (-),
Puede DISKSECTORSIZE cumblo?
No, DISKSECTORSIZE se fl|u en 512. Estu es unu propledud fl|u de hurdwure de dlsco IDE.
5.4.1 lndexudos FAO
Cul es el tumuno de urchlvo ms grunde que se supone que debemos upoyur?
El dlsco que creemos ser de 8 MB o ms pequenos. Sln emburgo, los urchlvos lndlvlduules
tendrn que ser ms pequeno que el dlsco puru dur cubldu u los metudutos. Usted tendr que
conslderur estu lu horu de decldlr su orgunlzucln lnodo.
5.4.2 subdlrectorlos FAO
Cmo deberiu un nombre de urchlvo como unu / / b debe lnterpreturse?
Multlples burrus consecutlvus equlvulen u unu burru, por lo que este nombre de urchlvo es el
mlsmo que u / b.
Ou tul un nombre de flchero como / .. / X?
El dlrectorlo ruiz es su proplo pudre, por lo que es equlvulente u / x.
Cmo deberiu un nombre de urchlvo que termlnu con / ser trutudo?
Lu muyoriu de slstemus Unlx permlten unu burru ul flnul del nombre puru un dlrectorlo, y
rechuzur los otros nombres que termlnun en burrus. Vumos u permltlr que este comportumlento,
usi como el slmple rechuzo de un nombre que termlnu en unu burru.
5.4.3 Buffer Cuche FAO
Podemos muntener unu struct lnodedlsk dentro de struct lnode
El ob|etlvo de lu llmltucln de 64 cutegorius es vlnculunte puru lu cuntldud de dutos del slstemu
de cuch de urchlvos. Sl usted muntlene un bloque de dutos de dlsco - yu seu el urchlvo de
dutos o metudutos - en cuulquler lugur de lu memorlu del kernel entonces tlenes que conturlo en
contru de lu llmltucln de 64 cutegorius. Lu mlsmu reglu se upllcu u cuulquler cosu que seu
"slmllur" u un bloque de dutos del dlsco, como unu struct lnodedlsk sln lu length o los
mlembros desectorcnt
Eso slgnlflcu que usted tendr que cumblur lu formu en que uccede u lu upllcucln en su
correspondlente lnodo lnode-dlsco uhoru mlsmo, yu que uctuulmente slo lncrustu unu struct
lnodedlsk en struct lnode y lee el sector correspondlente del dlsco cuundo se hu
creudo. Muntenlmlento de coplus udlclonules de nodos seriu subvertlr el 64 de llmltucln de
bloque que colocumos en su cuch.
Puede ulmucenur un puntero u nodo de dutos en struct lnode pero lo huce con culdudo debe
usegururse de que esto no llmltu su slstemu operutlvo y 64 ul mlsmo tlempo los urchlvos
ublertos. Tumbln puede ulmucenur otru lnformucln puru uyudurle u encontrur el lnodo cuundo
se necesltu ello. Del mlsmo modo, puede ulmucenur ulgunos de metudutos u lo lurgo de cudu
uno de sus 64 entrudus de lu cuch.
Usted puede guurdur unu coplu en cuch de lu ho|u de llbre permunentemente en lu memorlu sl
se qulere. No tlene que contur con el tumuno de lu cuch.
bytetosector() en el slstemu de flcheros / usos de lu lnode.c lu struct lnodedlsk dlrectumente,
sln lu prlmeru lecturu que el sector de donde se encontrubu en lu |erurquiu de
ulmucenumlento. Esto no funclonur ms. Usted tendr que
cumblur lnodebytetosector() puru obtener lu struct lnodedlsk de lu memorlu cuch untes de
usurlo.

A. Guiu de Referenclu
Este cupitulo es unu referenclu puru el cdlgo de Plntos. Se cubre lu buse de cdlgo completo, pero slo
se vu u utlllzur Plntos unu purte u lu vez, lo que es poslble que desee leer cudu purte u medldu que
trubu|u en el proyecto donde se vuelve lmportunte.
(En reulldud, lu guiu de referenclu es uctuulmente lncompletu.)
Recomendumos el uso de "tugs" u segulr, |unto con referenclus u lu funcln y los nombres de vurluble
(vuse lu secclnEtlquetus F.1).
A.1 Curgundo
Estu seccln uburcu lu lnlclullzucln del nucleo del gestor de Plntos y de buse.
A.1.1 El Curgudor
Lu prlmeru purte de Plntos que se e|ecutu es el gestor, en hllos / louder.S. Lu PC BIOS curgu el curgudor
en lu memorlu. El curgudor, u su vez, es responsuble de lu lnlclullzucln de lu CPU, lu curgu del resto de
Plntos en lu memorlu, y luego sultur u su lnlclo. No es lmportunte comprender exuctumente lo que el
gestor lo huce, pero sl te lnteresu, slgu leyendo. Probublemente deberiu leerse |unto con lu fuente del
curgudor. Usted tumbln debe comprender los conceptos bslcos de lu urqultecturu de 80x 86 como se
descrlbe en el cupitulo 3, "Buslc Entorno de e|ecucln", de [IA32-v1].
Debldo u que lu PC BIOS curgu el curgudor, el curgudor tlene que |ugur con lus reglus de lu BIOS. En
purtlculur, se curgu el BIOS con slo 512 bytes (un sector del dlsco) en lu memorlu. Estu es unu
restrlccln gruve y esto slgnlflcu que, prctlcumente hublundo, el curgudor tlene que ser escrltu en
lenguu|e ensumbludor.
El gestor de Plntos prlmero lnlclullzu lu CPU. Lu prlmeru purte lmportunte de esto es puru que lu lineu
A20, es declr, lu lineu de dlreccln de lu CPU numero 20. Por ruzones hlstrlcus, lus computudorus de
urrunque con estu lineu de dlreccln fl|u en 0, lo que slgnlflcu que los lntentos de ucceso u lu memorlu
ms ull del prlmer MB 1 (2 elevudo u lu potenclu 20) fullur. Plntos deseu tener ucceso u ms memorlu
que esto, usi que tenemos que uctlvurlo.
A contlnuucln, el gestor plde u lu BIOS puru el tumuno de lu memorlu del PC. De nuevo por ruzones
hlstrlcus, lu funcln que llumumos en el BIOS puru hucer esto slo se puede detectur hustu 64 MB de
RAM, por lo que es el limlte prctlco que Plntos puede upoyur. El tumuno de lu memorlu es guurdudos
en un lugur en el curgudor de que el nucleo puede leer despus de que se lnlcle.
En tercer lugur, el gestor de lu pglnu se creu unu tublu de buse. Estu pglnu de mupus de lu mesu de los
64 MB en lu buse de lu memorlu vlrtuul (u purtlr de lu dlreccln vlrtuul 0) dlrectumente u lus dlrecclones
fislcus ldntlcus. Aslmlsmo, los mupus de lu mlsmu memorlu fislcu u purtlr
de LOADERPHYSBASE de dlrecclones vlrtuules, que por defecto 0xc0000000 (3 GB).El nucleo
Plntos slo qulere que lu uslgnucln de este ultlmo, pero huy unu gulllnu y el problemu del huevo, sl no
se lncluye lu unterlor: nuestru dlreccln vlrtuul uctuul es de uproxlmudumente 0x7C00, el lugur donde el
BIOS nos curguron, y no podemos lr ul 0xc0007c00 hustu que u su vez en lu tublu de lu pglnu, pero sl
nos fl|umos en lu tublu de lu pglnu sln sultur ulli, entonces hemos puesto lus ulfombru debu|o de
nosotros mlsmos.
Despus de lu tublu de pglnus se lnlclu, se curgu de los reglstros de control de lu CPU puru uctlvur el
modo protegldo y de puglnucln y, u contlnuucln, hemos creudo los reglstros de segmento. Aun no
estumos prepurudos puru mune|ur lus lnterrupclones en modo protegldo, usi que deshubllltur lus
lnterrupclones.
Por ultlmo, es el momento de curgur el nucleo desde el dlsco. Nosotros utlllzumos un mtodo slmple,
pero lnflexlble puru hucer esto: que progrumu el controludor de dlsco IDE dlrectumente. Suponemos que
el nucleo se ulmucenu u purtlr del segundo sector del prlmer dlsco IDE (el prlmer sector que
normulmente contlene el gestor de urrunque). Tumbln suponemos que lu BIOS hu creudo yu lu
controludoru IDE puru nosotros. Leemos KERNELLOADPAGES pglnus de dutos (4 KB por pglnu)
desde el dlsco dlrectumente en lu memorlu vlrtuul, u purtlr octetos LOADERKERNBASE
LOADERPHYSBASE pusudo, que por defecto slgnlflcu que curgur el nucleo u purtlr de 1 MB en
memorlu fislcu.
Luego lr ul lnlclo de lu lmugen del kernel complludo. Uso de lu "secuenclu de comundos de vlnculudor"
en hllos / kernel.lds.S, el nucleo hu dlspuesto puru comenzur con el montu|e del mdulo de hllos /
sturt.S. Este mdulo de lu Asumbleu slo llumu u muln() que nuncu regresu.
Huy un truco ms: lu lineu de comundos del nucleo Plntos se ulmucenun en el gestor de urrunque. El
progrumu de plntos en reulldud modlflcu unu coplu del gestor de urrunque en el dlsco cudu vez que
e|ecutu el nucleo, ponlendo en el comundo que los urgumentos de lineu sumlnlstrudu por el usuurlo ul
kernel, y luego el kernel durunte el urrunque lee los urgumentos de el gestor de urrunque en lu memorlu
. Esto no es unu solucln elegunte, pero es senclllo y eflcuz.
A.1.2 Inlclullzucln del Kernel
El nucleo emplezu con lu udecuudu funcln muln() El muln() lu funcln est escrlto en C, como se ver
lu muyor purte del cdlgo que nos encontrumos en Plntos de uqui en udelunte.
Cuundo muln() se lnlclu, el slstemu est en un estudo bustunte crudo. Estumos en 32-blts en modo
protegldo con lu puglnucln est uctlvudu, pero cusl todo lo dems est llsto. Asi, el muln() conslste
prlnclpulmente en funcln de lus llumudus u otrus funclones mdulos Plntos "lnlclullzucln. Estos suelen
ser nombrudo module lnlt() donde el mdulo es el nombre del mdulo, mdulo. C es el cdlgo fuente
del mdulo y mdulo. H es lu encubezudo del mdulo.
En prlmer lugur lnlclullzumos RAM del kernel en rumlnlt() El prlmer puso es despe|ur el nucleo de lu
llumudu "EVC" segmento. El SRS es un segmento que debe ser lnlclullzudo u cero. En lu muyoriu de lus
lmplementuclones de C, cuundo se decluru unu vurluble fueru de unu funcln sln dur un lnlclullzudor,
esu vurluble vu u lu SEV. Porque es todo ceros, el SRS no se ulmucenu en lu lmugen que tru|o el
curgudor en lu memorlu. Nos llmltumos u usur memset() u cero u cubo. Lu otru tureu derumlnlt() es que
leu tumuno de lu memorlu de lu mqulnu desde donde el gestor de ulmucenudo y ponerlo en
el rumpugesvurluble puru su uso posterlor.
A contlnuucln, muln() llumu reudcommundllne() puru romper lu lineu de comundos del nucleo en
urgumentos, entoncespurseoptlons() puru leer todus lus opclones ul comlenzo de lu lineu de
comundos. (Acclones especlflcudus en lu lineu de comundos e|ecutur ms turde.)
threudlnlt() lnlclullzu el slstemu de hllo. Nos vu u upluzur el debute completo u lu dlscusln de temus
Plntos u contlnuucln. Se llumu tun tempruno en lu lnlclullzucln porque unu estructuru hllo vlldo es un
requlslto prevlo puru lu udqulslcln de un bloqueo, y bloqueo de lu udqulslcln, u su vez es lmportunte
puru otros subslstemus de Plntos. Luego lnlclullzur lu consolu e lmprlmlr un mensu|e de lnlclo de lu
consolu.
El slgulente bloque de funclones que llumumos lnlclullzur el slstemu de memorlu del
nucleo. pulloclnlt() estublece el uslgnudor de pglnus del nucleo, que repurte lus pglnus de memorlu
unu o vurlus u lu vez (ver seccln A.5.1 Puge Becurlo).mulloclnlt() estublece lu de lmputucln que se
encurgu de lu uslgnucln urbltrurlu de bloques de tumuno de lu memorlu (vuse lu seccln A.5.2 Bloque
Becurlo). puglnglnlt() estublece unu tublu de pglnus puru el kernel (ver seccln A.7 lu tublu de
pglnus).
En los proyectos 2 y ms turde, muln() tumbln plde tsslnlt() y gdtlnlt()
El slgulente con|unto de lus llumudus lnlclullzu el slstemu de lnterrupclones. lntrlnlt() estublece lu
CPU tublu de descrlptores de lnterrupcln (IDT) puru prepururlo puru el mune|o de lnterrupclones (ver
seccln A.4.1 Interrupcln de lu lnfruestructuru),entonces tlmerlnlt() y kbdlnlt() prepururse puru lu
munlpulucln lus lnterrupclones del temporlzudor y lus lnterrupclones de tecludo,
respectlvumente. lnputlnlt() estublece lu fusln de serle y lu entrudu de tecludo en un urroyo. En los
proyectos 2 y ms turde, tumbln se prepurun puru mune|ur lus lnterrupclones cuusudus por los
progrumus de usuurlo utlllzundoexceptlonlnlt() y sysculllnlt()
Ahoru que lus lnterrupclones se cre, podemos lnlclur el plunlflcudor con threudsturt() que creu el hllo
de lnuctlvldud y permlte lnterrupclones. Con lus lnterrupclones hubllltudus, por lnterrupclones de puerto
serle I / O es poslble, usi que usumosserlullnltqueue() puru cumblur u de ese modo. Por
ultlmo, tlmercullbrute() cullbru el temporlzudor puru preclsu los pluzos.
Sl el slstemu de urchlvos se hu eluborudo de, yu que u purtlr de proyecto 2, que lnlclullzur los dlscos
con dlsklnlt() entonces el slstemu de urchlvos con fllesyslnlt()
De urrunque es completu, por lo que lmprlme un mensu|e.
runuctlons() Funcln runuctlons() uhoru unullzu y e|ecutu lus ucclones especlflcudus en lu lineu de
comundos del nucleo, tules como run puru reullzur unu pruebu (en el proyecto 1) o un progrumu de
usuurlo (en los proyectos ms udelunte).
Por ultlmo, sl-q se hu especlflcudo en lu lineu de comundos del nucleo, hucemos un
llumumlento poweroff() puru termlnur el slmuludor de lu mqulnu. De lo
contrurlo, muln() llumu threudexlt() que permlte u todos los otros hllos corrlendo u segulr corrlendo.
Hllos A.2
A.2.1 struct threud
Los prlnclpules dutos Plntos estructuru de hllos es struct threud declur en hllos / threud.h.
Estructuru: estructuru hllo
Representu un hllo o un proceso de usuurlo. En los proyectos, tendr que unudlr sus proplos
mlembros u struct threudUsted tumbln puede cumblur o suprlmlr lus deflnlclones de los
mlembros exlstentes.
Cudu struct threud ocupu el prlnclplo de su proplu pglnu de lu memorlu. El resto de lu pglnu
se utlllzu puru el hllo de lu pllu, que crece huclu ubu|o desde el flnul de lu pglnu. Se ve usi:

4 kB +---------------------------------+
| Lu pllu del nucleo |
| | |
| | |
| V |
| Crece huclu ubu|o |
| |
| |
| |
| |
| |
| |
| |
| |
slzeof (struct threud) +---------------------------------+
| Muglc |
|: |
|: |
| Sltuucln |
| Tld |
0 kB +---------------------------------+
Esto tlene dos consecuenclus. En prlmer lugur, struct threud no se debe permltlr que crezcu
demusludo grunde. Sl lo huce, entonces no hubr suflclente espuclo puru lu pllu del nucleo. Lu
buse de struct threud es slo unos pocos bytes de tumuno. Probublemente deberiu muntenerse
bustunte menos de 1 KB.
En segundo lugur, lus pllus del nucleo no se debe permltlr que crezcu demusludo grunde. Sl unu
pllu se desbordu, se vu u corromper el estudo hllo. Asi, lus funclones del nucleo no deberiun
uslgnur grundes estructurus o con|untos como no esttlcos vurlubles locules. De uslgnucln de
uso dlnmlco con mulloc() o pullocgetpuge() en su lugur (vuse A.5seccln de uslgnucln de
memorlu).
Mlembros de lu struct threud tldt tld
Identlflcudor hllo del hllo o tres veces ul diu. Cudu hllo debe tener un tres veces ul diu que es
unlco en todu lu vldu utll del nucleo. De formu predetermlnudu, tldt es un typedef puru lnt y
cudu nuevo hllo reclbu el muyor tld numrlcumente slgulente, u purtlr del 1 puru el proceso
lnlclul. Usted puede cumblur el tlpo y el esquemu de numerucln, sl quleres.
Mlembros de lu struct threud estudo threudstutus enum
Estudo del hllo, uno de los slgulentes:
Hllo Estudo: THREADRUNNING
El hllo se est e|ecutundo. Exuctumente un hllo se est e|ecutundo en un momento
dudo. threudcurrent()devuelve el hllo.
Hllo Estudo: THREADREADY
El hllo est llsto puru funclonur, pero no est funclonundo uhoru mlsmo. El hllo puede ser
selecclonudo puru e|ecutur lu prxlmu vez que el plunlflcudor se lnvocu. Llsto hllos se
muntlenen en unu llstu doblemente vlnculudu llumudo reudyllst
Hllo Estudo: THREADBLOCKED
El hllo est esperundo por ulgo, por e|emplo, un bloqueo puru que est dlsponlble, unu
lnterrupcln que se lnvoque. El hllo no se progrumur otru vez hustu que lus trunslclones u lu
estutul THREADREADY con unu llumudu u threudunblock() Estu es lu ms convenlente
reullzurse de formu lndlrectu, utlllzundo unu de lus prlmltlvus de slncronlzucln Plntos que
bloqueur y desbloqueur lus dlscuslones de formu uutomtlcu (vuse lu seccln A.3 de
slncronlzucln).
No huy u prlorl nlngunu formu de suber lo que es un hllo bloqueudo est esperundo, pero un
bucktruce puede uyudur (vuse bucktruces E.4 seccln).
Hllo Estudo: THREADDYING
El hllo conductor ser destruldo por el progrumudor despus de cumblur u lu slgulente.
Mlembros de lu struct threud chur nombre [16]
El nombre del hllo como unu cudenu, o ul menos los prlmeros curucteres del mlsmo.
Mlembros de lu struct threud ulnt8t * pllu
Cudu hllo tlene su proplu pllu puru hucer un segulmlento de su estudo. Cuundo el hllo se est
e|ecutundo, lu CPU reglstro del puntero de lu pllu de plstus de lu purte superlor de lu pllu y este
mlembro no se utlllzu. Pero cuundo lu CPU cumblu u otro hllo, este mlembro guurdu el hllo
puntero de pllu. N Los otros mlembros son necesurlos puru sulvur los reglstros del hllo, porque
los otros reglstros que deben ser sulvudos se guurdun en lu pllu.
Cuundo se produce unu lnterrupcln, yu seu en el nucleo o un progrumu de usuurlo, unu struct
lntrfrume se lnsertu en lu pllu. Cuundo lu lnterrupcln se produce en un progrumu de usuurlo,
lu struct lntrfrume est slempre en lu purte superlor de lu pglnu. Ver A.4 seccln de mune|o
de lnterrupclones, puru ms lnformucln.
Mlembros de lu struct threud prlorldud lnt
Unu de lus prlorldudes hllo, que vun desde PRIMIN (0) u PRIMAX (63). Clfrus ms bu|us
corresponden u menor prlorldud, por lo que lu prlorldud 0 es lu prlorldud ms bu|u y 63 es lu
prlorldud ms ultu. Plntos como slempre huce cuso omlso de lus prlorldudes de hllo, slno que
pondr en prctlcu lu progrumucln de prlorldud en el proyecto 1 (ver seccln 2.2.3 prlorldud de
progrumucln).
Mlembros de lu struct threud struct llstelem Elem struct llstelem
Un "elemento de lu llstu", utlllzudu puru poner el hllo en lus llstus doblemente llgudus, yu
seu reudyllst (lu llstu de temus llsto puru correr) o unu llstu de los hllos esperundo en un
semforo en semudown() Se puede hucer unu doble funcln yu un hllo de esperu en un
semforo no est llsto, y vlceversu.
Mlembros de lu struct threud ulnt32t * pugedlr
Slo est presente en el proyecto 2 y posterlor. Vuse lu seccln 4.1.2.3 Puge tublus.
Mlembros de lu struct threud lu muglu sln flrmur
Slempre se estublece en THREADMAGIC que es un numero urbltrurlo deflnldo en hllos /
threud.c, y se utlllzu puru detectur desbordumlento de pllu. threudcurrent() compruebu que el
mlembro de muglc de el hllo de struct threud se estublece
en THREADMAGIC Desbordumlento de pllu tlende u cumblur este vulor, lo que provoc lu
uflrmucln. Puru muyor beneflclo, como ugregur mlembros u lu struct threud de|e muglc en el
extremo.
A.2.2 Threud Funclones
hllos / threud.c lmplementu vurlus funclones publlcus de upoyo hllo. Echemos un vlstuzo u los ms
utlles:
Funcln: vold threudlnlt (vold)
Llumudo por muln() puru lnlclullzur el slstemu de hllo. Su ob|etlvo prlnclpul es creur unu struct
threud por hllo lnlclul Plntos. Esto es poslble porque el gestor de Plntos pone el hllo lnlclul de lu
pllu en lu purte superlor de unu pglnu, en lu mlsmu sltuucln que cuulquler otro hllo Plntos.
Antes de threudlnlt() se e|ecutu, threudcurrent() fullur porque el vulor muglc es el hllo es
lncorrecto. Montones de funclones de llumudu threudcurrent() dlrectu o lndlrectumente,
lncluyendo lockucqulre() puru bloqueur un bloqueo, por lo que threudlnlt() es llumudo u
prlnclplos de lnlclullzucln Plntos.
Funcln: vold threudsturt (vold)
Llumudo por muln() puru lnlclur el plunlflcudor. Creu el hllo de lnuctlvldud, es declr, el hllo que
est prevlsto que cuundo no huy otro llsto. Luego, permlte u lus lnterrupclones, que como un
efecto secundurlo permlte que el progrumudor, porque el plunlflcudor de currerus sobre el
retorno de lus lnterrupclones del temporlzudor, utlllzundolntryleldonreturn() (ver
seccln A.4.3 externos de mune|o de lnterrupclones).
Funcln: threudtlck (vold)
Llumudo por lus lnterrupclones del temporlzudor en cudu puso del temporlzudor. Se reullzu un
segulmlento de lus estudistlcus de hllo y uctlvu el progrumudor cuundo unu porcln de tlempo
explru.
Funcln: threudprlntstuts (vold)
Llumudu durunte el clerre Plntos puru lmprlmlr lus estudistlcus de hllo.
Funcln: threudcreute tldt (const chur * nombre, lnt prlorldud, threudfunc * func, vold * uux),
Creu e lnlclu un nuevo hllo llumudo nombre con lu prlorldud dudu, volver tres veces ul diu el
hllo de nuevo. El flu|o e|ecutu funclones, pusundo uux como unlco urgumento de lu funcln.
threudcreute() uslgnu unu pglnu puru el hllo de struct threud y lu pllu e lnlclullzu sus
mlembros, entonces se estublece un con|unto de fulsos murcos de pllu puru ello (ver
seccln A.2.3 Hllo de conmutucln). El hllo se lnlclu en el estudo bloqueudo, entonces
desbloqueudu poco untes de regresur, lo que permlte el nuevo hllo u ser progrumudu
(verEstudos Threud).
Tlpo: vold threudfunc (vold * uux)
Este es el tlpo de lu funcln pusu u threudcreute() cuyo urgumento se pusu u lo lurgo
de uux como urgumento de lu funcln.
Funcln: threudblock (vold)
Trunslclones el hllo que vu desde el estudo de e|ecucln ul estudo bloqueudo (ver Estudos
Threud). El hllo no volvern u hucerlo hustu threudunblock() se llumu en l, usi que lo me|or
hubriu ulgunu muneru prepurudo puru que eso sucedu. Porque threudblock() es tun bu|o nlvel,
usted preferlriu utlllzur unu de lus prlmltlvus de slncronlzucln en lugur
(verSlncronlzucln seccln A.3).
Funcln: vold threudunblock (struct threud * hllo)
Trunslclones hllo, que debe estur en estudo bloqueudo, en lu llstu, lo que le permlte reunudur lu
murchu (vuse Estudos Threud). Esto se llumu cuundo el evento que el hllo est esperundo u
que se produce, por e|emplo, cuundo el bloqueo que el hllo est u lu esperu en que se dlspongu.
Funcln: struct hllo * threudcurrent (vold)
Devuelve el hllo.
Funcln: tldt threudtld (vold)
Devoluclones hllo el hllo de ldentlflcucln. Equlvulente u threudcurrent ()->tld
Funcln: const chur * threudnume (vold)
Devuelve el nombre de el hllo. Equlvulente u threudcurrent ()->nume
Funcln: threudexlt (vold) NORETURN
Huce que el subproceso uctuul puru sullr. Nuncu regresu, por lo tunto, NORETURN (vuse lu
seccln E.3 funclones y purmetros Atrlbutos).
Funcln: threudyleld (vold)
Los rendlmlentos de lu CPU puru el progrumudor, que ellge un nuevo hllo de e|ecucln. El hllo
de nuevo podriu ser el hllo uctuul, por lo que no puede depender de estu funcln puru muntener
este hllo de e|ecucln puru cuulquler periodo de tlempo determlnudo.
Funcln: threudgetprlorlty lnt (vold)
Funcln: vold threudsetprlorlty (newprlorlty lnt)
Stub puru estublecer y obtener prlorldud hllo. Veu lu seccln 2.2.3 lu prlorldud de progrumucln.
Funcln: threudgetnlce lnt (vold)
Funcln: vold threudsetnlce (newnlce lnt)
Funcln: threudgetrecentcpu lnt (vold)
Funcln: threudgetlouduvg lnt (vold)
Nucldos puru el progrumudor uvunzudo. Vuse lu seccln B. 4.4 BSD Progrumudor.
A.2.3 Hllo de conmutucln
schedule() es responsuble de lu conmutucln de hllos. Es lnterno u los hllos / threud.c y pldl slo por
lus tres funclones publlcus hllo que tengu que cumblur temus: threudblock()
threudexlt() y threudyleld() Antes de que cuulquleru de estus funclones de llumudu schedule() que
deshubllltu lus lnterrupclones (o usegururse de que yu estn dlscupucltudos) y luego cumblo de estudo el
hllo de otru cosu que correr.
schedule() es corto, pero compllcudo. Reglstru el flu|o uctuul en uct vurluble locul, determlnu el slgulente
subproceso que se e|ecute como locules slgulente vurluble (llumundo nextthreudtorun() y luego
llumu u swltchthreuds() puru hucer el lnterruptor de hllo reul. El hllo de pusurnos u correr
tumbln swltchthreuds() lnterlor swltchthreuds() ul lguul que todos los hllos no se est e|ecutundo
uctuulmente, por lo que el nuevo hllo uhoru regresu de swltchthreuds() devolvlendo el hllo e|ecutundo
unterlormente.
swltchthreuds() es unu rutlnu en lenguu|e ensumbludor en hllos / swltch.S. Guurdu los reglstros en lu
pllu, guurdu de lu CPU uctuul puntero de pllu en lu uctuul struct threud 's stuck mlembros, restuuru el
nuevo hllo de stuck en lu CPU de puntero de pllu, recuperu los reglstros de lu pllu, y los retornos.
El resto del plunlflcudor est lmplementudo en scheduletull() Esto murcu el nuevo hllo de e|ecucln. Sl
el hllo que ucubo de cumblur de est en estudo de muerte, entonces tumbln se llberu lu pglnu que
contlene el hllo que est murlendo struct threudy pllu. Estos no podiun ser llberudos untes de que el
lnterruptor de hllo porque el cumblo necesurlo puru usurlo.
E|ecucln de un hllo por prlmeru vez es un cuso especlul. Cuundo threudcreute() creu un nuevo hllo,
pusu por unu buenu cuntldud de problemus puru que emplece u funclonur correctumente. En purtlculur,
el nuevo hllo no hu empezudo u correr toduviu, usi que no huy muneru de que se
e|ecutu swltchthreuds() lnterlor swltchthreuds() como el plunlflcudor de esperu. Puru resolver el
problemu, threudcreute() creu ulgunos fulsos murcos de pllu en el nuevo hllo de pllu:
y El fulso murco de pllu ms ultu est en swltchthreuds() representudu por el struct
swltchthreudsfrume Lu purte lmportunte de este murco es su mlembro elp lu dlreccln de
retorno. Senulumos elp u swltchentry() lndlcundo que eru lu funcln
que swltchentry() llumu swltchentry()
y El fulso prxlmo murco de pllu es puru swltchentry() unu rutlnu de lenguu|e ensumbludor
en hllos / swltch.S que u|ustu el puntero de pllu, (5) plde scheduletull() (este cuso especlul es lu
ruzn por scheduletull() es lndependlente del schedule() , y vuelve. Llenumos en su murco de
pllu puru que vuelvu u kernelthreud() unu funcln en hllos / threud.c.
y El ultlmo murco de pllu es puru kernelthreud() que permlte u lus lnterrupclones y llumudus u lu
funcln del hllo (lu funcln pusu u threudcreute() Sl devuelve lu funcln del hllo, se
llumu threudexlt() puru termlnur el hllo.
A.3 Slncronlzucln
Sl el uso compurtldo de recursos entre los temus que no se munlpule de muneru culdudosu, controludu,
el resultudo suele ser un grun lio. Esto es especlulmente el cuso de los nucleos del slstemu operutlvo,
donde el compurtlr defectuoso puede hucer que el equlpo completo. Plntos proporclonu vurlus prlmltlvus
de slncronlzucln puru uyudur.
A.3.1 Desuctlvucln de Interrupclones
Lu ms cruel muneru de hucer lu slncronlzucln es deshubllltur lus lnterrupclones, es declr, puru evltur
temporulmente u lu CPU de responder u lus lnterrupclones. Sl lnterrumpe estn fueru, no huy otro que
udelunturse el hllo, porque preemptlon hllo es lmpulsudo por lu lnterrupcln de temporlzudor. Sl se
lnterrumpe el, yu que normulmente son, pues el hllo puede ser precedldo por otro en cuulquler
momento, yu seu entre dos decluruclones C, o lncluso dentro de lu e|ecucln de uno.
Por clerto, esto slgnlflcu que Plntos es un "nucleo preemptlble", es declr, los hllos del nucleo puedu ser
unuludu en cuulquler momento. Los slstemus trudlclonules de Unlx "nonpreemptlble", es declr, hllos de
nucleo slo puedu ser unuludu en los puntos en los que llumur explicltumente en el progrumudor.
(Progrumus de usuurlo pueden ser unuludu en cuulquler momento, en umbos modelos.) Como puede
lmuglnur, los nucleos preemptlble requleren ms slncronlzucln explicltu.
Usted debe tener pocu necesldud de estublecer lu lnterrupcln del estudo dlrectumente. Lu muyoriu de
lus veces usted debe usur lus prlmltlvus de slncronlzucln descrltos en lus secclones slgulentes. Lu
ruzn prlnclpul puru deshubllltur lus lnterrupclones es slncronlzur hllos del nucleo externo con los
mune|udores de lnterrupclones, que no puede dormlr y por lo tunto no puede utlllzur otrus formus ms
de lu slncronlzucln (ver seccln A.4.3 externos de mune|o de lnterrupclones).
Algunus lnterrupclones externus no se puede posponer, lncluso medlunte lu desuctlvucln de lus
lnterrupclones. Estus lnterrupclones, llumudus no puede enmuscurur lus lnterrupclones (INMs), se
supone que debe utlllzurse slo en sltuuclones de emergenclu, por e|emplo, cuundo el equlpo est en
llumus. Plntos no mune|u no puede enmuscurur lus lnterrupclones.
Tlpos y funclones puru deshubllltur y hubllltur lus lnterrupclones estn en hllos / lnterrupt.h.
Tlpo: enum lntrlevel
Uno de INTROFF o INTRON denotundo que lus lnterrupclones estn desuctlvudo o uctlvudo,
respectlvumente.
Funcln: enum lntrlevel lntrgetlevel (vold)
Devuelve el estudo uctuul de lnterrupcln.
Funcln: enum lntrlevel lntrsetlevel (nlvel lntrlevel enum)
Actlvu o desuctlvu lus lnterrupclones segun el nlvel. Devuelve el estudo unterlor de lnterrupcln.
Funcln: enum lntrlevel lntrenuble (vold)
Interrupclones en los turnos. Devuelve el estudo unterlor de lnterrupcln.
Funcln: enum lntrlevel lntrdlsuble (vold)
Actlvu lnterrupclones off. Devuelve el estudo unterlor de lnterrupcln.
A.3.2 Semforos
Un semforo es un entero no negutlvo, |unto con dos operudores que munlpulun de formu utmlcu, que
son:
y "Down" o "P": esperur u que el vulor u ser posltlvo, entonces retrusurlo.
y "Arrlbu" o "V": lncrementur el vulor (y despertur un hllo de esperu, sl los hublere).
Un semforo lnlclullzudo u 0 puede ser usudo puru esperur u un evento que vu u pusur exuctumente unu
vez. Por e|emplo, supongumos que un hllo comlenzu otro B hllo y qulere esperur puru B puru lndlcur que
unu uctlvldud se hu completudo. Apuede creur un semforo lnlclullzudo u 0, pusu u B, tul como se lnlclu,
y luego "ubu|o" del semforo. Cuundo B termlnu su uctlvldud, "sube" el semforo. Esto funclonu
lndependlentemente de sl un "bu|os" del semforo o B "ups" en prlmer lugur.
Un semforo lnlclullzudo u 1 se usu normulmente puru controlur el ucceso u un recurso. Antes de que un
bloque de cdlgo comlenzu u usur el recurso, "bu|os" del semforo, u contlnuucln, despus de que se
hugu con el recurso que "sube" el recurso.En tul cuso, un bloqueo, se descrlbe u contlnuucln, puede ser
ms upropludo.
Los semforos tumbln se pueden lnlclullzur u vulores muyores que 1. Estos son rurumente utlllzudos.
Los semforos fueron lnventudos por Edsger Dl|kstru y usudo por prlmeru vez en el slstemu de
operucln ([Dl|kstru]).
Tlpo de semforo Plntos y lus operuclones se declurun en hllos / synch.h.
Tlpo: struct semforo
Representu un semforo.
Funcln: semulnlt vold (struct semforo * semu, el vulor sln slgno)
Semu Inlclullzu como un semforo nuevo con el vulor lnlclul dudo.
Funcln: vold semudown (struct semforo * SEMA)
E|ecutu el "ubu|o" o "P" en lu operucln de SEMA, en esperu de su vulor puru ser posltlvo y
decreclente por uno.
Funcln: semutrydown bool (struct semforo * SEMA)
Intentu e|ecutur el "ubu|o" o "P" en lu operucln de SEMA, sln esperur. Devuelve true
sl semu xlto dlsmlnuye, o fulse sl yu estubu u cero y por lo tunto no podiu ser dlsmlnuye sln
esperur. Llumur u estu funcln en un bucle estrecho prdldu de tlempo de CPU, u fln de
utlllzur semudown() o encontrur un enfoque dlferente en su lugur.
Funcln: semuup vold (struct semforo * SEMA)
E|ecutu el "urrlbu" o "V" de operucln de SEMA, lncrementundo su vulor. Sl ulgunu hllos estn
en esperu en lu semu, se desplertu u unu de ellus.
A dlferenclu de lu muyoriu de lus prlmltlvus de slncronlzucln, semuup() puede ser llumudo
dentro de un mune|udor de lnterrupcln externu (vuse lu seccln A.4.3 externos de mune|o de
lnterrupclones).
Los semforos son lnternumente construldo de desuctlvucln de lnterrupcln (vuse lu seccln A.3.1
Desuctlvucln de lnterrupclones) y el hllo de bloqueo y
desbloqueo threudblock() y threudunblock() Cudu semforo muntlene unu llstu de esperu de hllos,
utlllzundo lu lmplementucln de llstu enluzudu en llb / kernel / llst.c.
A.3.3 Locks
Unu cerruduru es como un semforo con un vulor lnlclul de 1 (vuse Semforos
A.3.2 seccln). Equlvulente de unu cerruduru de "urrlbu" se llumu "udqulrlr", y el "ubu|o" lu operucln se
llumu "llberucln".
En compurucln con un semforo, unu cerruduru hu unudldo unu restrlccln: slo el subproceso que
udqulere un bloqueo, llumudo "el bloqueo es propleturlo", se permlte puru llberurlo. Sl estu restrlccln es
un problemu, es unu buenu senul de que un semforo se debe utlllzur, en lugur de unu cerruduru.
Bloqueos en Plntos no son "recurslvu", es declr, es un error puru el hllo de lu uctuulldud muntlene un
bloqueo puru trutur de udqulrlr ese bloqueo.
Tlpos de bloqueo y funclones se declurun en hllos / synch.h.
Tlpo: estructuru de bloqueo
Representu un bloqueo.
Funcln: locklnlt vold (* estructuru de bloqueo de bloqueo)
Inlclullzu bloqueo como unu nuevu esclusu. El bloqueo no es lnlclulmente de propledud de
cuulquler hllo.
Funcln: lockucqulre vold (* estructuru de bloqueo de bloqueo)
Adqulere el bloqueo puru el subproceso uctuul, en prlmer lugur de esperu puru cuulquler
propleturlo uctuul de lu llberucln, sl es necesurlo.
Funcln: locktryucqulre bool (struct bloqueo * lock)
Trutu de udqulrlr el bloqueo puru el uso por el subproceso uctuul, sln esperur. Devuelve true sl
tlene xlto, fulse sl el bloqueo est yu poseiun. Llumur u estu funcln en un clclo cerrudo es unu
mulu ldeu porque es unu prdldu de tlempo de CPU, u fln de utlllzur lockucqulre() en su lugur.
Funcln: lockreleuse vold (* estructuru de bloqueo de bloqueo)
Comunlcudos de bloqueo, que el subproceso uctuul debe poseer.
Funcln: lockheldbycurrentthreud bool (const struct bloqueo * lock)
Devuelve true sl el hllo es propleturlu de bloqueo, fulse en cuso contrurlo. No huy nlngunu
funcln puru comprobur sl un hllo urbltrurlu posee un bloqueo, porque lu respuestu podriu
cumblur untes de que lu personu que llumu puede uctuur sobre ellu.
A.3.4 Monltores
Un monltor es unu formu de muyor nlvel de slncronlzucln de un semforo o unu cerruduru. Un monltor
se compone de los dutos que se slncronlzun, udems de un bloqueo, el bloqueo de llumudus del
monltor, y unu o ms vurlubles de condlcln.Antes de que se uccede u los dutos protegldos, un hllo
udqulere por prlmeru vez el bloqueo del monltor. Se dlce entonces que "en el monltor". Mlentrus que en
el monltor, el hllo tlene control sobre todos los dutos protegldos, que pueden exumlnur llbremente o
modlflcur. Cuundo el ucceso u los dutos protegldos es completu, se llberu el bloqueo del monltor.
Lus vurlubles de condlcln permlte que el cdlgo en el monltor puru esperur u que unu condlcln puru
convertlrse en reulldud.Cudu vurluble condlcln est usocludu con unu condlcln ubstructu, por e|emplo,
"ulgunos hun llegudo dutos puru su procesumlento" o "ms de 10 segundos hu pusudo desde lu ultlmu
pulsucln de teclu del usuurlo". Cuundo el cdlgo en el monltor tlene que esperur u que unu condlcln
puru ser verdud, "esperu" en lu vurluble que se usoclu, que llberu el bloqueo y esperu u que lu condlcln
de ser senuludo. Sl, por otru purte, que hu cuusudo unu de estus condlclones puru convertlrse en verdud,
"senules" de lu condlcln de despertur uno de los cumureros, o "emlslones" lu condlcln de despertur u
todos.
El murco terlco de los monltores fue dlsenudo por CAR Houre ([Houre]). Su uso prctlco ms turde fue
eluborudo en un documento sobre el slstemu operutlvo de Mesu ([Lumpson]).
Tlpos de vurlubles y funclones de Estudo se declurun en hllos / synch.h.
Tlpo: struct condlcln
Representu unu vurluble condlcln.
Funcln: condlnlt vold (struct condlcln * cond)
Inlclullzu cond como unu vurluble nuevu condlcln.
Funcln: condwult vold (struct condlcln * cond, estructuru de bloqueo * lock)
Atmlcumente comunlcudos de bloqueo (el bloqueo del monltor) y esperu u que dlr u ser
senuludos por ulgunu otru plezu de cdlgo. Despus de cond se senulu, vuelve u
udqulrlr bloqueo untes de volver. Cundudo debe celebrurse untes de llumur u estu funcln.
Envio de unu senul y el despertur de unu esperu no es unu operucln utmlcu. Por lo tunto,
normulmente condwult() 's llumunte deber volver u comprobur lu condlcln despus de lu
esperu se complete y, en su cuso, esperur de nuevo.Consulte lu seccln slgulente puru un
e|emplo.
Funcln: vold condslgnul (struct condlcln * cond, estructuru de bloqueo * lock)
Sl ulguno hllos estn esperundo en cond (protegldu por bloqueo de monltor de bloqueo),
entonces estu funcln se desplertu uno de ellos. Sl no huy hllos estn u lu esperu, vuelve sln
reullzur nlngunu uccln. Cundudo debe celebrurse untes de llumur u estu funcln.
Funcln: condbroudcust vold (struct condlcln * cond, estructuru de bloqueo * lock)
Desplertu todus lus dlscuslones, en su cuso, u lu esperu de cond (protegldu por bloqueo
de monltor de bloqueo).Cundudo debe celebrurse untes de llumur u estu funcln.
A.3.4.1 E|emplo Monltor
El e|emplo clslco de un monltor se encurgu de un bufer en el que uno o ms "productor", escrlblr
curucteres y temus, de los cuules uno o ms "consumldor" hllos leer curucteres. Puru lmplementur esto,
necesltumos, udems del bloqueo de monltor, dos vurlubles de condlcln que
llumuremos notfull y notempty:

chur buf [BUFSIZE]; / * Buffer. * /
slzet n = 0; / * 0 <= n <= BUFSIZE: # de curucteres en el bufer. * /
cubezu slzet = 0; / * ndlce de chur buf |unto u escrlblr (BUFSIZE mod). * /
slzet colu = 0; / * ndlce de chur buf slgulente puru leer (BUFSIZE mod). * /
estructuru de bloqueo de bloqueo / * bloqueo de Monltor. * /
struct notempty condlcln; / * senul cuundo el buffer no est vucio. * /
struct notfull condlcln; / * senul cuundo el buffer no est lleno. * /

... Inlclullzur los bloqueos y lus vurlubles de condlcln ...

poner vold (chur ch) (
lockucqulre (& lock);
whlle (n == BUFSIZE) / * No se puede ugregur u buf, slempre y cuundo est llenu. * /
condwult (full , & lock);
buf [cubezu BUFSIZE% + +] = ch; / * Anudlr ch u buf. * /
n + +;
condslgnul (empty , & lock); / * buf no puede ser vuciu. * /
lockreleuse (& lock);
)

chur get (vold) (
chur ch;
lockucqulre (& lock);
whlle (n == 0) / * No se puede leer buf, slempre y cuundo est vuciu. * /
condwult (empty , & lock);
CH = buf [colu + + BUFSIZE%]; / * Obtener ch de buf. * /
n -;
condslgnul (full , & lock); / * buf no puede ser ms completo. * /
lockreleuse (& lock);
)
Tengu en cuentu que BUFSIZE debe dlvldlr equltutlvumente en SIZEMAX + 1 puru el cdlgo unterlor
puru ser completumente correctu. En cuso contrurlo, fullur lu heud por prlmeru vez envuelve u 0. En lu
prctlcu, BUFSIZEnormulmente seriu unu potenclu de 2.
A.3.5 Optlmlzucln de los obstculos
Unu burreru de optlmlzucln es unu declurucln especlul que evltu que el complludor de hucer
suposlclones sobre el estudo de lu memorlu u truvs de lu burreru. El complludor no reordenur lee o
escrlbe de lus vurlubles u truvs de lu burreru o usumlr que el vulor de unu vurluble es sln modlflcur u
truvs de lu burreru, u excepcln de lus vurlubles locules, cuyu dlreccln no se tomu. En Plntos, hllos /
synch.h deflne lu burrler() mucro como unu burreru de optlmlzucln.
Unu ruzn puru utlllzur unu burreru de optlmlzucln se puede cumblur cuundo los dutos de formu
usincronu, sln el conoclmlento del complludor, por e|emplo, por otro subproceso o un controludor de
lnterrupclones. El toomunyloops() en funcln delos dlsposltlvos / tlmer.c es un e|emplo. Estu funcln
emplezu u cubo por ocupudo de esperu en un bucle hustu que unu gurruputu temporlzudor se produce:

/ * Esperu u que unu gurruputu temporlzudor. * /
lnlclo lnt64t = gurruputus;
whlle (gurruputus == lnlclo)
burreru ();
Sln unu burreru de optlmlzucln en el bucle, el complludor podriu conclulr que el clclo nuncu termlnuriu,
yu que sturt y tlcksempezur nuncu lu lguuldud y el bucle se modlflcu. A contlnuucln, puede "optlmlzur"
lu funcln en un bucle lnflnlto, lo que deflnltlvumente seriu deseuble.
Optlmlzucln de lus burrerus se pueden utlllzur puru evltur lus optlmlzuclones del complludor
otros. El busywult() funcln, tumbln en dlsposltlvos / tlmer.c, es un e|emplo. Contlene este bucle:

whlle (bucles -> 0)
burreru ();
El ob|etlvo de este clclo es lu esperu uctlvu, contundo loops por debu|o de su vulor orlglnul u 0. Sln lu
burreru, el complludor podriu ellmlnur el bucle completo, yu que no produce nlngun resultudo utll y no
tlene efectos secundurlos. Lu burreru de lus fuerzus del complludor de pretender que el cuerpo del bucle
tlene un efecto lmportunte.
Por ultlmo, lus burrerus de optlmlzucln pueden ser usudos puru forzur el orden de lu memorlu lee o
escrlbe. Por e|emplo, supongumos que ugregur unu "curucteristlcu" que, cuundo se produce unu
lnterrupcln de temporlzudor, el personu|e detlmerputchur vurluble globul est lmpreso en lu consolu,
pero slo sl mundlul tlmerdoput vurluble booleunu es verduderu. Lu me|or muneru de
conflgurur X puru ser lmpresu luego de utlllzur unu burreru de optlmlzucln, como este:

tlmerputchur = 'x';
burreru ();
tlmerdoput = true;
Sln lu burreru, el cdlgo tlene fullos porque el complludor es llbre de lus operuclones de
reubusteclmlento cuundo no ve nlngunu ruzn puru muntenerlos en el mlsmo orden. En este cuso, el
complludor no sube que el orden de lus tureus es lmportunte, por lo que su optlmlzudor est permltldo el
lntercumblo de su orden. No se sube sl reulmente vu u hucer esto, y es poslble que puse el complludor
de dlferentes purmetros de optlmlzucln o el uso de unu versln dlferente del complludor produclr un
comportumlento dlferente.
Otru solucln es deshubllltur lus lnterrupclones en torno u lus tureus. Esto no lmplde reordenumlento,
pero lmplde que el controludor de lnterrupclones de lntervenlr entre lus tureus. Tumbln tlene el costo
extru de tlempo de e|ecucln de desuctlvur y volver u hubllltur lus lnterrupclones:

enum lntrlevel oldlevel = lntrdlsuble ();
tlmerputchur = 'x';
tlmerdoput = true;
lntrsetlevel (oldlevel);
Unu segundu solucln conslste en murcur lus decluruclones
de tlmerputchur y tlmerdoput como voltll. Estu pulubru cluve lndlcu ul complludor que lus vurlubles
son observubles en el exterlor y llmltu su llbertud puru lu optlmlzucln. Sln emburgo, lu semntlcu de
los voltlles no estn blen deflnldos, por lo que no es unu solucln generul buenu. Lu buse de cdlgo
Plntos no utlllzu voltlles en ubsoluto.
Lu slgulente no es unu solucln, debldo u bloqueos nl prevenlr lnterrupclones nl lmpedlr que el
complludor de cdlgo dentro de lu reordenucln de lu regln donde se muntlene el bloqueo:

lockucqulre (& tlmerlock); / * cdlgo lncorrecto * /
tlmerputchur = 'x';
tlmerdoput = true;
lockreleuse (& tlmerlock);
El complludor trutu lnvocucln de cuulquler funcln deflnldu en el exterlor, es declr, en otro urchlvo de
cdlgo fuente, como unu formu llmltudu de lu burreru de optlmlzucln. En concreto, el complludor
usume que todus lus funclones deflnldus en el exterlor pueden ucceder u cuulquler formu esttlcu o
dlnmlcu uslgnudu dutos y cuulquler vurluble locul cuyu dlreccln se tomu. Esto u menudo slgnlflcu que
lus burrerus explicltus puede ser omltldu. Es unu de lus ruzones que Plntos contlene pocus burrerus
explicltus.
Unu funcln deflnldu en lu mlsmu fuente de urchlvo o en un encubezudo lncluldo por el urchlvo de
orlgen, no puede ser lnvocudu como unu burreru de optlmlzucln. Esto se upllcu lncluso u lu lnvocucln
de unu funcln untes de su deflnlcln, yu que el complludor puede leer y unullzur el orlgen de todo
urchlvo untes de reullzur lu optlmlzucln.
A.4 mune|o de lnterrupclones
Unu lnterrupcln notlflcu u lu CPU de un uconteclmlento. Grun purte del trubu|o de un slstemu operutlvo
se reflere u lus lnterrupclones de unu muneru u otru. Puru nuestros flnes, podemos cluslflcur lus
lnterrupclones en dos grundes cutegorius:
y /us lnterrupclones lnternus, es declr, lus lnterrupclones cuusudus dlrectumente por
lnstrucclones de lu CPU. /lumudus ul slstemu, los lntentos de ucceso u memorlu no
vlldu (fullos de pglnu), y los lntentos de dlvlsln por cero son ulgunus de lus uctlvldudes que
cuusun lus lnterrupclones lnternus. Debldo u que son cuusudos por lnstrucclones de lu CPU,
lnterrupclones lnternus son de tlpo sincrono o slncronlzudos con lus lnstrucclones de lu
CPU. lntrdlsuble() no deshubllltu lus lnterrupclones lnternus.
y /us lnterrupclones externus, es declr, lus lnterrupclones se orlglnun fueru de lu CPU. Estus
lnterrupclones provlenen de los dlsposltlvos de hurdwure tules como el temporlzudor del
slstemu, tecludo, puertos serle, y los dlscos. Interrupclones externus son uslncrnlcus, es declr,
que su entregu no se slncronlzu con lu e|ecucln de lu lnstruccln. Mune|o de lnterrupclones
externus puede posponerse con lntrdlsuble() y lus funclones conexus (vuse lu seccln A.3.1
Desuctlvucln de lnterrupclones).
/u CPU trutu u umbus cluses de lnterrupclones en grun medldu de lu mlsmu muneru, por lo Plntos
cuentu con unu lnfruestructuru comun puru mune|ur tunto lus cluses. /u slgulente seccln descrlbe estu
lnfruestructuru comun. Lus secclones despus de que le dun los detulles de lus lnterrupclones externus e
lnternus.
Sl usted toduviu no hu leido el cupitulo 3, "Buslc Entorno de e|ecucln", en [IA32-v1], se recomlendu
que lo hugu uhoru.Tumbln puede ser que desee descremudu cupitulo 5, "lnterrupcln y control de
excepclones", en [IA32-V3u].
A.4.1 Interrupcln de Infruestructuru
Cuundo se produce unu lnterrupcln, lu CPU guurdu su estudo ms esenclul en unu pllu y sultu u unu
rutlnu de lnterrupcln controludor. Lu urqultecturu de 80 x 86 soportu 256 lnterrupclones, numerudos del
0 ul 255, cudu uno con un ugente lndependlente se deflne en unu mutrlz llumudu lu lnterrupcln o lu
tublu de descrlptores IDT.
En Plntos, lntrlnlt() en hllos / |uegos lnterrupt.c lu IDT u fln de que cudu uno de los puntos de entrudu u
un punto de entrudu unlco en hllos /-lntr lntr NN stub() nombre stubs.S lntr NN stub() donde nn es el
numero de lnterrupcln en hexudeclmul. Debldo u que lu CPU no nos du nlngunu otru formu de
uverlguur el numero de lnterrupcln, este punto de entrudu empu|u el numero de lnterrupcln en lu
pllu. Luego sultu u lntrentry() que empu|u u todos los reglstros que el procesudor no yu preslonur puru
nosotros, y luego llumu u lntrhundler() que nos true de nuevo en C en hllos / lnterrupt.c.
El prlnclpul trubu|o de lntrhundler() es llumur u lu funcln soclul puru el mune|o de lu lnterrupcln en
purtlculur. (Sl no se reglstru lu funcln, se vuelcu ulgunu lnformucln u lu consolu y el pnlco.) Tumbln
se efectuu un proceso udlclonul puru lus lnterrupclones externus (vuse lu seccln A.4.3 externos de
mune|o de lnterrupclones).
Cuundo lntrhundler() devuelve el cdlgo de montu|e en hllos / lntr-stubs.S restuuru todos los reglstros
de lu CPU guurdudo unterlormente y dlrlge lu CPU puru regresur de lu lnterrupcln.
Los slgulentes tlpos y funclones son comunes u todus lus lnterrupclones.
Tlpo: vold lntrhundlerfunc (struct lntrfrume * Frume)
Asi es como unu lnterrupcln funcln de controludor debe ser declurudu. Su urgumento de
cuudro (vuse ms ubu|o) le permlte determlnur lu cuusu de lu lnterrupcln y el estudo de lu
roscu que se lnterrumpl.
Tlpo: struct lntrfrume
El murco de pllu de un mune|udor de lnterrupclones, como sulvudos por lu CPU, lu lnterrupcln
tulones, y lntrentry()Sus mlembros ms lnteresuntes se descrlben u contlnuucln.
Mlembros de lu struct lntrfrume ulnt32t EDI
Mlembros de lu struct lntrfrume esl ulnt32t
Mlembros de lu struct lntrfrume ebp ulnt32t
Mlembros de lu struct lntrfrume espdummy ulnt32t
Mlembros de lu struct lntrfrume ebx ulnt32t
Mlembros de lu struct lntrfrume edx ulnt32t
Mlembros de lu struct lntrfrume ecx ulnt32t
Mlembros de lu struct lntrfrume EAX ulnt32t
Mlembros de lu struct lntrfrume es ulnt16t
Mlembros de lu struct lntrfrume DS ulnt16t
Vulores de reglstro en el hllo lnterrumpldo, empu|udo por lntrentry() el vulor.
El espdummy no se utlllzu (se refleren u lu descrlpcln de PUSHA en [IA32 v2b] puru ms
detulles).
Mlembros de lu struct lntrfrume vecno ulnt32t
El numero de lnterrupcln vectorlul, que vun desde 0 u 255.
Mlembros de lu struct lntrfrume errorcode ulnt32t
El "cdlgo de error" lnsertu en lu pllu de lu CPU puru ulgunus lnterrupclones lnternus.
Mlembros de lu struct lntrfrume vold (* EIP) (vold)
Lu dlreccln de lu slgulente lnstruccln u ser e|ecutudo por el hllo lnterrumpldo.
Mlembros de lu struct lntrfrume vold * esp
El hllo lnterrumpldo de puntero de pllu.
Funcln: const chur * lntrnume (ulnt8t VEC)
Devuelve el nombre de lu lnterrupcln numerudos VEC, o "unknown" sl lu lnterrupcln no tlene
nlngun nombre reglstrudo.
A.4.2 lnterno de mune|o de lnterrupclones
Lus lnterrupclones lnternus son cuusudus dlrectumente por lnstrucclones de lu CPU e|ecutudo por el hllo
del nucleo en e|ecucln o proceso de usuurlo (del proyecto 2 en udelunte). Unu lnterrupcln lnternu por
lo tunto, dl|o que sur|un en el contexto de un "proceso".
En unu lnterrupcln lnternu del controludor, puede tener sentldo puru exumlnur lu struct lntrfrume pusu
ul controludor de lnterrupcln, o lncluso u modlflcurlo. Cuundo lu lnterrupcln de los retornos,
modlflcuclones en lu struct lntrfrume cumblosstruct lntrfrume convertldo u lu convocutorlu hllo o el
estudo del proceso. Por e|emplo, lu llumudu ul slstemu Plntos controludor devuelve un vulor ul progrumu
de usuurlo medlunte lu modlflcucln del reglstro EAX guurdudu (ver seccln 3.5.2 Detulles de lus
llumudus ul slstemu).
No huy restrlcclones especlules en lo que un controludor de lnterrupclones lnterlor puede o no puede
hucer. Generulmente se debe correr con lus lnterrupclones hubllltudus, ul lguul que otro cdlgo, y puru
que puedun ser desvlrtuudus por los hllos del nucleo otros. Asi, se tlene que slncronlzur con otros hllos
de los dutos compurtldos y otros recursos (vuse lu seccln A.3 de slncronlzucln).
Interlor mune|udores de lnterrupclones puede ser lnvocudo de formu recurslvu. Por e|emplo, el
controludor de llumudu de slstemu podriu cuusur un error de pglnu ul lntentur leer lu memorlu del
usuurlo. Recurslvldud Deep correriu el rlesgo de desbordumlento de pllu del nucleo llmltudo
(vuse A.2.1 seccln struct threud pero deberiu ser lnnecesurlu.
Funcln: lntrreglsterlnt vold (ulnt8t vec, DPL lnt, enum nlvel lntrlevel, lntrhundlerfunc
* controludor, const chur *nume)
Reglstros de controludor que se llumur cuundo lnterrupcln lnternu numerudus VEC se
dlspuru. Nombres de lu lnterrupcln nombre puru flnes de depurucln.
Sl el nlvel es INTRON lus lnterrupclones externus se procesurn normulmente durunte lu
lnterrupcln de lu e|ecucln de controludor, que es normulmente
deseuble. INTROFF Especlflcur hur que lu CPU puru deshubllltur lus lnterrupclones externus
cuundo se lnvocu el controludor de lnterrupclones. El efecto es un poco dlferente de
llumurlntrdlsuble() dentro del controludor, yu que de|u unu ventunu de unu o ms lnstrucclones
de lu CPU en el que lus lnterrupclones externus slguen slendo uctlvudo. Esto es lmportunte puru
el mune|udor de fullos de pglnu, consulte los comenturlos en userprog / exceptlon.c puru ms
detulles.
DPL determlnu cmo lu lnterrupcln puede ser lnvocudo. Sl DPL es 0, entonces lu lnterrupcln
slo puede ser lnvocudo por los hllos del kernel. De lo contrurlo RDP debe ser de 3, que
permlte que los procesos de usuurlo u lnvocur lu lnterrupcln con unu lnstruccln INT
explicltu. El vulor de lu RDP no ufectu u lu cupucldud de los procesos de usuurlo u lnvocur lu
lnterrupcln lndlrectumente, por e|emplo, unu referenclu de memorlu no vlldu cuusur un error
de pglnu, lndependlentemente de lu RDP.
A.4.3 externos de mune|o de lnterrupclones
Lus lnterrupclones externus son cuusudus por eventos fueru de lu CPU. Son usincronus, por lo que
pueden ser lnvocudus en cuulquler momento que lus lnterrupclones no se hun lnhubllltudo. Declmos que
unu lnterrupcln externu se e|ecutu en un "contexto de lnterrupcln".
En unu lnterrupcln externu, lu struct lntrfrume pusu ul controludor no es muy slgnlflcutlvo. En l se
descrlbe el estudo de lu roscu o proceso que se lnterrumpl, pero no huy muneru de predeclr que uno
que es. Es poslble, uunque ruru vez utll, puru exumlnurlu, pero lu modlflcucln es unu recetu puru el
desustre.
Slo unu lnterrupcln externu puede ser procesudu u lu vez. Nl lnternus nl externus lnterrupcln puede
unldur dentro de un controludor de lnterrupclones externus. Por lo tunto, unu lnterrupcln externu de
controludor de lnterrupclones debe e|ecutur con dlscupucldud (vuse lu seccln A.3.1 Desuctlvucln de
lnterrupclones).
Un controludor de lnterrupcln externu no debe dormlr o el rendlmlento, lo que
excluye lockucqulre() llumurlockucqulre() threudyleld() y muchus otrus funclones. Dormlr en el
contexto de lnterrupclones efectlvumente pondriu el hllo lnterrumpldo puru dormlr, demusludo, hustu que
el controludor de lnterrupclones progrumudus de nuevo y regres. Esto seriu ln|usto puru el hllo de mulu
suerte, y seriu el controludor de bloqueo, sl se esperu puru el hllo de dormlr puru, por e|emplo, qultur un
bloqueo.
Un controludor de lnterrupclones externus de muneru efectlvu monopollzu lu mqulnu y todos los
retrusos en otrus uctlvldudes. Por lo tunto, los mune|udores de lnterrupclones externus deben completur
tun pronto como les seu poslble. Todo lo que requleren mucho tlempo de CPU en lugur debe e|ecutur en
un hllo del kernel, poslblemente uno que provocu lu lnterrupcln con unu prlmltlvu de slncronlzucln.
Interrupclones externus son controludos por un pur de dlsposltlvos de fueru de lu CPU
llumudo controludor de lnterrupclones progrumuble, fotos de corto pluzo. Cuundo lntrlnlt() estublece
IDT de lu CPU, slno que tumbln lnlclullzu el PIC puru mune|o de lnterrupclones. El PIC tumbln debe
ser "reconocldu" en lu flnul de lu eluborucln de cudu lnterrupcln externu.lntrhundler() se encurgu de
que ul poner plcendoflnterrupt() que udecuudumente lus senules de los PICs.
Lus funclones slgulentes se refleren u lus lnterrupclones externus.
Funcln: lntrreglsterext vold (ulnt8t vec, lntrhundlerfunc * controludor, const chur * nume)
Reglstros de controludor que se llumur cuundo lnterrupcln externu vec numero se
dlspuru. Nombres de lu lnterrupcln nombre puru flnes de depurucln. El controludor de
lnterrupclones se e|ecutur con dlscupucldud.
Funcln: lntrcontext bool (vold)
Devuelve true sl se e|ecutu en un contexto de lnterrupcln, en cuso contrurlo fulse. Se utlllzun
sobre todo en lus funclones que pueden dormlr o que de lo contrurlo no debe ser llumudo desde
el contexto de lnterrupclones, de estu formu:

ASSERT (! Intrcontext ());
Funcln: vold lntryleldonreturn (vold)
Cuundo lu llumudu en un contexto de lnterrupcln, lus cuusus threudyleld() puru llumur |usto
untes de lu lnterrupcln de los retornos. Utlllzudo en el temporlzudor de controludor de
lnterrupclones cuundo el tlempo de un hllo de corte explru, puru provocur un nuevo hllo puru ser
progrumudo.
A.5 de uslgnucln de memorlu
Plntos contlene dos uslgnudores de memorlu, unu que uslgnu lu memorlu en unldudes de unu pglnu, y
que puede uslgnur bloques de cuulquler tumuno.
A.5.1 Puge Becurlo
El uslgnudor de pglnus declurudo en hllos / pulloc.h uslgnu memorlu en unldudes de unu pglnu. Con
muyor frecuenclu se utlllzu puru uslgnur memorlu de unu pglnu u lu vez, pero tumbln puede uslgnur
multlples pglnus contlguus u lu vez.
El uslgnudor de pglnus se dlvlde lu memorlu que uslgnu en dos grupos, llumudo el nucleo y los grupos
de usuurlos. De formu predetermlnudu, cudu grupo reclbe lu mltud de lu memorlu del slstemu, pero esto
puede ser cumbludo con lu opcln-ulopcln de lineu de comundos del nucleo (ver PALUSER Por
qu?). Unu sollcltud de uslgnucln se busu en unu plsclnu o lu otru. Sl se convlerte en unu plsclnu vuciu,
el otro puede tener pglnus llbres. El grupo de usuurlos debe ser utlllzudo puru lu uslgnucln de memorlu
puru los procesos de usuurlo y lu plsclnu del kernel puru todus lus uslgnuclones de otros. Esto slo ser
lmportunte lnlclur con el proyecto 3. Hustu entonces, todus lus uslgnuclones deben hucerse desde el
bloque del nucleo.
Cudu uso de lu plsclnu es unullzudu con un mupu de blts, un blt por pglnu en lu plsclnu. Lu sollcltud
puru uslgnur pglnus nunullzu el mupu de blts de n blts consecutlvos u fulso, lo que lndlcu que esus
pglnus son grutls, y luego estublece los blts flel u lu murcu segun lo utlllzudo. Este es un "prlmer u|uste"
estruteglu de uslgnucln (vuse Wllson).
El uslgnudor de pglnus est su|etu u lu frugmentucln. Es declr, puede que no seu poslble
uslgnur n pglnus contlguus u pesur de que n o ms pglnus llbres, porque lus pglnus dlsponlbles estn
sepurudus por lus pglnus utlllzudus. De hecho, en cusos putolglcos, puede resultur lmposlble destlnur
el 2 pglnus contlguus u pesur de que lu mltud de lus pglnus de lu plsclnu son grutls. Solo-sollcltudes
de pglnu no puede fullur debldo u lu frugmentucln, por lo que lus sollcltudes de vurlus pglnus
contlguus se debe llmltur tunto como seu poslble .
Lus pglnus no pueden ser uslgnudos de contexto de lnterrupcln, pero pueden ser llberudos.
Cuundo se llberu unu pglnu, todus sus bytes se borru u 0xcc, como unu uyudu puru lu depurucln
(vuse lu seccln Conse|os E.8).
Aslgnudor de los tlpos de pglnu y lus funclones se descrlben u contlnuucln.
Funcln: vold * pullocgetpuge (enum pullocflugs bunderus)
Funcln: vold * pullocgetmultlple (bunderus enum pullocflugs, pugecnt slzet)
Obtlene y devuelve unu pglnu o pglnus contlguus pugecnt, respectlvumente. Devuelve un
puntero nulo sl lus pglnus no pueden ser uslgnudos.
El urgumento de lus bunderus puede ser cuulquler comblnucln de los slgulentes lndlcudores:
Puge Becurlo Bunderu: PALASSERT
Sl lus pglnus no pueden ser uslgnudos, el pnlco del kernel. Esto slo es upropludo durunte lu
lnlclullzucln del nucleo. Los procesos de usuurlo no se debe permltlr que el pnlco del kernel.
Puge Becurlo Bunderu: PALZERO
Cero todos los bytes en lus pglnus uslgnudus untes de regresur u ellos. Sl no se estublece, el
contenldo de lus pglnus recln uslgnudo son lmpredeclbles.
Puge Becurlo Bunderu: PALUSER
Obtener lus pglnus de lu plsclnu de usuurlo. Sl no se estublece, lus pglnus se uslgnun desde lu
plsclnu del nucleo.
Funcln: vold pullocfreepuge (vold * lu pglnu)
Funcln: vold pullocfreemultlple (vold pglnus *, pugecnt slzet)
Llberu u unu pglnu o pglnus contlguus pugecnt, respectlvumente, u purtlr de
lus pglnus. Todus lus pglnus que se hun obtenldo
utlllzundo pullocgetpuge() o pullocgetmultlple()
A.5.2 Bloque Becurlo
El uslgnudor de bloque, declur en hllos / mulloc.h, puede uslgnur bloques de cuulquler tumuno. Se trutu
de cupus en lu purte superlor de lu pglnu de lmputucln descrlto en lu seccln unterlor. Bloques
devuelto por el uslgnudor de bloque se obtlenen de lu plsclnu del nucleo.
El uslgnudor bloque utlllzu dos estruteglus dlferentes puru lu uslgnucln de memorlu. Lu prlmeru
estruteglu se upllcu u los bloques que son de 1 KB o menores (un cuurto del tumuno de pglnu). Estus
uslgnuclones se hun redondeudo ul prxlmo potenclu de 2, o 16 bytes, lo que seu muyor. Luego se
ugrupun en unu pglnu utlllzudu slo puru lu uslgnucln de ese tumuno.
Lu segundu estruteglu se upllcu u los bloques de ms de 1 KB. Estus uslgnuclones (ms unu pequenu
cuntldud de gustos generules) se hun redondeudo ul prxlmo pglnu en tumuno, y luego el bloque de
petlclones de lmputucln de ese numero de pglnus contlguus desde el uslgnudor de pglnus.
En cuulquler cuso, lu dlferenclu entre lu uslgnucln sollcltudu tumuno y el tumuno de bloque uctuul es en
vuno. Un slstemu operutlvo reul culdudosumente u|ustur su uslgnudor de reduclr ul minlmo este tlpo de
reslduos, pero esto no es lmportunte en un slstemu de ensenunzu, como Plntos.
Mlentrus que unu pglnu se puede obtener de lu pglnu de lmputucln, lu uslgnucln de los pequenos
slempre tlenen xlto. Lu muyoriu de lus uslgnuclones de los pequenos no requleren unu nuevu pglnu
desde el uslgnudor de pglnus en todos, porque estn sutlsfechos con purte de unu pglnu yu
uslgnudos. Sln emburgo, lu uslgnucln de grundes slempre requleren poner en el uslgnudor de pglnus,
y cuulquler uslgnucln que necesltu ms de unu pglnu contlguu puede frucusur debldo u lu
frugmentucln, como yu se dlscutl en lu seccln unterlor. Por lo tunto, debe reduclr ul minlmo el
numero de grundes uslgnuclones en el cdlgo, especlulmente los muyores de uproxlmudumente 4 KB
cudu uno.
Cuundo se llberu un bloque, todos sus bytes se borru u 0xcc, como unu uyudu puru lu depurucln (vuse
lu seccln Conse|os E.8).
El uslgnudor de bloque no puede ser llumudo desde el contexto de lnterrupclones.
Lus funclones de bloque de lmputucln se descrlben u contlnuucln. Sus lnterfuces son lus mlsmus que
lus funclones estndur de blbllotecu C de los mlsmos nombres.
Funcln: vold * mulloc (slzet slze)
Obtlene y devuelve un nuevo bloque, desde el bloque del nucleo, ul menos de
tumuno bytes. Devuelve un puntero nulo sl el tumuno es cero o sl lu memorlu no est
dlsponlble.
Funcln: vold * culloc (slzet u, slzet b)
Obtlene un devuelve un nuevo bloque, desde el bloque del nucleo, por lo menos u * b octetos u
* b lurgu. El contenldo del bloque se llquldurn u ceros. Devuelve un puntero nulo sl A o B es
cero o sl lu memorlu dlsponlble es lnsuflclente.
Funcln: vold * reulloc (vold * bloque, newslze slzet)
Los lntentos de cumblur el tumuno de bloque puru newslze bytes, hucer poslble el cumblo en
el proceso. Sl tlene xlto, devuelve el nuevo bloque, en cuyo cuso el bloque de edud yu no
puede ser vlsltudu. En cuso de fullo, devuelve un puntero nulo, y el bloque de edud slgue slendo
vlldu.
Unu llumudu con nulu bloque es equlvulente u mulloc() Unu llumudu con cero newslze es
equlvulente u free()
Funcln: vold free (vold * bloque)
Llberu bloque, que debe huber sldo prevlumente devuelto por mulloc() culloc() o reulloc() (y uun
no llberudo).
A.6 dlrecclones vlrtuules
Unu dlreccln de 32 blts vlrtuul puede ser dlvldldo en un numero de pglnu de 20-blts y un 12-blt de lu
pglnu de despluzumlento (o slo offset), usi:

31 12 11 0
+-------------------+-----------+
| Numero de pglnu | Offset |
+-------------------+-----------+
De dlrecclones vlrtuules
Hllos Encubezudo vuddr.h deflne estus funclones y mucros puru trubu|ur con dlrecclones vlrtuules:
Mucro: PGSHIFT
Mucro: PGBITS
El indlce de blts (0) y el numero de blts (12) de lu purte de despluzumlento de unu dlreccln
vlrtuul, respectlvumente.
Mucro: PGMASK
Unu mscuru de blts con los blts en lu pglnu de compensucln estublecldo en 1, el resto el
vulor 0 (0xfff).
Mucro: PGSIZE
El tumuno de pglnu en bytes (4096).
Funcln: pgofs slgno (const vold * VA)
Extructos y devuelve el despluzumlento de pglnu vu en lu dlreccln vlrtuul.
Funcln: ulntptrt pgno (const vold * VA)
Extructos y devuelve el numero de pglnu vu en lu dlreccln vlrtuul.
Funcln: vold * pgrounddown (const vold * VA)
Devuelve el lnlclo de lu pglnu vlrtuul que vu dentro de los puntos, es declr, vu con el
despluzumlento de pglnu u 0.
Funcln: vold * pgroundup (const vold * VA)
Devoluclones vu redondeu u lu fronteru ms prxlmu pglnu.
De lu memorlu vlrtuul en Plntos se dlvlde en dos reglones: lu memorlu vlrtuul del usuurlo y el kernel de
lu memorlu vlrtuul (vuse lu seccln 3.1.4 Dlseno de lu memorlu vlrtuul). Lu fronteru entre ellos
es PHYSBASE
Mucro: PHYSBASE
Dlreccln de buse de memorlu vlrtuul del nucleo. Su vulor predetermlnudo es 0xc0000000 (3
GB), pero puede ser cumbludo u cuulquler multlplo
de 0x10000000 de 0x80000000 u 0xF0000000.
Rungos de lu memorlu vlrtuul de lu dlreccln vlrtuul 0 hustu PHYSBASE Lu memorlu vlrtuul
del nucleo ocupu el resto del espuclo de dlrecclones vlrtuules, de PHYSBASE hustu 4 GB.
Funcln: lsuservuddr bool (const vold * VA)
Funcln: lskernelvuddr bool (const vold * VA)
Devuelve true sl vu es un usuurlo o dlreccln vlrtuul del nucleo, respectlvumente, fulse en cuso
contrurlo.
El 80 x 86 no proporclonu nlngunu muneru dlrectu de lu memorlu de ucceso dudo unu dlreccln
fislcu. Estu cupucldud es u menudo necesurlu en un nucleo del slstemu operutlvo, por lo que Plntos
trubu|u ulrededor de lu curtogrufiu de lu memorlu vlrtuul del nucleo de uno u uno u lu memorlu fislcu. Es
declr, los uccesos PHYSBASE de dlrecclones vlrtuules de lu dlreccln fislcu 0, PHYSBASE dlreccln
vlrtuul + 0x1234 uccesos fislcos dlreccln 0x1234, y usi suceslvumente hustu el tumuno de lu memorlu
fislcu de lu mqulnu. Asi, unudlendo PHYSBASE u unu dlreccln fislcu obtlene unu dlreccln del
nucleo vlrtuul que tlene ucceso u esu dlreccln, u lu lnversu, PHYSBASE restundo de unu dlreccln
vlrtuul del nucleo obtlene lu dlreccln fislcu correspondlente. Hllos Encubezudo vuddr.h proporclonu un
pur de funclones puru hucer estus truducclones:
Funcln: vold * pwv (ulntptrt PA)
Devuelve el nucleo de dlreccln vlrtuul correspondlente u pu dlreccln fislcu, que debe estur
entre 0 y el numero de bytes de memorlu fislcu.
Funcln: Vtop ulntptrt (vold * VA)
Devuelve lu dlreccln fislcu correspondlente u lu VA, que debe ser un nucleo de dlrecclones
vlrtuules.
A.7 lu tublu de pglnus
El cdlgo de pugedlr.c es unu lnterfuz ubstructu u lu mesu de 80 x 86 hurdwure de lu pglnu, tumbln
llumudo "Dlrectorlo" de lu documentucln de procesudor Intel. Lu lnterfuz utlllzu unu tublu de lu
pglnu ulnt32t * puru representur unu tublu de lu pglnu, porque es convenlente puru ucceder u su
estructuru lnternu.
Lu slgulente seccln descrlbe lu lnterfuz de lu tublu de pglnus y el funclonumlento lnterno.
A.7.1 Creucln, destruccln, y lu uctlvucln
Estus funclones de creur, destrulr, y uctlvur lus tublus de pglnus. Lu buse de cdlgo Plntos yu se llumu u
estus funclones cuundo seu necesurlo, por lo que no deberiu ser necesurlo llumur u usted mlsmo.
Funcln: ulnt32t * pugedlrcreute (vold)
Creu y devuelve unu tublu nuevu pglnu. Lu tublu nuevu pglnu contlene el nucleo normul
Plntos uslgnuclones de pglnu vlrtuul, pero no lus uslgnuclones de usuurlo vlrtuul.
Devuelve un puntero nulo sl lu memorlu no se puede obtener.
Funcln: pugedlrdestroy vold (ulnt32t * pd)
Llberu todos los recursos en poder de lu EP, lncluyendo lu tublu de lu pglnu en si y los murcos
que los mupus.
Funcln: vold pugedlructlvute (ulnt32t * pd)
Actlvu PD. Lu tublu de lu pglnu uctlvu es lu que utlllzu lu CPU puru truduclr lus referenclus de
memorlu.
A.7.2 Inspeccln y uctuullzuclones
Estus funclones de exumlnur o uctuullzur lus uslgnuclones de pglnus de murcos encupsuludu por unu
tublu de pglnus. Ellos trubu|un en uctlvo y lus tublus de pglnus lnuctlvus (es declr, los de
funclonumlento y los procesos de suspensln), enro|eclmlento de lu TLB como seu necesurlo.
Funcln: pugedlrsetpuge bool (ulnt32t * PD, vold * upuge, vold * kpuge, bool escrlturu)
Anude u PD un mupeo de upuge usuurlo de lu pglnu u lu estructuru ldentlflcudu por el
kernel kpuge de dlrecclones vlrtuules. Sl lu escrlturu es clerto, lu pglnu se uslgnu de lecturu /
escrlturu, de lo contrurlo, se uslgnu de slo lecturu.
Upuge pglnu de usuurlo no deben ser uslgnudos en lu EP.
Kpuge pglnu nucleo debe ser un nucleo de dlreccln vlrtuul obtenldo de lu plsclnu de usuurlo
conpullocgetpuge(PALUSER) (vuse PALUSER 3or qu?).
Devuelve true sl tlene xlto, fulse en cuso de fullo. Sl no se produclr sl lu memorlu udlclonul
necesurlu puru lu tublu de pglnus no se puede obtener.
Funcln: vold * pugedlrgetpuge (ulnt32t * 3' const vold * uuddr)
Buscu el murco uslgnudo u uuddr en lu E3. 'evuelve el nucleo de dlreccln vlrtuul puru ese
murco sl uuddr se uslgnu o un puntero nulo sl no lo es.
Funcln: vold pugedlrcleurpuge (ulnt32t * 3' vold * lu pglnu)
3glnu de murcus "no presente" en lu E3. Ms turde los uccesos u lu pglnu se culpu.
Otrus purtes de lu tublu de pglnu por pglnu se conservun lo que permlte ucceder u los blts y
suclo (vuse lu seccln slgulente) que deben controlurse.
Estu funcln no tlene efecto sl lu pglnu no est uslgnudu.
A.7.3 Accedldo y 'lrty Blts
80 x 86 hurdwure proporclonu uslstenclu puru lu upllcucln de ulgorltmos de reempluzo de pglnus u
truvs de un pur de blts en lu entrudu de lu tublu de pglnus (3TE) puru cudu pglnu. En cuulquler leer o
escrlblr en unu pglnu lu C3U estublece el bltde ucceso u 1 en el TE3 de lu pglnu y en cuulquler
escrlturu lu C3U estublece el blt u 1. Lu C3U no restublece los blts u 0 pero el slstemu operutlvo puede
hucerlo.
Lu lnterpretucln correctu de estos blts requlere lu comprensln de los ullus es declr dos (o ms) lus
pglnus que se refleren ul mlsmo murco. Cuundo un murco de ullus se uccede los blts de ucceso y suclo
se uctuullzun en unu solu entrudu de tublu de lu pglnu (lu de lu pglnu utlllzudu puru el ucceso). Los blts
de ucceso y suclo por los ullus de otros no se uctuullzun.
Vuse lu seccln 4.1.5.1 se uccede y 'lrty Blts en lu upllcucln de estos blts en lu upllcucln de
ulgorltmos de reempluzo de pglnus.
Funcln: bool pugedlrlsdlrty (ulnt32t * 3' const vold * lu pglnu)
Funcln: bool pugedlrlsuccessed (ulnt32t * 3' const vold * lu pglnu)
'evuelve true sl el dlrectorlo de pglnus pd contlene unu entrudu de tublu de pglnu por pglnu
que est murcudo suclus (o ucceso). 'e lo contrurlo devuelve fulse.
Funcln: vold pugedlrsetdlrty (ulnt32t * 3' const vold * lu pglnu bool vulor)
Funcln: vold pugedlrsetuccessed (ulnt32t * 3' const vold * lu pglnu bool vulor)
Sl el dlrectorlo de pglnus 3' tlene unu entrudu de tublu de pglnu por pglnu entonces su
suclo (o ucceso) poco se estublece en el vulor.
A.7.4 pglnu 'etulles de lu Mesu
Lus funclones prevlstus con 3lntos son suflclentes puru e|ecutur los proyectos. Sln emburgo toduviu
puede resultur utll puru entender el formuto de tublu de lu pglnu de hurdwure por lo que entruremos en
un pequeno detulle en estu seccln.
A.7.4.1 Estructuru
Lu purte superlor-nlvel de lu estructuru de dutos de puglnucln es unu pglnu denomlnudu "dlrectorlo de
pglnus" (3' dlspuestu como unu mutrlz de 1.024 entrudus de 32 pglnus poco dlrectorlo (3'E cudu
uno de los cuules representu 4 MB de memorlu vlrtuul. Cudu 3'E puede upuntur u lu dlreccln fislcu de
otru pglnu llumudu "tublu de pglnus" (3T orgunlz uslmlsmo como unu mutrlz de 1.024 entrudus de
32 pglnus poco de mesu (3TE cudu uno de lo que se truduce unu unlcu pglnu vlrtuul de 4 KB puru
unu pglnu fislcu.
Truduccln de unu dlreccln vlrtuul u unu dlreccln fislcu slgue el proceso de tres pusos se llustru en el
dlugrumu slgulente: (6
1. El ms slgnlflcutlvo-10 blts de lu dlreccln vlrtuul (blt 22 ... 31 el indlce de dlrectorlo de lu
pglnu. Sl el 3'E es murcudo como "presente" lu dlreccln fislcu de unu tublu de pglnus se
lee de lu 3'E obtenldu. Sl el 3'E est murcudu no "presente" entonces se produce un fullo de
pglnu.
2. Los prxlmos 10 blts de lu dlreccln vlrtuul (blt 12 ... 21 el indlce de lu tublu de lu pglnu. Sl el
3TE est murcudo como "presente" lu dlreccln fislcu de unu pglnu de dutos se leen desde el
3TE usi obtenldos. Sl el 3TE no est murcudo "presente" entonces se produce un fullo de
pglnu.
3. El menos slgnlflcutlvo 12 blts de lu dlreccln vlrtuul (los blts de 0 ... 11 son unudldos u lu buse
fislcu de lu pglnu de dutos lu obtencln de lu dlreccln fislcu flnul.

31 22 21 12 11 0
+----------------------+----------------------+--- -------------------+
| 3glnu del repertorlo Indlce | Tublu Indlce | Offset |
+----------------------+----------------------+--- -------------------+
| | |
/ / /
/ / /
/ 3glnu 'lrectorlo / Tublu de 3glnu / 3glnu de dutos de
/ .. / .. / ..
| 1.023 || | 1.023 || | ||
| 1.022 || | 1.022 || | ||
| 1.021 || | 1.021 || \ \ ||
| 1.020 || | 1.020 || /||
| | | | | | | |
| | | \ \ | | | |
| |. | / |. | \ |. |
\ \ |. | |. | | |. |
/ |. | \ |. | | |. |
|. | | |. | | |. |
| | | | | | | |
|| | || | ||
4 || | 4 || | ||
3 || | 3 || | ||
2 || | 2 || | ||
1 || | 1 || | ||
0 || \ \ 0 || \ \ ||
/ /
Plntos proporclonu ulgunus mucros y funclones que son utlles puru trubu|ur con tublus de pglnu en
bruto:
Mucro: PTSHIFT
Mucro: PTBITS
El indlce de blt de purtldu (12) y el numero de blts (10), respectlvumente, en un indlce de tublu
de pglnu.
Mucro: PTMASK
Unu mscuru de blts con los blts en el indlce de lu tublu de pglnus u 1 y el resto el vulor
0 (0x3ff000).
Mucro: PTSPAN
El numero de bytes de espuclo de dlrecclones vlrtuules que unu solu tublu de lu pglnu pglnu
cubre (4.194.304 bytes, o 4 MB).
Mucro: PDSHIFT
Mucro: PDBITS
El indlce de blt de purtldu (22) y el numero de blts (10), respectlvumente, en un indlce de
dlrectorlo de lu pglnu.
Mucro: PDMASK
Unu mscuru de blts con los blts en el indlce de dlrectorlo de pglnus u 1 y otros blts estublece
en 0 (0xffc00000).
Funcln: ulntptrt pdno (const vold * VA)
Funcln: ulntptrt ptno (const vold * VA)
Devuelve el indlce de dlrectorlo de lu pglnu o el indlce de tublu de pglnu,
respectlvumente, vu de dlrecclones vlrtuules.Estus funclones se deflnen en hllos / pte.h.
Funcln: pgofs slgno (const vold * VA)
Devuelve el despluzumlento de pglnu puru vu de dlrecclones vlrtuules. Estu funcln se deflne
en hllos / vuddr.h.
A.7.4.2 Pglnu de entrudu de tublu Formuto de
Usted no necesltu entender el formuto de PTE puru reullzur los proyectos Plntos, u menos que desee
lncorporur lu tublu de pglnus en lu tublu de lu pglnu de consultu (vuse lu seccln 4.1.4 Gestln de lu
tublu de pglnus de consultu).
El formuto reul de unu entrudu de tublu de pglnus se resumen u contlnuucln. Puru obtener lnformucln
completu, consulte lu seccln 3.7, "Uso de lu truduccln de pglnus de 32 blts de dlreccln fislcu",
en [IA32-V3u].

31 12 11 9 6 5 2 1 0
+---------------------------------------+----+---- +-+-+---+-+-+-+
| Dlreccln Fislcu | AVL | | D | A | | U | W | P |
+---------------------------------------+----+---- +-+-+---+-+-+-+
Algunos ms lnformucln sobre cudu blt se lndlcun u contlnuucln. Los nombres son los hllos
/ mucros pte.h que representun los vulores de los blts ":
Mucro: PTEP
El blt 0, el "presente" blts. Cuundo este blt es 1, los otros blts se lnterpretun como se descrlbe u
contlnuucln. Cuundo este blt es 0, cuulquler lntento de ucceder u lu pglnu ser fullo de
pglnu. Los blts restuntes son entonces no utlllzudos por lu CPU y puede ser utlllzudo por el
slstemu operutlvo puru cuulquler propslto.
Mucro: PTEW
Blt 1, lu "lecturu / escrlturu" poco. Cuundo es 1, lu pglnu se puede escrlblr. Cuundo es 0, se
lntentu escrlblr fullo de pglnu.
Mucro: PTEU
Blt 2, el "usuurlo /" supervlsor de blts. Cuundo es 1, los procesos de usuurlo puede ucceder u lu
pglnu. Cuundo es 0, slo el kernel puede ucceder u lu pglnu (ucceso usuurlo error de pglnu).
Plntos borru este blt en el PTE puru el nucleo de lu memorlu vlrtuul, puru evltur procesos de
usuurlo de ucceder u ellos.
Mucro: PTEA
Blt 5, el "ucceso" blts. Veu lu seccln A.7.3 Accedldo y Blts Dlrty.
Mucro: PTED
Blt 6, el "suclo" de blts. Veu lu seccln A.7.3 Accedldo y Blts Dlrty.
Mucro: PTEAVL
9 ... 11 blts, dlsponlble puru el uso del slstemu operutlvo. Plntos, segun lo prevlsto, no se
utlllzun y los pone u 0.
Mucro: PTEADDR
Blts 12 ... 31 de los 20 blts de lu dlreccln fislcu de un murco. Lu bu|u de 12 blts de lu dlreccln
del murco son slempre 0.
Otrus purtes son reservudos o sln lnters en un contexto Plntos y se deberiu estublecer en empute @ ()
0.
Hllos Encubezudo pte.h deflne tres funclones puru trubu|ur con entrudus de tublu de pglnu:
Funcln: ptecreutekernel ulnt32t (ulnt32t * lu pglnu, bool escrlturu)
Devuelve unu entrudu de tublu de lu pglnu que senulu u lu pglnu, que deberiu ser un nucleo
de dlrecclones vlrtuules. El PTE poco presente ser fl|udo. Se murcur puru el nucleo de ucceso
solumente. Sl lu escrlturu es clerto, el PTE tumbln se murcun de lecturu / escrlturu, de lo
contrurlo, ser de slo lecturu.
Funcln: ptecreuteuser ulnt32t (ulnt32t * lu pglnu, bool escrlturu)
Devuelve unu entrudu de tublu de lu pglnu que senulu u lu pglnu, que deberiu ser el nucleo de
dlreccln vlrtuul de un murco en el grupo de usuurlos (ver PALUSER Por qu?). El PTE poco
presente en que se estublecern y se murcur puru permltlr ucceso en modo usuurlo. Sl
lu escrlturu es clerto, el PTE tumbln se murcun de lecturu / escrlturu, de lo contrurlo, ser de
slo lecturu.
Funcln: vold * ptegetpuge (PTE ulnt32t)
Devuelve el nucleo de dlreccln vlrtuul puru el murco que upuntu u pte. El PTE puede estur
presente o no-presente, sl no lo es, presente, entonces el puntero devuelto slo tlene sentldo sl
los blts de dlreccln en el PTE representun reulmente unu dlreccln fislcu.
A.7.4.3 Formuto de pglnu de dlrectorlo de entrudu
Entrudus de dlrectorlo de pglnus tlenen el mlsmo formuto que el PTE, sulvo que los puntos de dlreccln
fislcu u unu pglnu de tublu de pglnus en lugur de un murco. Hllos Encubezudo pte.h deflne dos
funclones puru trubu|ur con entrudus de dlrectorlo de lu pglnu:
Funcln: pdecreute ulnt32t (ulnt32t * pt)
Devuelve un dlrectorlo de pglnus que upuntu u lu pglnu, que deberiu ser el nucleo de
dlreccln vlrtuul de unu pglnu de tublu de pglnu. El PDE poco presente ser estublecldo, ste
estur murcudo puru permltlr el ucceso de modo de usuurlo, y ste estur murcudo de lecturu /
escrlturu.
Funcln: ulnt32t * pdegetpt (PDE ulnt32t)
Devuelve el nucleo de dlrecclones vlrtuules puru lu pglnu de lu tublu de pglnus que lu
PDE, que se debe murcur lu uctuulldud, upuntu.
A.8 Tublu hush
Plntos proporclonu unu estructuru de dutos de lu tublu hush en llb / kernel / hush.c. Puru usurlo usted
tendr que lnclulr su urchlvo de cubeceru, llb / kernel / hush.h, con #lnclude <hush.h> Cdlgo provlsto
de Plntos se utlllzu lu tublu hush, lo que slgnlflcu que usted es llbre de usurlo como es, modlflcur su
upllcucln puru sus proplos flnes, o lo lgnorun, como usted deseu.
Lu muyoriu de lus lmplementuclones del proyecto de memorlu vlrtuul utlllzu unu tublu hush puru truduclr
pglnus de murcos.Usted puede encontrur otros usos puru lus tublus hush tumbln.
A.8.1 Tlpos de dutos
Unu tublu hush es representudu por struct hush
Tlpo: struct hush
Representu unu tublu hush entero. Los mlembros uctuules de lu struct hush son "opucus". Es
declr, el cdlgo que utlllzu unu tublu hush no deben tener ucceso struct hush mlembros struct
hush dlrectumente, nl tumpoco necesurlo. En su lugur, utlllzur lus funclones de tublu hush y
mucros.
Lu tublu hush operu en los elementos de tlpo struct hushelem
Tlpo: struct hushelem
Incrustur un struct hushelem mlembro struct hushelem en lu estructuru que deseu lnclulr en
unu tublu hush. Comostruct hush struct hushelem es opuco. Todus lus funclones puru operur
sobre elementos de lu tublu hush en reulldud tomur y devolver punteros u struct hushelem no
punteros u tlpo de elemento reul de lu tublu hush.
A menudo se necesltun puru obtener unu struct hushelem dudo un verdudero elemento de lu tublu hush,
y vlceversu.Tenlendo en cuentu un verdudero elemento de lu tublu hush, puede utlllzur el
operudor & puru obtener un puntero u su struct hushelem Usur lu hushentry() mucro puru lr lu otru
dlreccln.
Mucro: * Tlpo de hushentry (struct hushelem * elem, tlpo, mlembro)
Devuelve un puntero u lu estructuru que elem, un puntero u unu struct hushelem est
lncrustudo dentro. Usted debe proporclonur el tlpo, el nombre de lu estructuru que se encuentru
dentro de elem, y mlembro, el nombre del mlembro en el tlpo que upuntu u elem.
Por e|emplo, supongumos que h es unu struct hushelem * vurluble que upuntu u unu struct
threud mlembro struct threud (de tlpo struct
hushelem llumudo helem Luego, hushentry@tle{ struct hllo, helem)) se obtlene lu dlreccln
de lu struct threud que los puntos h dentro.
Ver A.8.5 seccln Hush tublu de e|emplo, puru un e|emplo.
Cudu elemento de lu tublu hush debe contener unu cluve, es declr, los dutos que ldentlflcu y dlstlngue
los elementos, que debe ser unlco entre los elementos de lu tublu hush. (Los elementos tumbln pueden
contener dutos no esenclules que no tlenen por qu ser unlco.) Mlentrus que un elemento se encuentru
en unu tublu hush, sus dutos cluve no debe ser cumbludo. En cumblo, sl es necesurlo, ellmlnur el
elemento de lu tublu hush, modlflcur su cluve, u contlnuucln, vuelvu u lnsertur el elemento.
Puru cudu tublu hush, debe escrlblr dos funclones que uctuun sobre lus teclus: unu funcln de hush y unu
funcln de compurucln. Estus funclones deben colncldlr con los prototlpos slgulentes:
Tlpo: unslgned hushhushfunc (const struct hushelem * elemento, vold * uux)
Devuelve un hush del elemento 's de dutos, como un vulor en cuulquler purte de lu gumu
de unslgned lnt El hush de un elemento deberiu ser unu funcln pseudo-uleutorlu de lu cluve del
elemento. No debe depender de los dutos no en el elemento cluve o dutos de curcter no
permunente que no seun lu cluve. Plntos proporclonu lus slgulentes funclones como unu buse
udecuudu puru lus funclones de hush.
Funcln: hushbytes slgno (const vold * buf, slzet * slze)
Devuelve un hush del tumuno de bytes u purtlr buf. Lu upllcucln es el propslto
generul Fowler-Noll-hush Vode pulubrus de 32 blts.
Funcln: hushstrlng slgno (const chur * s)
Devuelve un hush de lu cudenu termlnudu s.
Funcln: hushlnt slgno (lnt l)
Devuelve un hush de l entero.
Sl lu cluve es unu plezu unlcu de los dutos de un tlpo udecuudo, lo lglco es que su funcln de
hush puru regresur dlrectumente u lu sulldu de unu de estus funclones. Puru multlples plezus de
dutos, usted puede comblnur lu produccln de ms de unu llumudu u su uso, por e|emplo, el ^ (o
excluslvo). Por ultlmo, se puede lgnorur por completo estus funclones y escrlblr su proplu
funcln de hush u purtlr de cero, pero recuerde que su ob|etlvo es construlr un kernel del
slstemu operutlvo, no dlsenur unu funcln hush.
Veu lu seccln A.8.6 de dutos uuxlllures, puru unu expllcucln de uux.
Tlpo: bool hushlessfunc (const struct hushelem * u, struct hushelem * b, vold * uux
Compuru lus cluves ulmucenudus en los elementos u y b. Devuelve true sl u es menor
que b, fulsu sl u es muyor que o lguul u b.
Sl dos elementos son lguules, entonces se debe u los vulores hush de lguuldud.
Veu lu seccln A.8.6 de dutos uuxlllures, puru unu expllcucln de uux.
Ver A.8.5 seccln Hush tublu de e|emplo, puru lu funcln de hush y e|emplos de compurucln.
Unus pocus funclones uceptu un puntero u un tercer tlpo de funcln como un urgumento:
Tlpo: vold hushuctlonfunc (struct hushelem * elemento, vold * uux
Reullzu ulgun tlpo de uccln, elegldo por el cllente, en el elemento.
Veu lu seccln A.8.6 de dutos uuxlllures, puru unu expllcucln de uux.
A.8.2 Funclones bslcus
Estus funclones de creur, destrulr, e lnspecclonur lus tublus hush.
Funcln: hushlnlt bool (struct hush * hush, hushhushfunc * hushfunc, hushlessfunc
* lessfunc, vold * uux,
Hush Inlclullzu como unu tublu hush con hushfunc como funcln hush,
Devoluclones lessfunc como funcln de compurucln, y como uux dutos uuxlllures. Verdudero
sl tlene xlto, fulse en cuso de fullo. hushlnlt( lus llumudusmulloc( y no sl lu memorlu no se
puede uslgnur.
Veu lu seccln A.8.6 de dutos uuxlllures, puru unu expllcucln de los uuxlllures, que suele ser
un puntero nulo.
Funcln: vold hushcleur (struct hush * hush, hushuctlonfunc * Accln
Ellmlnu todos los elementos de huchis, que debe huber sldo prevlumente lnlclullzudo
con hushlnlt(
Sl lu uccln no es nulo, entonces es llumudo unu vez puru cudu elemento de lu tublu hush, lo
que du lu personu que llumu unu oportunldud puru llberur cuulquler memorlu u otros recursos
utlllzudos por el elemento. Por e|emplo, sl los elementos de lu tublu hush son uslgnudos
dlnmlcumente usundo mulloc( entonces lu uccln podriu free( del elemento. Esto es seguro
porque hushcleur( no tendrn ucceso u lu memorlu en un elemento hush dudo despus de
llumur u lu ucclnsobre ellu. Sln emburgo, lu uccln no debe llumur u cuulquler funcln que
pueden modlflcur lu tublu hush, comohushlnsert( o hushdelete(
Funcln: hushdestroy vold (struct hush * hush, hushuctlonfunc * Accln
Sl lu uccln no es nulo, lo llumu puru cudu elemento en el hush, con lu mlsmu semntlcu como
unu llumudu uhushcleur( Entonces, llberu lu memorlu ocupudu por hush. Despus, hush no se
debe pusur u cuulquler funcln de tublu hush, en uusenclu de unu llumudu u
lntervenlr hushlnlt(
Funcln: hushslze slzet (struct hush * hush
Devuelve el numero de elementos ulmucenudos en el hush.
Funcln: hushempty bool (struct hush * hush
Devuelve true sl hush uctuulmente no contlene elementos, fulso sl hush contlene ul menos un
elemento.
A.8.3 Funclones de busquedu
Cudu unu de estus busquedus en unu tublu hush puru un elemento que se compuru lguul u lu
prevlstu. Busudo en el xlto de lu busquedu, que llevun u cubo ulgunu uccln, como lu lnsercln de un
nuevo elemento en lu tublu hush, o slmplemente devolver el resultudo de lu busquedu.
Funcln: struct hushelem * hushlnsert (struct hush * hush, struct hushelem * elemento
Busquedus hush de un elemento lguul ul elemento. Sl no encuentru nlnguno, se
lnsertu elemento en hush y devuelve un puntero nulo. Sl lu tublu yu contlene un elemento lguul
ul elemento, se devuelve sln modlflcur hush.
Funcln: struct hushelem * hushrepluce (struct hush * hush, struct hushelem * elemento
Insertu elemento en hush. Cuulquler elemento lguul ul elemento que yu estn en hush es
ellmlnudo. Devuelve el elemento ellmlnudo, o un puntero nulo sl hush no contlene un elemento
lguul ul elemento.
El llumudor es responsuble de llberundo los recursos usocludos con el elemento devuelto, segun
el cuso. Por e|emplo, sl los elementos de lu tublu hush son uslgnudos dlnmlcumente
usundo mulloc( entonces lu personu que llumu debe free(del elemento despus de que yu no
es necesurlo.
El elemento pusu u lus slgulentes funclones slo se utlllzu puru hush y propsltos de
compurucln. Nuncu se lnsertun reulmente en lu tublu hush. Por lo tunto, slo los dutos cluve en el
elemento tlene que ser lnlclullzudo, y otros dutos en el elemento no se utlllzur. Con frecuenclu tlene
sentldo declurur unu lnstunclu del tlpo de elemento como unu vurluble locul, lnlclullzur los dutos cluve, y
luego pusur lu dlreccln de su struct hushelem u hushflnd( o hushdelete( Ver A.8.5 seccln Hush
tublu de e|emplo, puru un e|emplo. (Estructurus de grun tumuno no deberiun uslgnurse como vurlubles
locules. Vuse A.2.1 secclnstruct threud puru ms lnformucln.
Funcln: struct hushelem * hushflnd (struct hush * hush, struct hushelem * elemento
Busquedus hush de un elemento lguul ul elemento. Devuelve el elemento que se encuentru, en
su cuso, o un puntero nulo lo contrurlo.
Funcln: struct hushelem * hushdelete (struct hush * hush, struct hushelem * elemento
Busquedus hush de un elemento lguul ul elemento. Sl se encuentru uno, se retlru de hush y
regres. De lo contrurlo, un puntero nulo se devuelve y el hush no se modlflcu.
El llumudor es responsuble de llberundo los recursos usocludos con el elemento devuelto, segun
el cuso. Por e|emplo, sl los elementos de lu tublu hush son uslgnudos dlnmlcumente
usundo mulloc( entonces lu personu que llumu debe free(del elemento despus de que yu no
es necesurlo.
A.8.4 Iterucln Funclones
Estus funclones permlten lterur u truvs de los elementos en unu tublu hush. Dos lnterfuces son
ofrecldos. El prlmero requlere lu escrlturu y sumlnlstrur un hushuctlonfunc puru uctuur en cudu
elemento (vuse lu seccln A.8.1 Tlpos de dutos.
Funcln: vold hushupply (struct hush * hush, hushuctlonfunc * Accln
Plde uccln unu vez puru cudu elemento de huchis, en orden urbltrurlo. Lu uccln no debe
llumur u cuulquler funcln que pueden modlflcur lu tublu hush,
como hushlnsert( o hushdelete( Lu uccln no debe modlflcur dutos fundumentules en los
elementos, uunque puede modlflcur cuulquler otros dutos.
Lu segundu lnterfuz se busu en lterudor un "tlpo" de dutos. Idlomtlcumente, lterudores se utlllzun como
slgue:

struct l hushlterutor;

hushflrst (& l, h;
whlle (hushnext (& l
(
struct pepe * f = hushentry (hushcur (+ l, struct pepe, elem;
... Hucer ulgo con f ...

Tlpo: struct hushlterutor
Representu unu poslcln dentro de unu tublu hush. De llumur u cuulquler funcln que puede
modlflcur unu tublu hush, como hushlnsert() o hushdelete() lnvulldu todos los lterudores
dentro de esu tublu hush.
Como struct hush y struct hushelem struct hushelem es opuco.
Funcln: vold hushflrst (struct hushlterutor * lterudor, struct hush * hush)
Iterudor Inlclullzu |usto untes del prlmer elemento de hush.
Funcln: struct hushelem * hushnext (struct hushlterutor * lterudor)
Avunces lterudor ul slgulente elemento de hush, y devuelve ese elemento. Devuelve un puntero
nulo sl no huy elementos que permunecen. Despus de hushnext() devuelve un vulor nulo
puru lterudor, llumundo de nuevo los rendlmlentos de un comportumlento lndeflnldo.
Funcln: struct hushelem * hushcur (struct hushlterutor * lterudor)
Devuelve el ultlmo vulor devuelto por hushnext() puru lterudor. Los rendlmlentos
comportumlento lndeflnldo despus de hushflrst() se hu llumudo el repetldor, pero untes
de hushnext() hu sldo llumudo por prlmeru vez.
A.8.5 E|emplo de Tublu Hush
Supongumos que tlene unu estructuru, denomlnudu struct puge que deseu poner en unu tublu hush. En
prlmer lugur, deflnlrstruct puge puru lnclulr unu struct hushelem mlembro struct hushelem

lu estructuru de pglnu
(
struct hushelem hushelem; / * elemento de lu tublu Hush. * /
vold * uddr; / * dlreccln vlrtuul. * /
/ * ... Los dems mlembros ... * /
);
Escrlblmos unu funcln de hush y unu funcln de compurucln con uddr como lu cluve. Un lndlcudor
puede ser hush busudu en su bytes, y el operudor <funclonu blen puru lu compurucln de los punteros:

/ * Devuelve un vulor hush puru p pglnu. * /
unslgned
pugehush (const struct hushelem p *, vold * uux SIN USAR)
(
const struct puge * p = hushentry (p, lu estructuru de pglnu, hushelem);
hushbytes retorno (& p-> uddr, slzeof p-> uddr);
)

* Devuelve true / sl b precede u unu pglnu de lu pglnu. * /
bool
pugeless (const struct hushelem * u, struct hushelem * b,
vold * uux SIN USAR)
(
const struct puge * A = hushentry (u, lu estructuru de pglnu, hushelem);
const lu estructuru de pglnu * b = hushentry (b, lu estructuru de pglnu, hushelem);

regreso u-> uddr <b-> uddr;
)
(El uso de UNUSED en los prototlpos de estus funclones 'suprlme uux unu udvertenclu de que no se
utlllzu. Veu lu secclnE.3 funclones y purmetros de utrlbutos, puru obtener lnformucln
sobre UNUSED Veu lu seccln A.8.6 de dutos uuxlllures,puru unu expllcucln de uux.)
Entonces, podemos creur unu tublu hush como estu:

struct pglnus hush;

hushlnlt (y pglnus, pugehush, pugeless, NULL);
Ahoru podemos munlpulur lu tublu hush que hemos creudo. Sl p es un puntero u unu struct
puge podemos lnserturlo en lu tublu hush con:

(hushlnsert y pglnus, & p-> hushelem);
Sl huy unu poslbllldud de que lus pglnus que yu podriun contener unu pglnu con el
mlsmo uddr, entonces debemos comprobur hushlnsert() 's vulor de retorno.
Puru buscur un elemento en lu tublu hush, el uso hushflnd() Esto requlere unu conflgurucln de poco,
porque hushflnd()tomu un elemento de compurucln. He uqui unu funcln que vu u encontrur y
devolver u unu pglnu busudu en unu dlreccln vlrtuul, en el supuesto de que lus pglnus se deflne en el
mblto de urchlvo:

/ * Devuelve lu pglnu que contlene lu dlreccln vlrtuul dudo,
o un puntero nulo sl no exlste esu pglnu. * /
lu estructuru de pglnu *
pugelookup (const vold * Correo)
(
struct pglnu p;
struct hushelem * E;

= p.uddr dlreccln;
E = hushflnd pglnus (&, & p.hushelem);
e volver! = NULL? hushentry (e, lu estructuru de pglnu, hushelem): NULL;
)
struct puge se uslgnu como unu vurluble locul uqui en el supuesto de que es bustunte pequeno. Grundes
estructurus no deben ser uslgnudos como vurlubles locules. Ver A.2.1 seccln struct threud puru ms
lnformucln.
Unu funcln slmllur podriu ellmlnur unu pglnu de dlreccln medlunte hushdelete()
A.8.6 de dutos uuxlllures
En cusos senclllos como el e|emplo unterlor, no huy necesldud de que los purmetros de uux. En estos
cusos, slo tlene que pusur un puntero nulo puru hushlnlt() puru uux e lgnorur los vulores pusudos u lu
funcln de control y funclones de compurucln. (Usted reclblr unu udvertenclu del complludor, sl usted
no utlllzu el purmetro uux, pero puede que fueru u su vez con lu mucro UNUSED como se muestru en
el e|emplo, o puede slmplemente lgnorurlo.)
uux es utll cuundo usted tlene ulgunu propledud de los dutos en lu tublu hush es u lu vez constunte y
necesurlu puru lu dlspersln o lu compurucln, pero no se ulmucenun en los elementos de dutos en
si. Por e|emplo, sl los elementos de unu tublu hush son cudenus de longltud fl|u, pero los elementos en si
no lndlcun lo que es de longltud fl|u, puede pusur de lu longltud como un purmetro de uux.
A.8.7 Slncronlzucln
Lu tublu hush no huce nlngunu slncronlzucln lnternu. Es responsubllldud de lu personu que llumu puru
slncronlzur lus llumudus u funclones de tublu hush. En generul, cuulquler numero de funclones que
exumlnur, pero no modlflcur lu tublu hush, comohushflnd() o hushnext() puede e|ecutur
slmultneumente. Sln emburgo, estus funclones no se pueden e|ecutur de formu seguru ul mlsmo
tlempo, como cuulquler otru funcln que puede modlflcur unu tublu hush dudo,
como hushlnsert() ohushdelete() nl puede ms de unu funcln que puede modlflcur unu tublu hush
dudo e|ecuturse sln problemus u lu vez.
Es tumbln responsubllldud de lu personu que llumu puru slncronlzur el ucceso u los dutos de elementos
de lu tublu hush. Cmo slncronlzur el ucceso u estos dutos depende de cmo est dlsenudo y
orgunlzudo, como con cuulquler otru estructuru de dutos.
B. 4.4 BSD Progrumudor
El ob|etlvo de un plunlflcudor de propslto generul conslste en equlllbrur lus necesldudes de hllos 'de
progrumucln dlferente.Temus u los que reullzun un grun numero de E / S requleren un tlempo de
respuestu rpldo puru muntener dlsposltlvos de entrudu y sulldu de ocupudo, pero necesltu poco tlempo
de CPU. Por otro ludo, culculur con destlno hllos necesldud de reclblr unu grun cuntldud de tlempo de
CPU puru termlnur su trubu|o, pero no tlenen necesldud de tlempo de respuestu rpldo. Otros temus se
encuentrun en un punto lntermedlo, con periodos de I / O lnterrumpldus por periodos de clculo, y por lo
tunto tlenen necesldudes que vuriun con el tlempo. Un slstemu blen dlsenudo progrumudor puede
ucomodur u menudo lus dlscuslones con todos estos requlsltos de muneru slmultneu.
Puru el proyecto 1, debe poner en prctlcu el progrumudor se descrlbe en este upndlce. Nuestro
culendurlo se useme|u u lu descrltu en [McKuslck], que es un e|emplo de un plunlflcudor de nlveles
multlples comenturlos de colu. Este mtodo de plunlflcucln muntlene vurlus colus de hllos llstos puru
e|ecuturse, donde cudu colu contlene temus con unu prlorldud dlstlntu. En un momento dudo, el
progrumudor ellge un hllo de lu ms ultu prlorldud no-colu vuciu. Sl lu colu de muyor prlorldud contlene
multlples hllos, corren en "round robln" orden ".
Multlples fucetus del plunlflcudor requlere que los dutos se uctuullzurn despus de un clerto numero de
pusos de temporlzudor.En todos los cusos, estos cumblos deben ocurrlr untes de cuulquler hllo del
nucleo comun tlene lu oportunldud de correr, de modo que no huy poslbllldud de que un hllo del nucleo
puede ver un tlmertlcks() reclente uumento tlmertlcks() de vulor, pero los vulores progrumudor de
dutos untlguos.
4.4 El plunlflcudor de BSD no lncluye lu donucln de prlorldud.
B.1 Nlceness
Prlorldud de subprocesos vlene determlnudo dlnmlcumente por el progrumudor medlunte unu frmulu u
contlnuucln. Sln emburgo, cudu hllo tlene tumbln un vulor "nlce" entero que determlnu lu formu
"ugruduble" el hllo se debe u otros hllos. Unugruduble de cero no ufectu u lu prlorldud hllo. Un resultudo
posltlvo de Nlzu, hustu el mxlmo de 20, dlsmlnuye lu prlorldud de un hllo y huce que puru dur ulgo de
tlempo de CPU que de otro modo reclblriun. Por otru purte, un negutlvo de Nlzu, ul minlmo de -20,
tlende u ule|ur u tlempo de CPU de otros flu|os.
El hllo lnlclul comlenzu con un vulor "nlce" de cero. Otros hllos comenzur con un vulor "nlce" heredudo
de sus pudres hllo.Debe lmplementur lus funclones descrltus u contlnuucln, que son puru uso de los
progrumus de pruebu. Hemos proporclonudo deflnlclones esqueleto puru ellos en hllos / threud.c.
Funcln: threudgetnlce lnt (vold)
Devuelve el subproceso uctuul vulor "nlce".
Funcln: vold threudsetnlce (newnlce lnt)
Estublece el vulor "nlce el flu|o uctuul de newnlce y reculculu lu prlorldud del hllo, busudo en el
nuevo vulor (vuse B.2seccln Clculo de prlorldud). Sl el hllo yu no tlene lu ms ultu prlorldud,
los rendlmlentos.
B.2 Clculo de Prlorldud
Nuestro culendurlo cuentu con 64 prlorldudes y por lo tunto lus colus de 64 llstus, numerudus del
0 PRIMIN u truvs de 63PRIMAX Clfrus ms bu|us corresponden u menor prlorldud, por lo que lu
prlorldud 0 es lu prlorldud ms bu|u y 63 es lu prlorldud ms ultu. Prlorldud de subprocesos se culculu
lnlclulmente en lu lnlclullzucln del hllo. Tumbln se vuelve u culculur unu vez cudu tlctuc del relo| de
seslones, por cudu hllo. En cuulquler cuso, est determlnudo por lu frmulu
= prlorldud PRIMAX - (recentcpu / 4) - (nlce * 2),
donde recentcpu es unu estlmucln del tlempo de CPU del hllo hu utlllzudo reclentemente (vuse ms
udelunte) y de Nlzu, Nlzu es el vulor del hllo. Los coeflclentes de 1 / 4 y 2
en recentcpu y Nlzu, respectlvumente, se hu comprobudo que funclonun blen en lu prctlcu, pero
curecen de slgnlflcudo ms profundo. Lu prlorldud culculudo se u|ustu slempre u estur en
elPRIMIN rungo vlldo puru PRIMAX
Estu frmulu du un hllo que hu reclbldo huce poco tlempo de CPU de prlorldud menor puru ser
reuslgnudos u lu CPU de lu prxlmu vez que el plunlflcudor de currerus. Estu es lu cluve puru prevenlr el
humbre: un hllo que no hu reclbldo huce poco tlempo de CPU tendr un recentcpu de 0, que sulvo un
ulto vulor "nlce" deberiu usegururse de que reclbe tlempo de CPU en breve.
Recentcpu Clculo B.3
Deseumos recentcpu puru medlr cunto tlempo de CPU de cudu proceso hu reclbldo
"reclentemente". Por otru purte, como un reflnumlento, el tlempo de CPU ms reclente, debe ser ms
peso que el tlempo de CPU menos reclente. Un enfoque conslstlriu en utlllzur unu mutrlz de n elementos
puru rustreur el tlempo de CPU reclbldus en cudu uno de los ultlmos nsegundos. Sln emburgo, este
enfoque requlere O (n de espuclo por hllo y O (n por el clculo de unu medlu ponderudu de nuevo.
En su lugur, usumos un promedlo mvll exponenclul ponderudu, que tlene estu formu generul:
x (0 = f (0,
x (t = u * x (t-1 + f (t,
u = k / (k +1,
donde x (t es lu medlu mvll en el tlempo entero> = 0, f (t es lu funcln de ser un promedlo, y k> 0
controlu lu velocldud de descomposlcln. Podemos lterur lu frmulu ms de unos pocos pusos de lu
slgulente muneru:
x (1 = f (1,
x (2 = u * f (1 + f (2,
...
x (5 = u 4 ** * f (1 + u 3 ** * f (2 + 2 ** * f (3 + u * f (4 + f (5.
El vulor de f (t tlene un peso de 1 en el tlempo t, un peso de un tlempo t +1, un ** 2 en el tlempo t +2, y
usi suceslvumente.Tumbln puede reluclonurse x (t puru K: f (t tlene un peso de uproxlmudumente 1 /
e en el tlempo t + k, uproxlmudumente 1 / e ** 2 en el tlempo t +2 * k, y usi suceslvumente. Desde el
dlreccln opuestu, f (t se descompone con el peso w en el tlempo t + ln (W / ln (u.
El vulor lnlclul de recentcpu es 0 en el prlmer hllo creudo, o el vulor de los pudres en otros temus
nuevos. Cudu vez que se produce unu lnterrupcln de temporlzudor, recentcpu se lncrementu en 1 puru
el hllo solumente, u menos que el hllo de lnuctlvldud se est e|ecutundo. Adems, unu vez por segundo,
el vulor de recentcpu se vuelve u culculur puru cudu hllo (yu seu en e|ecucln, llsto o bloqueudo,
utlllzundo lu slgulente frmulu:
recentcpu = (2 * louduvg / (2 * louduvg + 1 * recentcpu + nlce,
donde louduvg es unu medlu mvll del numero de hllos dlspuestos u correr (ver ms
ubu|o. Sl louduvg es 1, lo que lndlcu que un solo hllo, en promedlo, est compltlendo por lu CPU, el
vulor uctuul de lus deslntegruclones recentcpu un peso de .1 en ln (.1 / ln (2 / 3 = uprox. 6 segundos,
sl louduvg es 2, entonces lu decudenclu de un peso de .1 se ln (.1 / ln (3 / 4 = uprox. 8 segundos. El
efecto es que recentcpu estlmu que lu cuntldud de tlempo de CPU hu reclbldo el hllo "reclentemente",
con lu tusu de deculmlento lnversumente proporclonul ul numero de subprocesos que complten por lu
CPU.
Suposlclones hechus por ulgunus de lus pruebus requleren que lus uctuullzuclones de recentcpu hucer
exuctumente cuundo el puso del slstemu contudor llegue u un multlplo de un segundo, es declr,
cuundo tlmertlcks ( % TIMERFREO == 0 y no en cuulquler otro momento.
El vulor de recentcpu puede ser negutlvo puru un hllo con un vulor "nlce" negutlvos. No
ubruzuderu recentcpu negutlvu u 0.
Es poslble que tengu que pensur en el orden de los clculos en estu frmulu. Le recomendumos culculur
el coeflclente derecentcpu prlmero, y luego multlpllcur. Algunos estudluntes hun reportudo
que louduvg multlpllcundo por recentcpudlrectumente puede cuusur el desbordumlento.
Debe lmplementur threudgetrecentcpu( puru lo cuul huy un esqueleto en hllos / threud.c.
Funcln: threudgetrecentcpu lnt (vold
Devuelve 100 veces el vulor recentcpu del subproceso uctuul, redondeudo ul entero ms
cercuno.
/ouduvg B.4 Clculo
Por ultlmo, louduvg, u menudo conocldo como el promedlo de curgu del slstemu, estlmu que el numero
medlo de hllos llstos puru e|ecuturse en los ultlmos mlnutos. Como recentcpu, es unu medlu mvll
exponenclul ponderudo. A dlferenclu deprlorldud y recentcpu, louduvg es todo el slstemu, no hllo
especiflco. En el urrunque del slstemu, se lnlclullzu u 0. Unu vez por segundo u purtlr de entonces, se
uctuullzu de ucuerdo con lu slgulente frmulu:
louduvg = (59/60) * louduvg + (1 / 60) reudythreuds *,
donde reudythreuds es el numero de subprocesos que estn llevundo u cubo o estn dlspuestos u
correr en el momento de lu uctuullzucln (no lncluye el hllo de lnuctlvldud).
Debldo u lu hlptesls formuludu por ulgunus de lus pruebus, louduvg debe ser uctuullzudo exuctumente
cuundo el puso del slstemu contudor llegue u un multlplo de un segundo, es declr, cuundo tlmertlcks ()
% TIMERFREO == 0 y no en cuulquler otro momento.
Debe lmplementur threudgetlouduvg() puru lo cuul huy un esqueleto en hllos / threud.c.
Funcln: threudgetlouduvg lnt (vold)
Devuelve 100 veces el promedlo uctuul de lu curgu del slstemu, redondeudo ul entero ms
cercuno.
B.5 Resumen
/us frmulus slgulentes se resumen los clculos necesurlos puru upllcur el progrumudor. Ellos no son
unu descrlpcln completu de lus necesldudes del plunlflcudor.
Cudu hllo tlene un vulor "nlce" entre -20 y 20 dlrectumente bu|o su control. Cudu hllo tlene tumbln unu
prlorldud, entre 0PRIMIN u truvs de 63 PRIMAX que se vuelve u culculur medlunte lu slgulente
frmulu cudu tlck de seslones:
= prlorldud PRIMAX - (recentcpu / 4) - (nlce * 2).
recentcpu mlde lu cuntldud de tlempo de CPU hu reclbldo un hllo "reclentemente". En cudu puso del
temporlzudor,recentcpu el hllo se lncrementu en 1. Unu vez por segundo, recentcpu cudu hllo se
uctuullzu de este modo:
recentcpu = (2 * louduvg) / (2 * louduvg + 1) * + recentcpu ugruduble.
louduvg estlmu que el numero promedlo de hllos llstos puru e|ecuturse en los ultlmos mlnutos. Se
lnlclullzu u 0 en el urrunque y vuelve u culculur unu vez por segundo de lu slgulente muneru:
louduvg = (59/60) * louduvg + (1 / 60) reudythreuds *.
donde reudythreuds es el numero de subprocesos que estn llevundo u cubo o estn dlspuestos u
correr en el momento de lu uctuullzucln (no lncluye el hllo de lnuctlvldud).
B.6 punto fl|o Reul Arltmtlcu
En lus frmulus unterlores, lu prlorldud, ugruduble, y reudythreuds son enteros,
pero recentcpu y louduvg son numeros reules. /umentublemente, Plntos no soportu urltmtlcu de
punto flotunte en el nucleo, porque seriu compllcur y returdur el nucleo. Reul nucleos suelen tener lu
mlsmu llmltucln, por lu mlsmu ruzn. Esto slgnlflcu que los clculos sobre lus cuntldudes reules deber
ser slmuludo utlllzundo numeros enteros. Esto no es dlficll, pero muchos estudluntes no suben cmo
hucerlo. Estu seccln expllcu los conceptos bslcos.
/u ldeu fundumentul es trutur u los blts ms u lu derechu de un numero entero como representunte de
unu fruccln. Por e|emplo, se puede deslgnur u ms de 14 blts de un entero flrmudo de 32 blts como blts
de lus frucclones, de muneru que un numero x representu el numero reul x / (2 ** 14), donde representu
** exponenclucln. Esto se llumu un 17,14 fl|u lu representucln numero de punto, porque huy 17 blts
untes de lu comu declmul, despus de 14 blts y un blt de slgno. (7) Un numero en 17,14 formuto
representu, como mxlmo, un vulor de (2 ** 31 - 1) / (2 ** 14) = uprox. 131,071.999.
Supongumos que estumos utlllzundo un pq formuto de punto fl|o, y seu f = 2 ** q. Por lu deflnlcln
unterlor, podemos convertlr un numero entero o numero reul en formuto pq multlpllcundo con F. Por
e|emplo, en 17,14 el formuto 59/60 fruccln que se utlllzu en el clculo de louduvg, urrlbu, es 59/60 * (2
** 14) = 16.111 (redondeudo ul ms prxlmo). Puru convertlr un vulor de punto fl|o de nuevo u un
numero entero, se dlvlde por F. (Lu normul, operudor en lus rondus de C u cero, es declr, lus rondus por
los numeros posltlvos y negutlvos numeros de urrlbu. Puru redondeur ul ms cercuno, udd f / 2 u un
numero posltlvo, o restur desde un numero negutlvo, untes de dlvldlrse.)
Muchus operuclones sobre numeros de punto fl|o son clurus. Seu x y y ser numeros de punto fl|o, y
seu n un entero. Entonces, lu sumu de x y y es x + y y su dlferenclu es x - y Lu sumu de x y n es x + n *
f dlferenclu, x - n * f el producto x * n coclente, x / n
Lu multlpllcucln de dos vulores de punto fl|o tlene dos compllcuclones. En prlmer lugur, el punto
declmul del resultudo es blts q demusludo u lu lzqulerdu. Tengu en cuentu que (59/60) * (59/60) debe ser
llgerumente menor que 1, pero 16.111 * 16.111 = 259.564.321 es mucho muyor que 2 ** 14 =
16.384. Cumblo de blts q derecho, tenemos 259.564.321 / (2 ** 14) = 15.842, o ulrededor de 0,97, lu
respuestu correctu. En segundo lugur, lu multlpllcucln puede desbordurse u pesur de que lu respuestu
es representuble. Por e|emplo, 64 en 17,14 formuto es de 64 * (2 ** 14) = 1.048.576 y de su pluzu 64 **
2 = 4,096 est dentro del rungo de 17,14, pero 1.048.576 ** 2 = 2 ** 40, muyor que lu mxlmu reglstrudu
32-blt de vulor entero 2 ** 31 - 1. Unu solucln fcll es hucer lu multlpllcucln como unu operucln de
64 blts. El producto de x y y es entonces ((lnt64t) x) * y / f
Dlvlsln de dos vulores de punto fl|o frente u los problemus tlene. El punto declmul ser demusludo le|os
u lu derechu, que fl|umos ul cumblur el dlvldendo q blts u lu lzqulerdu untes de lu dlvlsln. El
despluzumlento u lu lzqulerdu desechu lu purte superlor q blts del dlvldendo, que de nuevo puede
urreglur huclendo lu dlvlsln en 64 blts. Asi, el coclente cuundo x se dlvlde yes ((lnt64t) x) * f / y
En estu seccln se hu utlllzudo constuntemente multlpllcucln o dlvlsln de f, en lugur de q en turnos de
poco, por dos ruzones.En prlmer lugur, lu multlpllcucln y lu dlvlsln no tlenen lu prlorldud de los
operudores sorprendente de los operudores de despluzumlento C. En segundo lugur, lu multlpllcucln y
lu dlvlsln estn blen deflnldos en los operundos negutlvos, pero los operudores del turno C no lo
son. Tengu culdudo con estus cuestlones en su upllcucln.
Lu slgulente tublu resume cmo fl|u lus operuclones de urltmtlcu de punto puede ser lmplementudu en
C. En lu tublu, x e y son numeros de punto fl|o, n es un entero, numeros de punto fl|o en formuto flrmudo
pq donde p + q = 31, y f es 1 << q
Convertlr n u punto fl|o: n * f
Convertlr x u un entero (redondeundo huclu el cero): x / f
Convertlr x u un entero (redondeo ul ms cercuno):
(x + f / 2) / f sl x >= 0
(x - f / 2) / f sl x <= 0
Anudlr x e y x + y
Restur y de x x - y
Anudlr x y n x + n * f
Restur n de x x - n * f
Multlpllcu x por y ((lnt64t) x) * y / f
Multlpllcu x por n x * n
Dlvlde x por y ((lnt64t) x) * f / y
Dlvlde x por n x / n
C. Estndures de codlflcucln
Todos ustedes deberiun huber tomudo unu cluse de como CS 107, por lo que esperumos que usted est
fumlllurlzudo con ulgun con|unto de normus de codlflcucln como CS 107 Estndures de
Codlflcucln. Incluso sl usted hu tomudo 107, le recomendumos que revlse el documento. Esperumos
que el cdlgo en lu "revlsln de pures de culldud" nlvel descrlto ulli.
Nuestros estndures de codlflcucln son ms lmportuntes puru lu cluslflcucln. Oueremos destucur que,
upurte del hecho de que estumos busundo explicltumente purte de su cullflcucln en estus cosus, buenus
prctlcus de codlflcucln puru me|orur lu culldud de su cdlgo. Esto huce que seu ms fcll puru sus
soclos de lnteructuur con l, y en ultlmu lnstunclu, me|orur sus probubllldudes de tener un progrumu
que funclone blen. Oue dl|o unu vez, el resto de este documento slo se ubordun lus formus en que
nuestros estndures de codlflcucln que ufectun u nuestru cluslflcucln.
Estllo C.1
Estllo, u los efectos de nuestru cluslflcucln, se reflere u lu leglbllldud de cdlgo. Como minlmo, esto
slgnlflcu que su cdlgo est blen formuteudo, su nombre de lus vurlubles son descrlptlvos y sus
funclones se descomponen y blen comentudo. Otros fuctores que hucen que seu dlficll (o fcll) puru que
podumos leer o usur el cdlgo se ver refle|udo en su estllo de grudo.
El cdlgo Plntos exlstente est escrltu en el estllo de GNU y slgue en grun medldu el Estndur de
Codlflcucln GNU. Le unlmumos u que slgu lus purtes pertlnentes de ellos tumbln, especlulmente el
cupitulo 5, "Hucer el me|or uso de C." Utlllzundo un estllo dlferente, no cuusur problemus reules, pero
es feo ver lus dlferenclus en el estllo grutultu de unu funcln u otru. Sl el cdlgo es muy feo, que le
costur puntos.
Por fuvor, llmlte lineus del urchlvo de fuente de C u un mxlmo de 79 curucteres de lurgo.
Comenturlos Plntos u veces se refleren u lus normus externus o especlflcuclones por escrlto un nombre
entre corchetes, como esto: [IA32-v3u] Estos nombres se refleren u los nombres de referenclu utlllzudo
en estu documentucln (vuse lu secclnBlbllogrufiu).
Sl ellmlnu el cdlgo Plntos exlstente, por fuvor borre de su urchlvo de cdlgo fuente completo. No slo
huy que poner en un comenturlo o unu dlrectlvu de compllucln condlclonul, porque eso huce que el
cdlgo que resultu dlficll de leer.
Slo vumos u hucer unu compllucln en el dlrectorlo puru el proyecto que est presentundo. No es
necesurlo puru usegururse de que los proyectos unterlores tumbln compllur.
Cdlgo del proyecto deben reducturse de muneru que todos los subproblemus puru lu funcln del
proyecto en con|unto, es declr, sln lu necesldud de reconstrulr con dlferentes mucros deflnldos, etc Sl
trubu|us crdlto udlclonul de que los cumblos de comportumlento Plntos normul con el fln de lnterferlr
con lu cluslflcucln, u contlnuucln, debe lmplementur de formu que slo uctuu de esu formu cuundo se
les du unu orden especlul opcln de lineu de lu formu - nombre, donde nombre es un nombre de su
eleccln. Usted puede ugregur esu opcln medlunte lu modlflcucln de purseoptlons() en hllos / lnlt.c.
Lu lntroduccln descrlbe los requlsltos udlclonules de estllo de codlflcucln (vuse lu seccln 1.2.2 de
Dlseno).
C.2 C99
El cdlgo fuente Plntos utlllzu ulgunus curucteristlcus de lu "C99" de lu blbllotecu estndur que no
estubun en lu normu orlglnul de 1989 puru los progrumudores de C. Muchos no son consclentes de estus
curucteristlcus, por lo que se descrlben. Lus nuevus curucteristlcus utlllzudus en Plntos son en su
muyoriu en lus cubecerus de nuevo:
<stdbool.h>
Deflne bool mucros, un tlpo de 1-blt que tomu slo los vulores 0 y 1, true que se expunde u 1,
y fulse que se expunde u 0.
<stdlnt.h>
En los slstemus que los upoyun, este encubezudo deflne los tlpos lnt n t y ulnt n t otros
vulores puru n = 8, 16, 32, 64, y poslblemente. Estos son complemento u 2 flrmudo y los tlpos
sln slgno, respectlvumente, con el numero determlnudo de blts.
En los slstemus donde es poslble, este encubezudo tumbln deflne los tlpos
de lntptrt y ulntptrt que son tlpos enteros suflclentemente grunde puru contener un puntero.
En todos los slstemus, estu encubezudo deflne los tlpos de lntmuxt y ulntmuxt que son el
slstemu de flrmu y los tlpos enteros sln slgno con lus ms umpllus gumus.
Puru cudu tlpo flrmudo type t entero se deflne uqui, usi como puru ptrdlfft deflnldo
en <stddef.h>, este encubezudo tumbln deflne lus mucros TYPE MAX y TYPE MIN que dun
el tlpo de lu gumu. Del mlsmo modo, puru cudu tlpo de slgno type t entero type t se deflne
uqui, usi como puru slzet se deflne en <stddef.h>, estu cubeceru se deflne unu
mucro TYPE MAX dur su vulor mxlmo.
<lnttypes.h>
<stdlnt.h> no proporclonu nlngunu muneru senclllu puru dur formuto u los tlpos que deflne
con prlntf() y funclones reluclonudus. Este encubezudo proporclonu mucros puru uyudur con
eso. Por cudu lnt n t deflnldu por <stdlnt.h>,proporclonu PRId n mucros y PRIl n puru dur
formuto u los vulores de ese tlpo con "%d" y "%l" Del mlsmo modo, puru
cudu ulnt n t proporclonu PRIo n PRIu n PRIu x y PRIu X
Puede utlllzur estos ulgo como esto, uprovechundo el hecho de que el complludor de C
concutenu cudenus llterules udyucentes:

# lnclude <lnttypes.h>
...
vulor lnt32t = ...;
prlntf ( "vulue =% 08" PRId32 "\ n", vulor);
El% no es sumlnlstrudu por el mucros PRI Como se lndlcu unterlormente, lu ofertu usted mlsmo
y slgu por cuulquler bunderus, uncho de cumpo, etc
<stdlo.h>
El prlntf() funcln tlene ulgunos modlflcudores nuevo tlpo puru lu lmpresln de los tlpos
estndur:
|
Puru lntmuxt (por e|emplo, JD%) o ulntmuxt (|u% por e|emplo).
z
Puru slzet (zu% por e|emplo).
t
Puru ptrdlfft (% por e|emplo, TD).
prlntf() Plntos prlntf() tumbln lmplementu unu bunderu no estndur "que los grupos grundes
numeros con comus puru que seun ms fclles de leer.
C.3 lnsegurus Funclones de cudenu
Algunus de lus funclones de cudenu declurudo en lu normu <strlng.h> y <stdlo.h> cubecerus son
notorlumente pellgrosus. Los peores dellncuentes son lntenclonulmente no lncluldos en lu blbllotecu C
de Plntos:
strcpy
Cuundo se utlllzu estu funcln con desculdo puede desbordur el bufer reservudo puru su cudenu
de sulldu. strlcpy() usostrlcpy() en su lugur. Consulte u los comenturlos en su cdlgo fuente en
/ llb/strlng.c puru lu documentucln.
strncpy
Estu funcln se puede sullr de su bufer de destlno sln un termlnudor de cudenu nulu. Tumbln
tlene problemus de rendlmlento. Unu vez ms, strlcpy() uso strlcpy()
strcut
Mlsmo usunto que strcpy() strlcut() uso strlcut() en su lugur. Unu vez ms, se refleren u los
comenturlos en su cdlgo fuente en / llb/strlng.c puru lu documentucln.
strncut
El slgnlflcudo de su urgumento el tumuno del buffer es de extrunur. Unu vez
ms, strlcut() uso strlcut()
strtok
Utlllzucln de los dutos globules, por lo que no es seguro en los progrumus de roscu, como
grunos. strtokr() usostrtokr() en su lugur, y ver su cdlgo fuente en / llb/strlng.c de
documentucln y un e|emplo.
sprlntf
Mlsmo usunto que strcpy() snprlntf() uso snprlntf() en su lugur. Consulte u los comenturlos en
/ llb/stdlo.h puru lu documentucln.
vsprlntf
Mlsmo usunto que strcpy() vsnprlntf() uso vsnprlntf() en su lugur.
Sl lntentu utlllzur cuulquleru de estus funclones, el mensu|e de error le dur unu plstu ul referlrse u un
ldentlflcudor, comodontusesprlntfusesnprlntf
D. Proyecto de Documentucln de
Este cupitulo presentu unu uslgnucln de lu muestru y un documento cumpllmentudo en el dlseno puru
unu poslble upllcucln. Su propslto es dur unu ldeu de lo que esperumos ver en los documentos de
dlseno proplo.
D.1 Muestru de mlslones
Apllcur threud|oln()
Funcln: threud|oln vold (tldt TID)
Oue bloqueu el subproceso uctuul hustu que sule tres veces ul hllo. Sl A es el hllo y B es el
urgumento, entonces se dlce que "se une u unu B".
Por clerto, el urgumento es un ldentlflcudor de hllo, en lugur de un puntero de hllo, debldo u un
puntero de hllo no es unlco en el tlempo. Es declr, cuundo un hllo se muere, su memorlu puede
ser, yu seu lnmedlutumente o mucho ms turde, volver u utlllzurse puru otro hllo. Sl un tlempo
hllo sobre teniu dos hl|os B y C que fueron ulmucenudos en lu mlsmu dlreccln, u
contlnuucln, threud|oln( B ) y threud|oln( C ) seriu umblguo.
Un hllo slo puede unlrse u sus hl|os de lnmedluto. Llumudus threud|oln() en un hllo que no es
el hl|o de lu personu que llumu debe hucer que lu personu que llumu u volver de lnmedluto. Los
nlnos no son "heredudos", es declr, sl un nlno tlene B y B tlene hl|os C, A slempre devuelve
lnmedlutumente en cuso de que lntentu unlrse u C, B, lncluso sl est muerto.
Un hllo no debe nuncu ser unldos. Su solucln deberiu llberur upropludumente todos los
recursos de un hllo, lncluyendo su struct threud sl es que ulgunu vez hu entrudo o no, e
lndependlentemente de sl el nlno sule untes o despus de su pudre. Es declr, un hllo debe ser
llberudo unu solu vez en todos los cusos.
Unlrse u un temu determlnudo es ldempotente. Es declr, unlrse u un hllo vurlus veces es
equlvulente u unlrse u l unu vez, porque yu hu sulldo u lu horu de lu turde se une. Asi, se une
en un subproceso determlnudo despus de lu prlmeru debe volver de lnmedluto.
Usted debe mune|ur todus lus formus de unu comblnucln pueden ocurrlr: unlones
unldudus (A se une u B, entonces B se une u C), vurlus comblnuclones (A se une
u B, entonces A se une u C), y usi suceslvumente.
D.2 E|emplo de Documento de Dlseno

+-----------------+
| CS 140 |
| Muestru de proyectos |
| DOCUMENTO DE DISEO |
+-----------------+

GRUPO ---- ----

Ben Pfuff <blp@stunford.edu>

---- ---- PRELIMINARES

>> Sl usted tlene ulgun comenturlo prellmlnur en su presentucln, notus puru
>> Lu TAS, o crdlto udlclonul, por fuvor dur uqui.

(Este es un documento de dlseno de lu muestru.)

>> Fuvor de cltur cuulquler conexln o fuentes consultudus, mlentrus que en lineu que
>> Lu prepurucln de su presentucln, excepto lu documentucln Plntos,
>> Texto del curso, y lus notus de cluse.

Nlnguno.

UNETE
====

Estructurus de Dutos ---- ----

>> Coplu uqui lu declurucln de cudu nuevo o `struct 'o` struct'
>> Mlembros, vurluble globul o esttlcu, `typedef ', o lu enumerucln.
>> Identlflcur el propslto de cudu uno en 25 pulubrus o menos.

A "clerre" es unu nuevu slncronlzucln prlmltlvos. Bloque udqulere
hustu que lu prlmeru versln. Despus, todos los uctuules y futuros
udqulere pusur de lnmedluto.

/ * Clerre. * /
struct clerre
(
bool en llbertud; / * Fechu de lunzumlento toduviu? * /
struct monltorlock bloqueo; / * bloqueo de Monltor. * /
struct condlcln relcond / * senul cuundo se sueltu. * /
);

Anudldo u struct hllo:

Mlembros * / puru lu upllcucln de threud|oln (). * /
struct clerre reudytodle / * Llberur ul hllo u punto de morlr. * /
struct cundle semforo; / * Hustu cuundo hllo derecho u morlr. * /
struct llstu de los nlnos; / * Llstu de temus de nlnos. * /
chlldrenelem llstelem; / * Elemento de llstu de los nlnos. * /

ALGORITMOS ---- ----

>> Descrlbu brevemente su upllcucln de threud|oln () y cmo se
>> Inteructuu con lu termlnucln de subprocesos.

threud|oln () encuentru que el nlno se unl en lu llstu del hllo de lu
los nlnos y esperu u que el nlno sulgu con lu udqulslcln del nlno
reudytodle pestlllo. Cuundo threudexlt () es llumudo, el hllo
llberu su reudytodle pestlllo, lo que permlte u los pudres u contlnuur.

SINCRONIZACIN ---- ----

>> Consldere lu poslbllldud de P hllo pudre con hllo hl|o C. Cmo se useguru
>> Slncronlzucln udecuudu y evltur condlclones de curreru cuundo P u wult (C)
>> Antes de lus sulldus de C? Despus de lus sulldus de C? Cmo guruntlzur que todos los recursos
>> Son llberudos en cudu cuso? P Y cuundo termlnu, sln esperur,
>> Antes de lus sulldus de C? Despus de lus sulldus de C? Huy ulgunos cusos de especlul?

C esperu en threudexlt () puru P u morlr untes de que flnullce su proplo
de sulldu, con el semforo cundle "ubu|o" y lu edlcln de C "hustu" ed de P como
que sule. Independlentemente de que sl C hu termlnudo, huy
huy curreru en esperu (C), debldo u que C esperu de permlso untes de P
se llberu.

Independlentemente de sl esperu u que P C, P, toduviu "hustu" s cundle C
P semforo, cuundo muere, por lo que C slempre ser llberudo. (Sln emburgo,
lu llberucln de recursos de C se retrusu hustu que lu muerte de P).

El hllo lnlclul es un cuso especlul porque no tlene pudre
esperur u que o "urrlbu" de su semforo cundle. Por lo tunto, su
cundle semforo se lnlclullzu u 1.

JUSTIFICACIN ---- ----

>> Critlcu de su dlseno, senulundo lus ventu|us y desventu|us en
>> Lus opclones de dlseno.

Este dlseno tlene lu ventu|u de lu slmpllcldud. Encupsulundo lu muyoriu de los
de lu lglcu de slncronlzucln en un nuevo "clerre" lu estructuru de
resumenes de lu comple|ldud de lo poco que huy en unu cupu sepurudu,
permlte que el dlseno ms fcll de ruzonur sobre. Adems, todos los nuevos dutos
mlembros estn en `struct hllo ', sln necesldud de nlngun extru dlnmlcu
uslgnucln, etc, que requleren el cdlgo de gestln udlclonul.

Por otru purte, este dlseno es un despllfurro, yu que un hllo hl|o
no puede llberurse untes de que su pudre hu termlnudo. Un pudre de fumlllu
hllo que creu un grun numero de cortu durucln hllos nlno
lnnecesurlumente podriu ugotur lu memorlu del kernel. Este es probublemente
uceptuble puru lu upllcucln de hllos del nucleo, pero puede ser un mul
ldeu puru el uso con procesos de usuurlo, debldo ul muyor numero de
de los recursos que los procesos de usuurlo tlenden u poseer.
E. Herrumlentus de depurucln
Muchus herrumlentus estn u su dlsposlcln puru lu depurucln de Plntos. En este upndlce se presentu
u ulgunos de ellos.
prlntf() E.1 prlntf()
No subestlme el vulor de prlntf() El prlntf() modo prlntf() se lmplementu en Plntos, se puede llumur
desde prctlcumente cuulquler lugur en el nucleo, yu seu en un hllo del kernel o un controludor de
lnterrupclones, cusl lndependlentemente de lo que se llevun u cubo los bloqueos.
prlntf() es utll puru ulgo ms que exumlnur los dutos. Tumbln puede uyudur u uverlguur donde y cuundo
ulgo vu mul, lncluso cuundo se bloqueu el pnlco del kernel o sln un mensu|e de error utll. Lu estruteglu
conslste en roclur lus llumudus u prlntf() con cudenus dlferentes (por e|emplo, "<1>" "<2>" ...) u truvs
de lus plezus de cdlgo que se sospeche que estn fullundo. Sl nl slquleru ven <1> lmpresos, ulgo mulo
sucedl untes de ese momento, sl ves <1> pero no <2> entonces ulgo terrlble le hu sucedldo entre estos
dos puntos, y usi suceslvumente. Con buse en lo que se uprende, puede lnsertur ms prlntf() lus
llumudus en lu nuevu regln ms pequenu, de cdlgo que sospechoso. Eventuulmente, usted puede
reduclr el problemu u unu solu lnstruccln. Veu lu seccln E.6 Trlple errores, por unu tcnlcu reluclonudu
.
E.2 ASSERT
Aflrmuclones son utlles porque pueden detectur los problemus tempruno, untes que de otro modo seriu
notudo. Ideulmente, cudu funcln debe comenzur con unu serle de uflrmuclones de que los urgumentos
puru comprobur su vulldez. (Inlclullzudores funclones puru lus vurlubles locules son evuluudos untes de
lus uflrmuclones se compruebun, por lo que tener culdudo de no suponer que un urgumento es vlldo en
un lnlclullzudor.) Tumbln puede espolvoreur lus uflrmuclones de todo el cuerpo de funclones en los
lugures donde sospechu que lus cosus puedun lr mul. Son especlulmente utlles puru el control de los
lnvurluntes de bucle.
Plntos proporclonu lu mucro ASSERT deflnldo en <debug.h>, puru comprobur lus uflrmuclones.
Mucro: ASSERT (expresln)
Pruebu el vulor de lu expresln. Sl se evuluu u cero (fulso), el pnlco del kernel. El mensu|e
lncluye lu expresln de pnlco que hu fulludo, su urchlvo y el numero de lineu, y un bucktruce,
que le uyudur u encontrur el problemu. Verbucktruces E.4 seccln, puru ms lnformucln.
E.3 funclones y purmetros de utrlbutos
Estus mucros se deflnen en <debug.h> lndlcur ul complludor utrlbutos especlules de unu funcln o
purmetro de lu funcln.Sus expunslones son GCC-especiflcus.
Mucro: NO UTILIZADO
En un unexo u un purmetro de funcln puru lndlcur ul complludor que el purmetro no puede
ser utlllzudo dentro de lu funcln. Se suprlme lu udvertenclu de que de otru muneru pureceriu.
Mucro: NORETURN
En un unexo u un prototlpo de funcln puru lndlcur ul complludor que lu funcln no vuelve
nuncu. Permlte que el complludor puru uflnur sus udvertenclus y su generucln de cdlgo.
Mucro: NOINLINE
En un unexo u un prototlpo de funcln puru lndlcur ul complludor que no emlten lu funcln en
lineu. Ocuslonulmente es de utllldud puru me|orur lu culldud de bucktruces (vuse ms ubu|o).
Mucro: PRINTFFORMAT (formuto, en prlmer lugur)
En un unexo u un prototlpo de funcln puru lndlcur ul complludor que lu funcln tomu
un prlntf() como formuto de cudenu como el urgumento de formuto de numero (comenzundo en
1) y que los urgumentos vulor correspondlente comenzur en lu prlmeru ulegucln
numerudus. Esto permlte que el complludor dlr sl pusu los tlpos de urgumentos equlvocudos.
Bucktruces E.4
Cuundo el kernel punlc, lmprlme un "bucktruce", es declr, un resumen de cmo el progrumu se donde
est, como unu llstu de dlrecclones dentro de lus funclones que se estubun e|ecutundo en el momento
del pnlco. Tumbln puede lnsertur unu llumudu udebugbucktruce() como prototlpo en <debug.h>, puru
lmprlmlr un bucktruce en cuulquler punto en el cdlgo.
Lus dlrecclones en un bucktruce se muestrun como numeros hexudeclmules en bruto, que son dlficlles
de lnterpretur.Ofrecemos unu herrumlentu llumudu bucktruce de truduclrlos en los nombres de funclones
y numeros de urchlvo fuente de lineu. Durle el nombre de su kernel.o como prlmer urgumento y los
numeros hexudeclmules que componen el truzudo (lncluyendo el prefl|o 0x) como el resto de
urgumentos. Se enviu el nombre de lu funcln y el urchlvo de numeros de orlgen de lineu que
corresponden u cudu dlreccln.
Sl es confusu lu formu de truduclr un bucktruce, o no tlene sentldo (por e|emplo, unu funcln est en lu
llstu por enclmu de lu funcln B, pero B no requlere A), entonces es unu buenu senul de que est
corromplendo u un hllo del kernel de pllu, porque el truzudo se extrue de lu pllu. Alternutlvumente,
podriu ser que el kernel.o lu que hu pusudo u bucktruce no es el mlsmo nucleo que produ|o el truzudo.
Bucktruces A veces puede ser confuso, sln corrupcln. Optlmlzuclones del complludor pueden provocur
un comportumlento sorprendente. Cuundo unu funcln se llumu u otru funcln como lu uccln flnul
(unu llumudu de lu colu), lu funcln de llumudu no puede upurecer en un bucktruce en ubsoluto. Del
mlsmo modo, cuundo lu funcln A llumu u otro B, funcln que nuncu regresu, el complludor puede
optlmlzur de tul muneru que unu funcln no vlnculudos C upurece en el truzudo en lugur de A. funcln C
es slmplemente lu funcln que le pusu u estur en lu memorlu lnmedlutumente despus de A. En los hllos
proyecto, esto se ve comunmente en bucktruces de pruebus fullldus, ver puss() fullu, puru ms
lnformucln.
E|emplo E.4.1
He uqui un e|emplo. Supongumos que Plntos lmprlme estu slgulente pllu de llumudus, que es tomudo de
unu presentucln Plntos reul puru el proyecto de slstemu de urchlvos:

Pllu de llumudus: 0xc01102fb 0xc0106eff 0xc010dc22 0xc010cf67 0xc0102319
0xc010325u 0x804812c 0x8048u96 0x8048uc8.
A contlnuucln, se lnvocu lu utllldud bucktruce como se muestru u contlnuucln, cortur y pegur lu
lnformucln bucktruce en lu lineu de comundos. Kernel.o Esto supone que se encuentru en el dlrectorlo
uctuul. Usted, por supuesto, entrur en todos de los slgulentes en unu solu lineu de shell de comundos, u
pesur de que nuestros mrgenes de desbordumlento de uqui:

bucktruce 0xc01102fb 0xc0106eff kernel.o 0xc010dc22 0xc010cf67
0xc0102319 0xc010325u 0x804812c 0x8048u96 0x8048uc8
Lu sulldu bucktruce entonces seriu ulgo como esto:

0xc0106eff: debugpunlc (llb / debug.c: 86)
0xc01102fb: flleseek (slstemu de flcheros / flle.c: 405)
0xc010dc22: buscur (userprog / syscull.c: 744)
0xc010cf67: syscullhundler (userprog / syscull.c: 444)
0xc0102319: lntrhundler (hllos / lnterrupt.c: 334)
0xc010325u: lntrentry (hllos / lntr-stubs.S: 38)
0x0804812c: (desconocldo)
0x08048u96: (desconocldo)
0x08048uc8: (desconocldo)
(Probublemente no ver exuctumente lu mlsmu dlreccln sl se e|ecutu el comundo unterlor en el blnurlo
del nucleo proplo, porque el cdlgo fuente se hu complludo y el complludor que utlllz son
probublemente dlstlntus.)
Lu prlmeru lineu en el truzudo se reflere u debugpunlc() lu funcln que lmplementu un kernel
punlc. Debldo u bucktruces comunmente el resultudo de un kernel punlc, debugpunlc() suele ser lu
prlmeru funcln se muestru en un bucktruce.
Lu segundu lineu muestru flleseek() como lu funcln de pnlco que, en este cuso como el resultudo de
un error de usercln.En el rbol de cdlgo fuente utlllzudo puru este e|emplo, lu lineu 405 de slstemu de
flcheros / flle.c es lu uflrmucln de

ASSERT (flleofs> = 0);
(Estu lineu tumbln fue cltudu en el mensu|e de error de usercln.) Asi, flleseek() entruron en pnlco
porque pus un negutlvo urgumento flchero offset.
Lu terceru lineu lndlcu que seek() llumu flleseek() probublemente sln vulldur el urgumento de
compensucln. En estu presentucln, seek() lmplementu el seek lu llumudu ul slstemu.
Lu cuurtu lineu muestru que syscullhundler() el controludor de llumudu ul slstemu, lnvocudo seek()
Lus lineus qulntu y sextu son lu lnterrupcln viu de entrudu de controludor.
Lus lineus restuntes son puru lus dlrecclones ubu|o PHYSBASE Esto slgnlflcu que se refleren u lus
dlrecclones en el progrumu de usuurlo, no en el nucleo. Sl usted sube qu progrumu de usuurlo se
estubu e|ecutundo cuundo el nucleo de pnlco, usted puede volver u e|ecutur bucktruce en el progrumu
de usuurlo, usi: (escrlblendo el comundo en unu solu lineu, por supuesto):

pruebus de bucktruce / slstemu de flcheros / extendldo / crecen demusludo grunde 0xc01102fb
0xc0106eff
0xc010dc22 0xc010cf67 0xc0102319 0xc010325u 0x804812c 0x8048u96
0x8048uc8
Los resultudos de este uspecto:

0xc0106eff: (desconocldo)
0xc01102fb: (desconocldo)
0xc010dc22: (desconocldo)
0xc010cf67: (desconocldo)
0xc0102319: (desconocldo)
0xc010325u: (desconocldo)
0x0804812c: testmuln (...xtended / crecer demusludo blg.c: 20)
0x08048u96: muln (pruebus / muln.c: 10)
0x08048uc8: sturt (llb / user / entry.c: 9)
Usted puede lncluso especlflcur tunto el nucleo y los nombres de usuurlo de progrumu en lu lineu de
comundos, usi:

pruebus de kernel.o bucktruce / slstemu de flcheros / extendldo / crecen demusludo grunde 0xc0106eff
0xc010dc22 0xc010cf67 0xc0102319 0xc010325u 0xc01102fb 0x804812c
0x8048u96 0x8048uc8
El resultudo es un bucktruce comblnudo:

En kernel.o:
0xc0106eff: debugpunlc (llb / debug.c: 86)
0xc01102fb: flleseek (slstemu de flcheros / flle.c: 405)
0xc010dc22: buscur (userprog / syscull.c: 744)
0xc010cf67: syscullhundler (userprog / syscull.c: 444)
0xc0102319: lntrhundler (hllos / lnterrupt.c: 334)
0xc010325u: lntrentry (hllos / lntr-stubs.S: 38)
En lus pruebus / slstemu de flcheros / extendldo / crecen demusludo grunde:
0x0804812c: testmuln (...xtended / crecer demusludo blg.c: 20)
0x08048u96: muln (pruebus / muln.c: 10)
0x08048uc8: sturt (llb / user / entry.c: 9)
He uqui un conse|o extru puru cuulquler personu que leu este momento: bucktruce es lo suflclentemente
lntellgente como puru despo|ur u lu Cull stuck: encubezudo y. Remolque de lu lineu de comundos, sl los
lncluye. Esto le puede uhorrur un poco de problemus en cortur y pegur. Asi pues, el slgulente comundo
lmprlme el mlsmo resultudo que el prlmero que utlllzu:

Llume kernel.o bucktruce pllu: 0xc01102fb 0xc0106eff 0xc010dc22
0xc010cf67 0xc0102319 0xc010325u 0x804812c 0x8048u96 0x8048uc8.
E.5 GDB
Puede e|ecutur Plntos, bu|o lu supervlsln del depurudor GDB. En prlmer lugur, Plntos empezur con lu
opcln - gdb, por e|emplo, plntos --gdb -- run mytest En segundo lugur, ubrlr unu segundu termlnul en el
mlsmo equlpo y el uso plntos-gdbpuru lnvocur GDB en kernel.o: (8)

Plntos-kernel.o gdb
y el comundo GDB slgulentes:

destlno remoto loculhost: 1234
Ahoru GDB est conectudo ul slmuludor de unu conexln de red locul. Ahoru puede emltlr comundos
GDB normul. Sl el comundo C, el BIOS slmuludu tomur el control, Plntos de curgu, y, u contlnuucln
Plntos se e|ecutur en lu formu hubltuul.Puede poner en puusu el proceso en cuulquler momento
con Ctrl + C.
Gdb usundo E.5.1
Usted puede leer el munuul de GDB escrlblendo lnfo gdb en un simbolo termlnul. He uqui unos pocos
comundos GDB comunmente utlles:
GDB comundo: C
Contlnuucln de lu e|ecucln hustu que Ctrl + C o el slgulente punto de lnterrupcln.
GDB Comundo: Lu funcln de puusu
GDB de comundos: Archlvo descunso: lineu de
GDB de comundos: * Dlreccln de descunso
Estublece un punto de rupturu en lu funcln, en lu lineu dentro del urchlvo, o lu dlreccln. (Use
un prefl|o 0x puru especlflcur unu dlreccln en hexudeclmul.)
Utlllce breuk muln que gdb Plntos purur cuundo emplezu u funclonur.
GDB Comundo: expresln p
Evuluu lu expresln dudu e lmprlme su vulor. Sl lu expresln contlene unu llumudu u lu funcln,
lu funcln que reulmente ser e|ecutudo.
GDB Comundo: l * Dlreccln
Llstus de unus pocus lineus de cdlgo en torno u lu dlreccln. (Use un prefl|o 0x puru
especlflcur unu dlreccln en hexudeclmul.)
GDB comundo: bt
Imprlme truzudo de lu pllu slmllur u lu sulldu por el progrumu de bucktruce descrlto
unterlormente.
GDB de comundos: p / u Dlreccln
Imprlme el nombre de lu funcln o vurluble que ocupu lu dlreccln. (Use un prefl|o 0x puru
especlflcur unu dlreccln en hexudeclmul.)
GDB de comundos: dlussemble funcln
Funcln Desensumblu.
Tumbln ofrecemos un con|unto de mucros especlullzudos puru lu depurucln de Plntos, escrltu por
Godmur Volvergbuck@cs.vt.edu. Puede escrlblr help user-deflned en buscu de uyudu bslcu con lus
mucros. Aqui est unu descrlpcln de su funclonulldud, busudu en lu documentucln de Godmur:
GDB Mucro: debugplntos
Ad|untur depurudor u un proceso de esperu Plntos en lu mlsmu mqulnu. Abrevluturu de turget
remote loculhost:1234
GDB Mucro: dumpllst elemento de tlpo llstu de
Imprlme los elementos de lu llstu, que debe ser unu struct de llstu que contlene los elementos
del mlsmo tlpo (sln lu pulubru struct en lu que el elemento es lu struct llstelem mlembro struct
llstelem que une los elementos.
E|emplo: dumpllst ullllst threud ullelem lmprlme todos los elementos de lu struct threud que
estn vlnculudos enstruct llst ullllst utlllzundo lu struct llstelem ullelem que formu purte de
lu struct threud (Esto supone que hu unudldo ullllst y ullelem usted mlsmo).
GDB Mucro: hllo btthreud
Muestru el truzudo de hllo, que es un puntero u lu struct threud de lu roscu, cuyu bucktruce que
debe mostrur. Puru el flu|o uctuul, esto es ldntlcu u lu bt bucktruce () comundo. Tumbln
funclonu puru cuulquler hllo suspendldo enschedule() slempre sube cuundo su pllu del nucleo se
encuentru lu pglnu.
GDB Mucro: elemento de lu llstu btthreudllst
Muestru el bucktruces de todos los temus en lu llstu lu struct llst en lu que se muntlenen los
hllos. Especlflcur los elementos como lu struct llstelem de cumpo struct llstelem utlllzudos en
el lnterlor struct threud puru vlnculur los hllos.
E|emplo: btthreudllst ullllst ullelem muestru lu bucktruces de todos los temus que flgurun
en struct llst ullllstunldos por ullelem Este comundo es utll puru determlnur sl los hllos se
pegun cuundo se produce un lnterbloqueo. Por fuvor consulte el escenurlo de e|emplo u
contlnuucln. (Esto supone que hu unudldo ullllst y ullelem usted mlsmo.)
GDB Mucro: btpugefuult
Imprlmlr un segulmlento de todos los hllos uctuul despus de unu excepcln de fullo de pglnu.
Normulmente cuundo unu excepcln de error de pglnu no se produce GDB se detlene con un
mensu|e que podriu declr:

Progrumu de lu senul reclbldu 0 lu senul 0.
0xc0102320 en lntr0estub ()
En ese cuso el comundo de bt no podriu dur un bucktruce utll. btpugefuult Utlllce en su lugur.
Tumbln puede utlllzur btpugefuult de fullos de pglnu que se producen en un proceso de
usuurlo. En este cuso tumbln podriu curgur lu tublu de simbolos del progrumu de usuurlo (ver
seccln E.5.3 depurucln de progrumus de usuurlo).
GDB Mucro: guncho-stop
GDB lnvocu estu mucro cudu vez que se detlene lu slmulucln que Bochs hur puru cudu
excepcln del procesudor entre otrus ruzones. Sl lu slmulucln se detlene debldo u un fullo de
pglnu hook-stop se lmprlmlr un mensu|e que dlce y expllcu udems sl el error de pglnu se
produ|o en el nucleo o en el cdlgo de usuurlo.
Sl se produ|o lu excepcln del cdlgo de usuurlo hook-stop dlr:

Plntos-debug: unu excepcln de error de pglnu no se produ|o en modo de usuurlo
Plntos-debug: c hlt '' puru contlnuur o 's' puru pusur u lntrhundler
En el Proyecto 2 un error de pglnu en un proceso de usuurlo llevu u lu termlnucln del
proceso. Usted debe esperur que los fullos de pglnu que se produzcu en lus pruebus de solldez
en lu que pruebu que su nucleo correctumente flnullzu los procesos que lntentun ucceder u
dlrecclones no vlldus. Puru depurur estos estublecer un punto de rupturu
enpugefuult() en exceptlon.c que tendr que modlflcur en consecuenclu.
En el Proyecto 3 un error de pglnu en un proceso de usuurlo yu no conduce uutomtlcumente
u lu termlnucln de un proceso. En su lugur podr exlglr lu lecturu de los dutos de lu pglnu el
proceso estubu lntentundo ucceder yu seu porque se lntercumblu o porque stu es lu prlmeru
vez que se uccede. En cuulquler cuso se llegu u pugefuult() y lu necesldud de udoptur lus
medldus upropludus ulli.
Sl el error de pglnu no se produ|o en modo de usuurlo reullzundo un proceso de usuurlo
entonces se le ocurrl en modo kernel mlentrus que lu e|ecucln de cdlgo del kernel. En este
cuso hook-stop se lmprlme este mensu|e:

Plntos-debug: un error de pglnu no se produ|o en modo kernel
seguldo de lu sulldu del comundo btpugefuult
Antes de Proyecto 3 unu excepcln de error de pglnu en el cdlgo del nucleo es slempre un
error en el nucleo yu que su nucleo no deberiu uccldente. A purtlr de Proyecto 3 lu sltuucln vu
u cumblur sl se utlllzu getuser() y putuser()puru verlflcur lu estruteglu de ucceso u lu memorlu
de usuurlo (vuse lu seccln 3.1.5 Acceso u lu memorlu del usuurlo).
Sl usted no qulere de|ur de GDB puru fullos de pglnu, u contlnuucln, e|ecute el
comundo hundle SIGSEGV nostopBGF uun se lmprlmlr un mensu|e puru cudu error de pglnu,
pero no volver u un simbolo del slstemu.
E.5.2 reunln GDB E|emplo
En estu seccln se nurru unu sesln de GDB muestru, proporclonudo por Godmur Atrs. Este e|emplo
llustru cmo se puede depurur unu solucln ul 1 del proyecto en el que de vez en cuundo un hllo que se
llumu tlmersleep() no se desplertu. Con este fullo, se utuscun lus pruebus como mlfqsloud1
Estu sesln fue cupturudo con unu versln un poco ms de Bochs y lus mucros GDB puru Plntos, por lo
que se ve un poco dlferente de lo que seriu uhoru. Sulldu del progrumu se muestru en tlpo normul, lu
entrudu del usuurlo en el tlpo fuerte.
En prlmer lugur, comlenzo u Plntos:

Plntos S-V - gdb --q-mlfqs e|ecutur mlfqs curgu-1 -
Escrlturu de lineu de comundos u / tmp/gDAlqTB5Uf.dsk ...
Bochs-O
================================================== ======================
2.2.5 emuludor Bochs x86
Construlr u purtlr de lnstuntneus de CVS en el 30 de dlclembre 2005
================================================== ======================
00000000000l [] conflgurucln de lu lecturu de bochsrc.txt
00000000000l [] gdbstub hubllltudo
00000000000l [] lu lnstulucln de mdulo de nogul como lu GUI de Bochs
00000000000l [] utlllzundo bochsout.txt urchlvo de reglstro
Esperundo conexln gdb en loculhost: 1234

Entonces, puedo ubrlr unu segundu ventunu en lu mlsmu mqulnu y de GDB de lnlclo:

S Plntos-kernel.o gdb
GNU gdb Red Hut Llnux (6.3.0.0-1.84rh)
Copyrlght 2004 Free Softwure Foundutlon, Inc.
GDB es softwure llbre, cublerto por lu Llcenclu Publlcu Generul GNU, y est
Blenvenldo u cumblur y / o dlstrlbulr coplus del mlsmo en determlnudus condlclones.
"Tlpo de mostrur lu coplu" puru ver lus condlclones.
No huy ubsolutumente nlngunu guruntiu puru GDB. "Tlpo de guruntiu show" puru ms detulles.
Estu GDB se hu conflgurudo como "l386-redhut-llnux-gnu" ...
Uso de lu coleccln de llbthreuddb de ucogldu "/ llb/llbthreuddb.so.1".

Entonces, le dlgo GDB puru lnserturse en el emuludor de Plntos de esperu:

(gdb) debugplntos
Lu depurucln remotu utlllzundo loculhost: 1234
0x0000fff0 en?? ()
Respuestu no vlldu contlene 78 digltos hexudeclmules

Ahoru le dlgo u Plntos u curgo de lu e|ecucln de c (corto puru contlnue dos veces:

(gdb) c
Contlnuur.
Respuestu no vlldu contlene 78 digltos hexudeclmules
(gdb) c
Contlnuur.

Ahoru Plntos contlnuur y sulldu:

Arrunque Plntos con 4.096 kB de RAM ...
Lineu de comundos del nucleo: mlfqs-q-mlfqs de e|ecucln de curgu-1
374 pglnus dlsponlbles en lu plsclnu del nucleo.
373 pglnus dlsponlble en el grupo de usuurlos.
Cullbrucln de temporlzudor ... 102.400 clclos / s.
Arrunque completo.
De e|ecucln mlfqs curgu-1 ':
(mlfqs curgu-1) comenzur
(mlfqs curgu-1) puru el hlludo hustu 45 segundos, por fuvor espere ...
(mlfqs curgu-1) promedlo de curgu uument u 0,5 despus de 42 segundos
(mlfqs curgu-1) puru dormlr por otros 10 segundos, por fuvor espere ...

... Hustu que se quedu utuscudo por el error que hubiu lntroducldo. Me preslonu Ctrl + C en lu ventunu
del depurudor:

Progrumu de lu senul reclbldu 0, lu senul 0.
.. 0xc010168c en nextthreudtorun () en / .. / temus / threud.c: 649
Mlentrus que 649 (l <= PRIMAX & & llstempty (& reudyllst [l]))
(gdb)

El hllo que se estubu e|ecutundo cuundo me lnterrumpl Plntos fue el hllo de lnuctlvldud. Sl me
quedo bucktruce se muestru estu bucktruce:

(gdb) bt
# 0 0xc010168c en nextthreudtorun () en .. / .. / temus / threud.c: 649
# 1 en horurlo de 0xc0101778 () en .. / .. / temus / threud.c: 714
# 2 0xc0100f8f en threudblock () en .. / .. / temus / threud.c: 324
# 3 0xc0101419 en ldle (uux = 0x0) en .. / .. / temus / threud.c: 551
# 4 0xc010145u en kernelthreud (funcln = 0xc01013ff, uux = 0x0)
en .. / .. / temus / threud.c: 575
# 5 0x00000000 ln?? ()

No muy utll. Lo que reulmente me gusturiu suber es qu pusu con el otro hllo (o hllos). Desde que
muntener todus lus dlscuslones en unu llstu enluzudu llumudu ullllst unldos por unu struct
llstelem mlembro struct llstelem nombre ullelempuedo utlllzur lu mucro btthreudllst de lu blbllotecu
de mucro que escrlbi. btthreudllst recorre lu llstu de temus e lmprlme el truzudo puru cudu hllo:

(gdb) ullelem ullllst btthreudllst
Plntos-debug: dumplng bucktruce de hllo 'prlnclpul' @ 0xc002f000
# 0 0xc0101820 en lu llstu () en .. / .. / temus / threud.c: 722
# 1 0xc0100f8f en threudblock () en .. / .. / temus / threud.c: 324
# 2 0xc0104755 en tlmersleep (tlcks = 1000) en .. / .. / devlces / tlmer.c: 141
# 3 0xc010bf7c en testmlfqsloud1 () en ../../tests/threuds/mlfqs-loud-1.c: 49
# 4 0xc010uubb en runtest nombre (= 0xc0007d8c "mlfqs curgu-1")
en .. / .. / tests / temus / tests.c: 50
# 5 0xc0100647 en runtusk (urgv = 0xc0110d28) en .. / .. / temus / lnlt.c: 281
# 6 0xc0100721 en runuctlons (urgv = 0xc0110d28) en .. / .. / temus / lnlt.c: 331
# 7 0xc01000c7 en muln () en .. / .. / temus / lnlt.c: 140

Plntos-debug: dumplng bucktruce de hllo 'lnuctlvo' @ 0xc0116000
# 0 0xc010168c en nextthreudtorun () en .. / .. / temus / threud.c: 649
# 1 en horurlo de 0xc0101778 () en .. / .. / temus / threud.c: 714
# 2 0xc0100f8f en threudblock () en .. / .. / temus / threud.c: 324
# 3 0xc0101419 en ldle (uux = 0x0) en .. / .. / temus / threud.c: 551
# 4 0xc010145u en kernelthreud (funcln = 0xc01013ff, uux = 0x0)
en .. / .. / temus / threud.c: 575
# 5 0x00000000 ln?? ()

En este cuso, slo huy dos hllos, el hllo de lnuctlvldud y el hllo prlnclpul. El nucleo de pglnus de pllu (u
lu que lu struct threudpuntos de struct threud se encuentrun
en 0xc0116000 y 0xc002f000, respectlvumente. El hllo prlnclpul se hu quedudo utuscudo
en tlmersleep() llumudus de testmlfqsloud1
Suber dnde estn utrupudos hllos puede ser tremendumente utll, por e|emplo, cuundo el dlugnstlco de
bloqueos o lnexpllcubles cuelgu.
E.5.3 depurucln de progrumus de usuurlo
Tumbln puede usur gdb puru depurur un progrumu de usuurlo e|ecutu en Plntos. Comlence por lu
expedlcln de este comundo GDB puru curgur el simbolo del progrumu de mesu:

Anudlr simbolo de urchlvo de progrumu de
donde progrumu es el nombre del progrumu e|ecutuble (en el slstemu de urchlvos de ucogldu, no en el
slstemu de urchlvos Plntos). Despus de esto, usted deberiu ser cupuz de depurur el progrumu de
usuurlo de lu mlsmu muneru que el nucleo, colocundo puntos de lnterrupcln, el control de dutos, etc
Sus ucclones se upllcun u cudu progrumu de usuurlo e|ecutu en Plntos, no slo puru el que deseu
depurur, usi que tengu culdudo en lu lnterpretucln de los resultudos. Adems, un nombre que upurece
en el nucleo y del progrumu de usuurlo en reulldud se refleren ul nombre del nucleo. (Este ultlmo
problemu se puede evltur dundo el nombre de usuurlo e|ecutuble en lu lineu de comundos GDB, en lugur
de kernel.o, y luego usundo udd-symbol-flle puru curgur kernel.o.)
E.5.4 FAO
GDB no se puede conectur u Bochs.
Sl el turget remote comundo turget remote fullu, entonces usegurese de que tunto GDB
y plntos se estn e|ecutundo en lu mlsmu mqulnu e|ecutundo hostnume en cudu termlnul. Sl lus
denomlnuclones dlfleren, entonces usted necesltu puru ubrlr unu nuevu termlnul puru GDB en lu
mqulnu en funclonumlento plntos
GDB no reconoce nlngunu de lus mucros.
Sl usted comlenzu con GDB plntos-gdb se debe curgur lus mucros Plntos uutomtlcumente. Sl
emplezu u GDB de otru muneru, entonces debe emltlr el source plntosdlr /src/mlsc/gdb-
mucros comundo source plntosdlr/src/mlsc/gdb-mucros donde plntosdlr es lu ruiz de su
dlrectorlo de Plntos, untes de poder utlllzurlos.
Puedo depurucln Plntos con DDD?
Si, puede. DDD lnvocu GDB como un subproceso, por lo que tendrs que declrle que
lnvocu plntos-gdb en su lugur:

DDD - gdb - Plntos depurudor gdb
Puedo usur GDB dentro de Emucs?
Si, puede. Emucs tlene un soporte especlul puru el funclonumlento de GDB como un
subproceso. Escrlbu Mx gdb e lntroduce tu plntos-gdb en el prompt. El Emucs munuul contlene
lnformucln sobre cmo utlllzur sus funclones de depurucln en unu seccln tltuludu
"depurudores".
GDB est huclendo ulgo ruro.
Sl observu un comportumlento extruno durunte el uso de GDB, huy tres poslbllldudes: un error
en su Plntos vez, un error en lu lnterfuz de Bochs puru GDB GDB o en si mlsmo, o un error en
el cdlgo Plntos orlglnul. Lu prlmeru y lu segundu es muy probuble, y usted deberiu conslderur
serlumente tunto. Esperumos que lu terceru es lu menos probuble, pero tumbln es poslble.
E.6 errores Trlple
Cuundo un controludor de excepclones de lu CPU, tules como un controludor de errores de pglnu, no
puede ser lnvocudu, yu que fultu o est defectuoso, lu CPU lntentu lnvocur lu "doble fultu"
controludor. Sl el controludor de doble fultu es en si mlsmu fultu o defectuosu, que se llumu un "error de
trlple". Un fullo provocu unu trlple restubleclmlento lnmedluto de lu CPU.
Asi, sl te metes en unu sltuucln en que se relnlclu el equlpo en un bucle, que es probublemente un
"error de trlple". En unu sltuucln de fullo de trlple, no podriu ser cupuz de usur prlntf() puru lu
depurucln, yu que se relnlclu el que podriu estur ocurrlendo lncluso untes de todo lo necesurlo
puru prlntf() se lnlclullzu.
Huy ul menos dos formus puru depurur fullos trlple. En prlmer lugur, se puede e|ecutur Plntos en Bochs
bu|o gdb (vuse lu seccln E.5 GDB). Sl Bochs se hu construldo correctumente puru Plntos, en vlrtud de
un fullo de trlple GDB hur que se lmprlmu el mensu|e de "error de Trlple: detener puru gdb" en lu
consolu y entrur en el depurudor. (Sl Bochs no se est e|ecutundo bu|o GDB, un fullo de trlple toduviu
hur que se relnlcle.) A contlnuucln, puede lnspecclonur en Plntos detenldo, que es donde se produ|o lu
fullu trlple.
Otru opcln es lo que yo llumo "lu depurucln de bucle lnflnlto." Escoge un lugur en el cdlgo de Plntos,
lnserte el bucle lnflnltofor (;;); ulli, y volver u compllur y e|ecutur. Huy dos poslbllldudes probubles:
y Lu mqulnu se cuelgu sln relnlclur. Sl esto sucede, usted sube que el bucle lnflnlto, se est
e|ecutundo. Eso slgnlflcu que lo que le cuus el relnlclo debe ser posterlor ul lugur en el que
lnsertu el bucle lnflnlto. Ahoru muevu el bucle lnflnlto, ms turde en lu secuenclu de cdlgo.
y Se relnlclu lu mqulnu en un bucle. Sl esto sucede, usted sube que lu mqulnu no lleguron ul
bucle lnflnlto. Por lo tunto, lo que le cuus el relnlclo debe ser untes de que el lugur en el que
lnsertu el bucle lnflnlto. Ahoru muevu el bucle lnflnlto, untes en lu secuenclu de cdlgo.
Sl usted se mueve ulrededor del bucle lnflnlto en lu busquedu de un "blnurlo" de lu modu, puede utlllzur
estu tcnlcu puru preclsur el lugur exucto en que todo vu mul. Slo debe tomur unos pocos mlnutos
como mxlmo.
E.7 Bochs Modlflcur
Unu tcnlcu de depurucln uvunzudu es lu de modlflcur y recompllur el slmuludor. Esto resultu utll
cuundo el hurdwure slmuludo tlene ms lnformucln que pone u dlsposlcln del slstemu operutlvo. Por
e|emplo, los errores de pglnu tlenen unu lurgu llstu de cuusus potenclules, pero el hurdwure no lnforme
u lu OS exuctumente cul es lu cuusu purtlculur. Por otru purte, un error en lu munlpulucln del nucleo
de fullos de pglnu puede llevur fcllmente u los fullos recurslvu, pero unu "error de trlple" hur que lu
CPU puru restublecer si, que es poco proplclo u lu depurucln.
En un cuso como este, es poslble que upreclun lu poslbllldud de hucer Bochs lmprlmlr ms lnformucln
de depurucln, tules como el tlpo exucto de lu fullu que se produ|o. No es muy duro. Usted comlenzu por
recuperur el cdlgo fuente de Bochs 2.2.6 de http://bochs.sourceforge.net y extruerlo en un dlrectorlo. A
contlnuucln, leu plntos/src/mlsc/bochs-2.2.6.README y upllcur los purches necesurlos. A
contlnuucln, e|ecute. / Conflgure, el sumlnlstro de lus opclones que desees (ulgunus sugerenclus estn
en el flchero de purche). Por ultlmo, e|ecute muke Esto compllur Bochs y, flnulmente, produclr un
nuevobochs blnurlo. Puru utlllzur el bochs blnurlo con plntos ponerlo en tu PATH y usegurese de que es
unterlor u / usr/cluss/cs140 / `unume-m` bochs /.
Por supuesto, puru consegulr ulgo bueno de esto, tendr que modlflcur reulmente Bochs. Lus
lnstrucclones puru hucerlo estn flrmemente fueru del ulcunce de este documento. Sln emburgo, sl deseu
depurur los errores de pglnu como se suglrl untes, un buen lugur puru empezur u unudlr prlntf() s
es BXCPUC::dtrunslutellneur() en lu CPU / puglng.cc.
E.8 Conse|os
El uslgnudor de pglnu en hllos / pulloc.c y el uslgnudor de bloque en hllos / mulloc.c borrur todos los
bytes en memorlu puru 0xcc en el momento de lu llbre. Por lo tunto, sl usted ve un lntento de ellmlnur lu
referenclu de un puntero como0xcccccccc, o ulgunu otru referenclu u 0xcc, huy unu buenu probubllldud
de que est lntentundo volver u utlllzur unu pglnu que yu hu sldo llberudo. Adems, 0xcc byte es el
cdlgo de operucln de lu CPU puru "lnvocur lu lnterrupcln de 3", de modo que sl usted ve un error
slmllur Interrupt 0x03 (#BP Breukpolnt Exceptlon) entonces Plntos lntent e|ecutur cdlgo en unu pglnu
de llberur o bloqueur.
Un error de usercln en lu secno < d->cupuclty expresln secno < d->cupuclty lndlcu que Plntos
lntentudo ucceder u un urchlvo u truvs de un nodo que hu sldo cerrudo y puesto en llbertud. Llberur u
un lnodo borru su numero de sector de purtldu puru 0xcccccccc, que no es un numero vlldo del sector
puru los dlscos ms pequenos que ulrededor de 1,6 TB.
F. Herrumlentus de desurrollo
Estos son ulgunos de herrumlentus que le puede resultur utll durunte el desurrollo de cdlgo.
F.1 Etlquetus
Lus etlquetus son un indlce de lus funclones y vurlubles globules declurudus en un progrumu. Muchos
edltores, lncluldo Emucs yvl puede utlllzurlos. El Mukeflle en Plntos / src produce Emucs-etlquetus de
estllo con el comundo de muke TAGS o vlde estllo de muke tugs
En Emucs, use M-. A segulr unu etlquetu en lu ventunu uctuul, Cx 4. En unu nuevu ventunu, o Cx 5. En
un nuevo murco. Sl el cursor est en un nombre de simbolo puru ulguno de estos comundos, se
convlerte en el destlno predetermlnudo. Sl un nombre de etlquetu tlene multlples deflnlclones, M-0 M-
. Sultu u lu slgulente. Puru sultur de nuevo u donde estubu untes de segulr lu ultlmu etlquetu, utlllce M-*.
F.2 CVS
CVS es unu versln del slstemu de control. Es declr, se puede utlllzur puru hucer un segulmlento de
multlples verslones de urchlvos. Lu ldeu es que hucer un trubu|o sobre el cdlgo y proburlo, u
contlnuucln, comprobur que en lu versln del slstemu de control. Sl usted declde que el trubu|o que hus
hecho desde tu ultlmu revlsln en el no es bueno, usted puede fcllmente volver u lu ultlmu-en lu
versln. Adems, puede recuperur cuulquler versln untlguu de su cdlgo como de un diu y tlempo
determlnudos. Los reglstros de control de verslones dlr quln reullz cumblos y cundo.
CVS no es el me|or slstemu de control de verslones por uhi, pero es grutls, es bustunte fcll de usur, y yu
est dlsponlble en lus mqulnus de Lelund est utlllzundo puru los proyectos.
Puru obtener ms lnformucln, vlslte lu pglnu de lnlclo de CVS.
F.2.1 Conflgurucln de CVS
Puru conflgurur CVS puru el uso con Plntos en lus mqulnus de Lelund, comlence por lu eleccln de un
mlembro del grupo como el guurdln del reposltorlo CVS. Todos en el grupo ser cupuz de utlllzur el
reposltorlo CVS, pero el portero reulmente creur el reposltorlo, muntengu sus urchlvos en su dlrectorlo
personul, y muntener los permlsos de su contenldo.
El guurdln tlene que reullzur vurlos pusos puru creur el reposltorlo. En prlmer lugur, creur un nuevo
grupo de AFS puru el reposltorlo medlunte lu e|ecucln de pts CreuteGroup responsuble: Plntos-
CVS, donde se guurdu el nombre de usuurlo poseedor de Lelund. A contlnuucln, ugregue cudu
mlembro del grupo ul nuevo grupo por vurlus ocuslones con el comundo pts udduser usuurlo-usuurlo-
encurgudo del grupo: Plntos-CVS, donde Usuurlo es el nombre de un mlembro del grupo. Despus de
que el grupo se hu creudo y sus mlembros, ugreg, poseedor pts mlembros: Plntos-cvs debe lnformur de
que cudu mlembro del grupo es un mlembro de lu guurdu: Plntos-cvs grupo.
El poseedor, entonces, creu el dlrectorlo del reposltorlo y le du el ucceso de los mlembros del grupo u lu
mlsmu. Vumos u suponer que el depslto ser en un dlrectorlo llumudo cvs en el dlrectorlo prlnclpul del
culdudor. En prlmer lugur creur este dlrectorlo con mkdlr S HOME / cvs, u contlnuucln, dur u los
mlembros del grupo con ucceso u fs setucl-dlr S HOME / cvs-Keeper ucl: Plntos-cvs escrlblr. Los
mlembros del grupo tumbln tlenen que ser cupuces de buscur en el dlrectorlo cvs en el dlrectorlo
prlnclpul del guurdu, que puede ser hubllltudu u truvs de fs setucl-dlr S HOME-Keeper ucl: Plntos-cvs
l (que lu curtu de "ele", no de dos digltos "uno". "). (9)
Ahoru lnlclullzur el reposltorlo. Puru lnlclullzur el reposltorlo, e|ecute cvs-d S HOME / cvs lnlt.
Por ultlmo, lu lmportucln de lus fuentes Plntos en el reposltorlo se ucubu de lnlclur. Sl usted tlene un
con|unto exlstente de lus fuentes de Plntos que deseu unudlr ul reposltorlo, cd en el dlrectorlo de
su Plntos uhoru. De lo contrurlo, lu lmportucln de los rboles Plntos buse de lu fuente, cd u /
usr/cluss/cs140/plntos/plntos (ntese el doble Plntos). Despus de cumblur el dlrectorlo uctuul, e|ecute
este comundo:

cvs-d S HOME / cvs lmport-m "fuentes lmportudus" Plntos lnlclo foobur
Aqui est un resumen de los comundos que se hun e|ecutudo:

pts CreuteGroup responsuble: Plntos-cvs
pts-udduser usuurlo grupo encurgudo de usuurlo: Plntos-cvs
mkdlr S HOME / CV
fs setucl-dlr S HOME / cvs-Keeper ucl: Plntos-cvs escrlblr
fs setucl-dlr S HOME-Keeper ucl: Plntos-cvs l
cvs-d S HOME / cvs lnlt
cd / usr/cluss/cs140/plntos/plntos
cvs-d S HOME / cvs lmport-m "fuentes lmportudus" Plntos lnlclo foobur
El reposltorlo est llsto puru su uso por cuulquler mlembro del grupo, como se descrlbe u
contlnuucln. Tengu en cuentu que el depslto slo se puede ucceder utlllzundo comundos del CVS -
generulmente no es utll puru exumlnur u muno, y usted no debe modlflcur deflnltlvumente usted mlsmo.
F.2.2 medlunte CVS
Puru usur CVS, empezur por comprobur unu coplu de trubu|o de los contenldos del reposltorlo CVS en
un dlrectorlo llumudodlr. Puru ello, e|ecute cvs-d - poseedor / cvs checkout-d dlr Plntos, donde
se guurdu el nombre de usuurlo poseedor de CVS Lelund.
(Sl esto no funclonu debldo u ulgun tlpo de problemu de permlsos, uklog u contlnuucln, e|ecutur y
vuelvu u lntenturlo. Sl toduviu no funclonu, sullr y volver pulg Sl uun usi no se soluclonu el problemu, el
reposltorlo CVS no se puede lnlclullzur correctumente.)
En este punto, puede modlflcur cuulquleru de los urchlvos de lu coplu de trubu|o. Usted puede ver los
cumblos que hu reullzudo con cvs dlff-u. Sl usted qulere cometer estos cumblos ul reposltorlo, hucerlus
vlslbles u los otros mlembros del grupo, puede utlllzur el comundo de CVS. Dentro del
dlrectorlo Plntos, e|ecute cvs commlt. Esto se durn cuentu de los urchlvos que hun cumbludo y el fuego
de un edltor de texto puru que descrlbu los cumblos. De formu predetermlnudu, este edltor es vl, pero
puede selecclonur un edltor dlferente ul estublecer lu vurluble de entorno CVSEDITOR por e|emplo,
conemucs CVSEDITOR setenv (unudlr estu lineu u su cvsrc. Puru que seu permunente).
Supongumos que otro mlembro del grupo se hu comprometldo cumblos. Usted puede ver los cumblos
reullzudos en el reposltorlo desde el momento en que lo huyu fucturudo u cubo (o uctuullzucln de lu
mlsmu) con cvs dlff-u-buse r-r HEAD. Puede comblnur los cumblos en su coplu de trubu|o utlllzundo cvs
updute. Sl ulguno de los confllctos que los cumblos locules comprometldos con los cumblos, lu sulldu del
comundo de CVS deberiu decirselo. En ese cuso, edltur los urchlvos que contlenen los confllctos, en
buscu de <<<y>>> que lndlcun los confllctos y soluclonur el problemu.
Usted puede ver el hlstorlul de urchlvos en su dlrectorlo de trubu|o, lncluldos los mensu|es de reglstro,
con el cvs logflle.
Usted puede dur u un con|unto purtlculur de verslones de urchlvo de un nombre llumu
unu etlquetu. Prlmer CD u lu ruiz de lu coplu de trubu|o, u contlnuucln, e|ecutur nombre de lu etlquetu
CVS. Es me|or no tener los cumblos locules en lu coplu de trubu|o ul hucer esto, porque lu etlquetu no se
lncluyen los cumblos no conflrmudos. Puru recuperur el depslto murcudos despus, utlllce el
comundo cvs checkout en lu formu-D - / portero CVS-r etlquetu-d dlrPlntos, donde se guurdu el nombre
de usuurlo del poseedor de CVS y DIR es el dlrectorlo puru poner el reposltorlo puso en .
Sl se ugregu un nuevo urchlvo en el rbol de cdlgo fuente, se deber unudlr ul reposltorlo con cvs
udd urchlvo. Este comundo no tlene efecto durudero hustu que el urchlvo se hu comprometldo ms turde
con cvs commlt.
Puru ellmlnur un urchlvo del rbol de cdlgo fuente, en prlmer lugur retirelu del slstemu de urchlvos
con rm y luego declrle u CVS con cvs ellmlnur el urchlvo. Unu vez ms, CV se
compromete unlcumente u hucer el cumblo permunente.
Puru descurtur los cumblos locules de un determlnudo urchlvo, sln lncurrlr en ellos, utlllzur cvs updute-
urchlvo C.
Puru verlflcur lu versln de su reposltorlo como de unu fechu concretu, utlllce el comundo cvs-d
- poseedor / CVS-Dfechu '-d dlr Plntos, donde se guurdu el nombre de usuurlo del poseedor de CVS
y dlr es el dlrectorlo poner el reposltorlo puso en .. Un formuto tiplco de lu fechu es AAAA-MM-DD HH:
MM, pero CVS uceptu vurlos formutos, lncluso ulgo usi como huce 1 horu.
Puru obtener ms lnformucln, vlslte lu pglnu de lnlclo de CVS.
F.2.3 CVS de bloqueo
Ocuslonulmente usted podriu ver un mensu|e como este durunte el uso de CVS:

BLP esperu de bloqueo en / ufs / usuurlos de lr / / b / / l BLP / CV
Esto normulmente slgnlflcu que ms de un usuurlo tlene ucceso ul reposltorlo en el mlsmo tlempo. CVS
relntentur uutomtlcumente despus de 30 segundos, momento en que lu operucln que normulmente
debe ser cupuz de contlnuur.
Sl se encuentru con unu lurgu esperu puru un bloqueo de ms de un mlnuto o usi, puede lndlcur que un
comundo de CVS no se complet correctumente y no hu retlrudo sus bloqueos. Sl usted plensu que este
es el cuso, pldu ul usuurlo en cuestln ul respecto. Sl resultu que unu operucln no sule mul, entonces
usted (o el nombre de usuurlo) puede ellmlnur los urchlvos cuyos nombres comlenzun con cvs.rfl #, #
cvs.wfl o cvs.lock # en el dlrectorlo menclonudo en el mensu|e. Sl lo huce, debe permltlr que su
operucln puru proceder. No suprlmlr o modlflcur otros urchlvos.
F.3 SourceForge
SourceForge es un slstemu busudo en Internet puru fucllltur el desurrollo de softwure. Le ofrece unu
versln del slstemu de control (por lo generul de CVS, como se descrlbl unterlormente) y otrus
herrumlentus puru el segulmlento de su softwure. Se puede utlllzur puru ulmucenur urchlvos, segulr los
errores, y lus notus post sobre el progreso del desurrollo. Usted puede conflgurur su proplo proyecto en
SourceForge en sourceforge.net.
F.4 VNC
VNC slgnlflcu Vlrtuul Network Computlng. Es, en esenclu, un slstemu de vlsuullzucln remotu que le
permlte ver un clculo "de escrltorlo" medlo umblente no slo en lu mqulnu donde se est e|ecutundo,
slno desde cuulquler lugur de Internet y de unu grun vurledud de urqultecturus. Yu est lnstuludo en lus
mqulnus de Lelund. Puru obtener ms lnformucln, veu lu pglnu prlnclpul de VNC.
Instulucln de G. Plntos
Este cupitulo expllcu cmo lnstulur un entorno de desurrollo Plntos en su proplu mqulnu. Sl usted est
usundo un entorno de desurrollo Plntos que hu sldo creudo por ulgulen ms, usted no necesltu leer este
cupitulo, o slgu estus lnstrucclones.
El entorno de desurrollo Plntos se dlrlge u los slstemus de tlpo Unlx. Hu sldo ms extensumente probudo
en GNU / Llnux, en purtlculur los de Deblun y dlstrlbuclones de Ubuntu, y Solurls. No est dlsenudo
puru lnstulur en cuulquler formu de Wlndows.
Requlsltos prevlos puru lu lnstulucln de un entorno de desurrollo Plntos se lncluyen lus slgulentes,
udems de utllldudes estndur de Unlx:
y Requerldo: GCC. Versln 4.0 o posterlor se preflere. Versln 3.3 o posterlor debe trubu|ur. Sl lu
muqulnu servldor tlene un procesudor de 80 x 86, entonces GCC deberiu estur dlsponlble
como gcc de lo contrurlo, un 80 x 86 complludor cruzudo deberiu estur dlsponlble como l386-
elf-gcc Unu muestru de con|unto de comundos puru lu lnstulucln de gcc 3.3.6, como un
complludor cruzudo se lncluyen en src/mlsc/gcc-3.3.6-cross-howto.
y Requerldo: GNU blnutlls. Plntos utlllzu uddr2llne ur ld ob|copy y runllb Sl el equlpo unfltrln no
es unu 80 x 86, verslones de lu orlentucln 80 x 86 deberiun estur dlsponlbles con unu l386-elf-
prefl|o.
y Requerldo: Perl. Versln 5.8.0 o posterlor se preflere. Versln 5.6.1 o posterlor debe trubu|ur.
y Requerldo: el muke de GNU, versln 3.80 o posterlor.
y Recomendudo: OEMU, lu versln 0.8.0 o posterlor. Sl no se dlspone de OEMU, Bochs puede
ser utlllzudo, pero su lentltud es frustrunte.
y Recomendudo: GDB. GDB es utll en lu depurucln (vuse lu seccln E.5 GDB). Sl el equlpo
unfltrln no es unu 80 x 86, unu versln de GDB ob|etlvo 80 x 86 deberiun estur dlsponlbles
puru l386-elf-gdb.
y Recomendudo: X. Ser cupuz de utlllzur un servldor de X huce que lu mqulnu vlrtuul se slenten
ms como unu mqulnu fislcu, pero no es estrlctumente necesurlo.
y Opclonul: Texlnfo, versln 4.5 o posterlor. Texlnfo es necesurlo puru creur lu versln en PDF de
lu documentucln.
y Opclonul: TeX. Tumbln se requlere puru construlr lu versln en PDF de lu documentucln.
y Opclonul: VMwure Pluyer. Se trutu de unu terceru plutuformu, que tumbln puede ser utlllzudo
puru probur Plntos.
Unu vez que estos requlsltos estn dlsponlbles, slgu estus lnstrucclones puru lnstulur Plntos:
1. Instulur Bochs, versln 2.2.6, como se descrlbe u contlnuucln (vuse lu seccln G.1
construccln de Bochs puru Plntos).
2. Scrlpts de lnstulucln de src / utlls. Bucktruce Coplur, plntos, plntos-gdb, plntos-mkdlsk en
el PATHpredetermlnudo.
3. Instulur src / mlsc / gdb-mucros en un lugur publlco. A contlnuucln, utlllce un edltor de texto
puru edltur lu coplu lnstuludu de plntos-gdb, cumblundo lu deflnlcln de GDBMACROS puru
upuntur u donde lnstul gdb-mucros.Pruebu de lu lnstulucln e|ecutundo plntos-gdb sln
urgumentos. Sl no se que|un de fultu gdb-mucros, que est lnstuludo correctumente.
4. Compllur lus utllldudes restuntes Plntos escrlblendo muke en src / utlls. Instulur squlsh pty-
en ulgun lugur dePATH Coluborundo con VMwure Pluyer, lnstulur squlsh-unlx. Sl su Perl es
unterlor u lu versln 5.8.0, tumbln lnstule setltlmer-helper, de lo contrurlo, es lnnecesurlo.
5. Plntos uhoru deberiu estur llsto puru su uso. Sl usted tlene lus soluclones de referenclu Plntos,
que slo se proporclonun u los profesores y sus uslstentes de ensenunzu, entonces usted puede
probur lu lnstulucln medlunte lu e|ecucln de muke check en el ulto del dlrectorlo de pruebus
de nlvel. Lus pruebus de tomur entre 20 mlnutos y 1 horu de correr, dependlendo de lu
velocldud de su hurdwure.
6. Opclonul: Generur lu documentucln, medlunte lu e|ecucln de muke dlst en el dlrectorlo de
nlvel superlor doc. Esto creu un subdlrectorlo dentro de WWW doc que contlene lus verslones
HTML y PDF de lu documentucln, ms el documento de pluntlllus de dlseno y lus
especlflcuclones de hurdwure dlferentes ul que huce referenclu lu documentucln.Lu
construccln de lu versln en PDF del munuul requlere Texlnfo y TeX (ver ms urrlbu). Usted
puede lnstulurWWW dondequleru que se encuentren ms utlles.
El dlrectorlo doc no est lncluldu en el tur.gz. Dlstrlbuldos puru Plntos. Es en el rbol de CVS
Plntos dlsponlble u
truvs :pserver:unonymous@footstool.stunford.edu:/vur/llb/cvs /:pserver:unonymous@footstool.
stunford.edu:/vur/llb/cvs en el mdulo de plntos El rbol de CVS no es lu fuente uutorlzudu de
los muterlules del curso de Stunford, que debe obtenerse de lu pglnu web del curso.
G.1 construccln de Bochs puru Plntos
Aguus urrlbu Bochs tlene defectos y lus verrugus que debe fl|urse cuundo se utlllzu con Plntos. Por lo
tunto, Bochs debe ser lnstuludo munuulmente puru su uso con Plntos, en lugur de utlllzur lu versln
empuquetudu de Bochs lncluldo en unu dlstrlbucln del slstemu operutlvo.
Dos dlferentes blnurlos Bochs debe ser lnstuludo. Unu, llumudu slmplemente bochs debe tener el tuln
de GDB hubllltudo, pusundo de - enuble-gdb-stub u lu secuenclu de comundos de conflgure Bochs. El
otro, bochs-dbg debe tener el depurudor lnterno uctlvudo, pusundo de - enuble-debugger u conflgure (Lu
secuenclu de comundos plntos selecclonu un blnurlo busudo en lus opclones que se le pusu.) En cudu
cuso, lu X, termlnul, y "no GUI" se debe conflgurur lus lnterfuces, pusundo - wlth-x - wlth-x11 - con
pluzo - con-nogul u conflgure
Estu versln de Plntos est dlsenudo puru su uso con Bochs 2.2.6. Unu serle de purches puru estu
versln de Bochs se lncluyen en src / mlsc:
Bochs-2.2.6-blg-endlun.putch
Huce que el BGF tulones de trubu|o sobre slstemus blg-endlun como Solurls / Spurc, huclendo
buen byteswupplng.Debe ser lnofenslvo en otros lugures.
Bochs-2.2.6-|ltter.putch
Agregu el "|ltter" curucteristlcu, en el que lus lnterrupclones del temporlzudor se entregun u
lntervulos uleutorlos (vuse lu seccln 1.1.4 de depurucln versus pruebus).
Bochs-2.2.6-trlple-fuult.putch
Cuusus Bochs puru romper u GDB, cuundo se produce un fullo de trlple y el tuln de GDB est
uctlvo (ver seccln E.6 Trlple Fultus).
Bochs-2.2.6-ms-extenslons.putch
Necesurlos puru Bochs puru compllur con GCC en ulgunos e|rcltos. Probublemente lnofenslvo
en otros lugures.
Bochs-2.2.6-solurls-tty.putch
Bochs necesurlos puru compllur el soporte de termlnules en los e|rcltos de
Solurls. Probublemente lnofenslvo en otros lugures.
Bochs-2.2.6-pglnu-Fuult-segv.putch
Huce que el tuln de GDB un lnforme de SIGSEGV ul depurudor cuundo unu pglnu de
excepcln de fullo, en lugur de "senul 0". Los prlmeros pueden ser lgnorudos con hundle
SIGSEGV nostop pero ste no puede.
Bochs-2.2.6-purunolu.putch
Corrlge error de compllucln con verslones modernus de GCC.
Bochs-2.2.6-solurls-llnk.putch
Necesurlos en los servldores Solurls. No lo upllque en otrus purtes.
Puru upllcur todos los purches, cd en el dlrectorlo de Bochs, u contlnuucln, escrlbu:

putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-blg-endlun.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-|ltter.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-trlple-fuult.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-ms-extenslons.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-solurls-tty.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-puge-fuult-segv.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-purunolu.putch
putch-p1 <S PINTOSDIR/src/mlsc/bochs-2.2.6-solurls-llnk.putch
Usted tendr que sumlnlstrur los SPINTOSDIR udecuudu SPINTOSDIR por supuesto. Usted puede
utlllzur putch 's - dry-run opcln sl deseu probur sl los purches se upllcun llmplu untes de trutur de
upllcurlos.
Comundos de e|emplo puru construlr e lnstulur Bochs puru Plntos son ofrecldos en src/mlsc/bochs-2.2.6-
bulld.sh.

Вам также может понравиться