11.7. Нэмэлт сэдвүүд

Хэрэв та Линуксийн хоёртын нийлэмж хэрхэн ажилладгийг мэдэхийг хүсэж байгаа бол энэ хэсэг нь таны уншихыг хүсэж байгаа хэсэг юм. Доор бичигдсэн зүйлийн ихэнх нь Тэрри Лэмбэрт -ийн FreeBSD chat захидлын жагсаалт руу бичсэн цахим захидал (Message ID: <199906020108.SAA07001@usr09.primenet.com>) дээр тулгуурласан байгаа.

11.7.1. Хэрхэн ажилладаг вэ?

FreeBSD нь “execution class loader” буюу ажиллуулах ангилал дуудагч гэгддэг хийсвэрлэлттэй байдаг. Энэ нь execve(2) системийн дуудлага уруу хийгдэх шаантаг юм.

Юу болдог вэ гэхээр FreeBSD нь ямар нэгэн бүрхүүлийн тайлбарлагчид эсвэл бүрхүүлийн скриптүүдийг ажиллуулахын тулд #! дуудагч уруу ордог нэг дуудагчийн оронд дуудагчдын жагсаалттай байдаг.

Уламжлалаар бол UNIX® тавцангийн дуудагч нь хоёртын файлыг системд мэдэгдэж байгаа эсэхийг мэдэхийн тулд шидэт тоог (ерөнхийдөө файлын эхний 4 эсвэл 8 байт) шалгадаг бөгөөд хэрэв мэдэгдэж байвал хоёртын дуудагчийг ажиллуулдаг ганц дуудагч юм.

Хэрэв энэ нь системд зориулагдсан хоёртын төрөл биш бол execve(2) дуудлага амжилгүй болон буцаж бүрхүүл үүнийг бүрхүүлийн тушаалууд маягаар ажиллуулж эхлэхийг оролддог.

“Тухайн үеийн бүрхүүл ямар байгаа” түүнийг анхдагч гэж таамагладаг.

Дараа нь эхний хоёр тэмдэгтүүдийг шалгах засварыг (hack) sh(1)-д зориулж хийсэн бөгөөд хэрэв тэдгээр нь :\n бол энэ нь csh(1) бүрхүүлийг ажиллуулдаг (энэ засварыг SCO анхлан хийсэн гэж бид итгэдэг).

Төгсгөлийн дараах дараагийн хоосон зайны дараа байдаг тэмдэгтүүдийн дараа /bin/sh уруу буцдаг тэмдэгтүүд байдаг болохоор одоо FreeBSD юу хийдэг вэ гэхээр дуудагчдын жагсаалтаар тайлбарлагчдын талаар мэддэг ерөнхий #! дуудагчтай явдаг.

Линуксийн ABI дэмжлэгийн хувьд FreeBSD нь шидэт тоог ELF хоёртын файл гэж хардаг (одоогоор энэ нь FreeBSD, Solaris™, Линукс болон ELF дүрсний төрөл бүхий бусад OS-ийг хооронд нь ялгадаггүй).

ELF дуудагч нь тусгай тамга хайдаг бөгөөд энэ нь ELF дүрс дэх тайлбар хэсэг юм. Энэ нь SVR4/Solaris ELF хоёртын файлуудад байдаггүй.

Линукс хоёртын файлууд нь ажиллахын тулд тэдгээр нь brandelf(1)-ээр Линукс гэж тамгалагдах ёстой байдаг:

# brandelf -t Linux file

Үүнийг хийсний дараа ELF дуудагч нь файлд Линукс тамгыг харах болно.

ELF дуудагч Линукс тамгыг харах үед дуудагч proc бүтэц дэх заагчийг сольдог. Энэ заагчаар бүх системийн дуудлагууд индекслэгддэг (уламжлалт UNIX систем дээр энэ нь системийн дуудлагуудыг агуулах sysent[] бүтцийн массив байх юм). Үүнээс гадна процесс нь дохионы трамплиний кодонд зориулсан занга векторыг тусгайлан зохицуулахад болон Линуксийн цөмийн модулиар зохицуулагддаг бусад хэд хэдэн (жижиг) засваруудад зориулагдаж тэмдэглэгддэг.

Линукс системийн дуудлагын вектор нь бусад зүйлүүдээс гадна цөмийн модульд хаягууд нь байдаг sysent[] оруулгуудын жагсаалтыг агуулдаг.

