سلام
ببخشید یه سوال
توی درس سیستم عامل که از روی کتاب
Operating System Internals and Design Principles
Stallings
تدریس میشه
یجایی صحبت از
Execution of the Operating System
میکنه و ۳ مورد رو میشمره
1. Nonprocess Kernel
2. Execution within User Processes
و
3. Process-Based Operating System
که توی حالت اول یه کرنل جدااا واسه خودش موقع kernel mode عه cpu اجرا میشه
توی حالت دوم کدهای OS بین همه processها به اشتراک گذاشته شده و OS در واقع داخل User Processها ران میشه
و حالت سوم هم، OS خودش یک سری Process جداست که ران میشن
لینوکس چجوریه؟ 😁
@NerdProgrammer
Tópico سلام
17 mensagens · –N N M N M N M
M I Link
clique para mostrarمن سعی میکنم جوابی که فراتر از این کتابهاست رو بدم بهتون که خودتونم چرخ بزنین توی این موارد و گوشتون آشنا بشه با بعضی مفاهیم، ولی یک گوگل باید کنارتون باز باشه چون همهش رو کامل نمیگم 😬 لینوکس دو بخشی به قضیه نگاه میکنه. Kernel space و User space. (موضوع اول برای سرچ!) شما توی این مکانیزم دوتا address space ایزوله دارید. کرنل وقتی میخواد یک دیتایی رو از address space خودش به user space بفرسته با copy_to_user. https://elixir.bootlin.com/linux/latest/C/ident/copy_to_user اگر برعکس بخواید، copy_from_user هست: https://elixir.bootlin.com/linux/latest/ident/copy_from_user در مورد threadها هم، ما هم kernel thread داریم هم user thread. اگر واقعاً بخواین بدونین سمت لینوکس این یعنی چی، باید task_struct رو نگاه بندازید که چی هست: https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h#L743 یک تفاوت عمدهی kernel thread و user thread توی همین task_structشونه. ما معمولاً پروسسهای user space رو با fork/clone میسازیم که بهشون یک address space توی user space اختصاص میده، ولی توی kernel thread این آدرسدهی صرفا رخ نمیده: https://elixir.bootlin.com/linux/latest/source/kernel/kthread.c#L428 موضوع بعدی: اگر یک user threadی بخواد api call داشته باشه به یک بخشی از کرنل، باید از system callها استفاده کنه که این بساطهای copy_from_user و copy_to_user رو استفاده میکنن توی SYSCALL ROUTINEشون و دیتا رد و بدل میکنن... داخل خود تعریف syscall داخل کرنل هم توابع مختلف کرنل اجرا میشن. https://elixir.bootlin.com/linux/v3.7/source/fs/read_write.c#L483 مثلاً اینجا با این ماکرو داره یک سیستمکال تعریف میکنه که کاربر عادی بتونه call کنه. داخلش هم میبینید که رفته از vfs و این چیزها استفاده کرده. libcهای مختلف مثل glibc و musl بعدش میان براتون wrap میکنن این syscallها رو که بتونید سادهتر یک call انجام بدید. مثلاً سیستمکال fork رو شما اگر برید توی دل قضیه، میبینید چیزیه که libc بهتون داده، پشت قضیه داره با تابعهایی مثل do_fork توی کرنل کار میکنه. یک نمونهی تعریف system call: https://brennan.io/2016/11/14/kernel-dev-ep3/ موضوع بعدی: هر پروسسی توی لینوکس توی Virtual memoryش (اگر اصلا بسترش رو داشته باشین البته... MMU و این حرفا) یک بخشی رو به kernel میده. https://unix.stackexchange.com/questions/469016/do-the-virtual-address-spaces-of-all-the-processes-have-the-same-content-in-thei With KPTI, the kernel page tables are separate from the userspace page tables, and only a minimal set of mappings are left in each process’ address space, as required to allow user space to call into the kernel, and to enable the processor to give control to the kernel when dealing with interrupts or exceptions. این بخش آخری تا حدی جواب سؤالتون رو میده. کل کرنل معمولاً map نمیشه توی هر پروسس user space، ولی بخشی ازش به نحوی که بالا اشاره شده این اتفاق براش میافته. UPDATE: برای دقیقتر دیدن این مورد آخر کتابی که پایینتر معرفی کردم فصل مربوطهش رو بخونید.M
M سلام در ادامهی همون کتابی که میخوندم مبحث میرسه به Microkernels و توضیحش میده و اینا حالا سوال اینه که لینوکس یک کرنل گننندهست یا یک microkernel عه یا مثلا یه چیزی بینشون؟ 😁 مرسی @NerdProgrammerI M M I Link
clique para mostrarدرسته که tradeoff داره، ولی تا حالا تلاشی برای microkernel کردنش نشده؟ اصن میارزه؟ و یه سوال دیگه کتاب گفته توی میکروکرنل، سرورهای مختلف با یه سری message که میکروکرنل اونا رو جابجا میکنه با هم صحبت میکنن و interrupt هندل میکنن و اینا این مکانیزم توی لینوکس هم هست با اینکه مونولوتیک عه یا یجور دیگهش هست یا اصلا نیست؟ - نه. لینوکس داستانش البته بر میگرده به دوران Minix که Microkernel هم بود. اگر میخواست میکروکرنل انتخاب کنه، همون موقع اینکار رو میکرد. 👀 از همون اول Monolithic جلو رفت ولی. - نه. الان که به هیچوجه. اون موقع هم خیلی نه. میکروکرنل trade off پرفورمنس زیادی داره چون اکثر چیزها سمت user-space انجام میشه (عملاً سیر تا پیاز قضیه روی IPCئه) و هی باید context switch انجام بشه. در کنار همهی مزیتهایی که داره، همین یک مورد خیلی وقتا باعث میشه انتخاب اول نباشه. - مکانیزم لینوکس خیلی داستان داره... ولی نه مثل میکروکرنلها نیست. این بخشها رو IPC-محور توی لینوکس هندل نمیکنن. راحت میتونن call stack داشته باشن و دیتارو داخل خود kernel space رد و بدل کنن (یدونه روش هم نیست... چند روش واسه رد و بدل دیتا بین سابسیستمها هست) ولی اینطوری نیست که چند سرور مجزا توی user-space بیان message passing داشته باشن. برای میکروکرنل یک پروژهی جالبی هست که داکیومنت بدی هم نداره، یک نگاهی بندازید بهش بد نیست: https://www.redox-os.org/docs/ هنوز پرفورمنس جالبی نداره (فعلا توجهی هم البته به این موضوع نداشتن) ولی رویکرد رو میتونین ببینین.