yassersajjadi
جمعه 06 بهمن 1391, 20:12 عصر
سلام
تو کرنلی که دارم مینویسم رسیدم به قسمت مدیریت حافظه و تخصیص دادن حافظه و ایجاد کردن heap ها و block ها .
من اومدم یه struct ایجاد کردم که شامل چندین عضو هست مثل
start
size
state
readonly
بعد اومدم این از این ساختار یه ارایه درست کردم که تعدادش بستگی به فضایی داره که میخوایم heap ایجاد کنیم مثلا
start_heap = 0x8000000
length_heap=0x100000
unit_heap = 0x8
nheap = (length_heap/unit_heap)
که nheap همون تعداد آرایه های ما هست
حالا وقتی که میخوام یه block درست کنم میام واسه اندازه ای که نیاز دارم تعداد آرایه های لازم رو بدست میارم
وهمون تعداد آرایه رو میگردم و اونهایی که state اونها صفر هست رو پیدا میکنم ( البته اونها باید پشت سر هم باشن) و اولین خونه رو start و آخرین خونه رو هم start , size ش رو بدست میارم و اونوقت یه block با مشخصات
start1
end_block = start2 + size
ایجاد میکنم و state اون ارایه ها هم ۱ میشن
به این صورت به هر داده یک مقدار مشخص و بزرگتر مساوی اون داده اختصاص داده میشه و دیگه hole های خیلی کوچک ایجاد نمیشه
از این راه برای اختصاص دادن حافظه استفاده کردم
ولی موقعی که چندین kmalloc استفاده میکنم دیگه نمیتونم کرنل رو لود کنم و این ارور رو میده
em@ubuntu:~/Public/EX$ qemu-system-i386 -kernel kernel.o
Could not access KVM kernel module: No such file or directory
failed to initialize KVM: No such file or directory
Back to tcg accelerator.
(process:2905): GLib-ERROR **: /build/buildd/glib2.0-2.32.1/./glib/gmem.c:165: failed to allocate 18446744073709532160 bytes
Trace/breakpoint trap (core dumped)
تو کرنلی که دارم مینویسم رسیدم به قسمت مدیریت حافظه و تخصیص دادن حافظه و ایجاد کردن heap ها و block ها .
من اومدم یه struct ایجاد کردم که شامل چندین عضو هست مثل
start
size
state
readonly
بعد اومدم این از این ساختار یه ارایه درست کردم که تعدادش بستگی به فضایی داره که میخوایم heap ایجاد کنیم مثلا
start_heap = 0x8000000
length_heap=0x100000
unit_heap = 0x8
nheap = (length_heap/unit_heap)
که nheap همون تعداد آرایه های ما هست
حالا وقتی که میخوام یه block درست کنم میام واسه اندازه ای که نیاز دارم تعداد آرایه های لازم رو بدست میارم
وهمون تعداد آرایه رو میگردم و اونهایی که state اونها صفر هست رو پیدا میکنم ( البته اونها باید پشت سر هم باشن) و اولین خونه رو start و آخرین خونه رو هم start , size ش رو بدست میارم و اونوقت یه block با مشخصات
start1
end_block = start2 + size
ایجاد میکنم و state اون ارایه ها هم ۱ میشن
به این صورت به هر داده یک مقدار مشخص و بزرگتر مساوی اون داده اختصاص داده میشه و دیگه hole های خیلی کوچک ایجاد نمیشه
از این راه برای اختصاص دادن حافظه استفاده کردم
ولی موقعی که چندین kmalloc استفاده میکنم دیگه نمیتونم کرنل رو لود کنم و این ارور رو میده
em@ubuntu:~/Public/EX$ qemu-system-i386 -kernel kernel.o
Could not access KVM kernel module: No such file or directory
failed to initialize KVM: No such file or directory
Back to tcg accelerator.
(process:2905): GLib-ERROR **: /build/buildd/glib2.0-2.32.1/./glib/gmem.c:165: failed to allocate 18446744073709532160 bytes
Trace/breakpoint trap (core dumped)