Системийн дуудлага Линуксийн хоёртын файлаар дуудагдахад занга код системийн дуудлагын функц заагчийн хаягийг proc бүтцээс авч FreeBSD-ийн биш Линуксийн системийн дуудлагын оруулгын цэгүүдийг авдаг.

Мөн Линукс горим нь хайлтыг динамикаар дахин эхлүүлдэг; энэ нь файлын системийн холболтууд дахь union тохируулга (unionfs файлын системийн төрөл биш!) хийдэг тэр зүйл юм. Эхлээд /compat/linux/original-path сан дахь файлыг хайх бөгөөд дараа нь хэрэв энэ нь амжилтгүй болвол хайлт /original-path санд хийгддэг. Энэ нь бусад хоёртын файлуудыг шаарддаг хоёртын файлуудыг ажиллаж чадахаар (өөрөөр хэлбэл Линуксийн хэрэгслийн цуглуулга бүгдээрээ Линуксийн ABI дэмжлэгийн доор ажиллаж чаддаг байхаар) болгодог. Линуксийн хоёртын файлууд нь тохирох Линуксийн хоёртын файлууд байхгүй бол FreeBSD-ийн хоёртын файлуудыг дуудаж ажиллуулж бас чадна гэсэн үг бөгөөд Линуксийн хоёртын файлуудыг Линукс дээр ажиллахгүй байгааг нь хэлж чадахааргүй болгохын тулд та uname(1) тушаалыг /compat/linux санд байрлуулж болно гэсэн үг юм.

Үндсэндээ Линуксийн цөм FreeBSD цөмд байдаг; цөмийн үзүүлдэг бүх үйлчилгээнүүдийг хийдэг, доор нь орших төрөл бүрийн функцууд нь FreeBSD-ийн системийн дуудлагын хүснэгтийн оруулгууд болон Линуксийн системийн дуудлагын хүснэгтийн оруулгуудтай ижил байдаг: файлын системийн үйлдлүүд, виртуал санах ойн үйлдлүүд, дохио хүргэлт, System V IPC, гэх мэт… Цорын ганц ялгаа нь FreeBSD-ийн хоёртын файлууд FreeBSD-ийн цавуу функцуудыг, Линуксийн хоёртын файлууд Линуксийн цавуу функцуудыг авдаг явдал юм (ихэнх хуучин OS-үүд зөвхөн өөрсдийн цавуу функцуудтай байсан: дуудлага хийж байгаа процессийн proc бүтэц дэх динамикаар эхлүүлэгдсэн заагчаар хийгдсэн функцуудын хаягуудын оронд статик глобал sysent[] бүтцийн массив дахь функцуудын хаягуудтай байсан).

Аль нь эх FreeBSD ABI вэ? Энэ нь хамаагүй юм. Үндсэндээ цорын ганц ялгаа нь (зөвхөн одоогоор; эдгээр нь ирээдүйн хувилбаруудад амархан өөрчлөгдөж болох бөгөөд магадгүй үүний дараагаар хийгдэх байх) FreeBSD-ийн цавуу функцууд нь цөмд статикаар холбогдсон байдаг бөгөөд Линуксийн цавуу функцууд нь статикаар холбогдож эсвэл тэдгээрт цөмийн модулийн тусламжтайгаар хандаж болдог явдал юм.

Тиймээ, гэхдээ энэ нь жинхэнэ эмуляц мөн үү? Үгүй ээ. Энэ нь ABI шийдэл болохоос эмуляц биш юм. Ямар ч эмулятор (эсвэл дүр үзүүлэгч (simulator) (дараагийн асуултыг асуулгахгүйн тулд)) оролцоогүй.

Тэгэхээр яагаад энэ нь заримдаа “Линукс эмуляц” гэгддэг юм бэ? FreeBSD-г худалдахад хэцүү болгохын тулд! Тиймээ, юу болж байгааг тайлбарлаж байгаагаас өөр зүйлгүй байх тэр үед уламжлалт шийдэл хийгдсэн болохоор тэр юм; хэрэв та кодыг эмхэтгээгүй эсвэл модулийг дуудаагүй бол Линуксийн хоёртын файлуудыг FreeBSD ажиллуулдаг гэж хэлэх нь үнэн биш бөгөөд юу дуудагдсаныг тайлбарлах үг хэрэгтэй байсан болохоор —“Линукс эмулятор” гэсэн үг гарсан юм.

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.