ورود

View Full Version : سوال: لود کرنل لینوکس



tanzadeh7
شنبه 11 مرداد 1393, 10:50 صبح
سلام من دارم یه سیستم عامل برپایه لینوکس مینویسم میخوام از دسکتاپ gnome-shell و کرنل لینوکس استفاده کنم تا حالا یک بوت سکتور در اسمبلی نوشتم و میخوام باهاش کرنل لینوکس 3.15.5 لود کنم چجوری باید این کار رو انجام بدم آیا کرنل لینوکس یک فایل main داره که اونو یه بوت سکتورم لینک کنم یا باید یه کار دیگه انجام بدم لطفا جواب بدید


کد بوت سکتور


;================================================= =================
;NS_OS Developers
;================================================= =================


BITS 16

jmp short bootloader_start
nop



OEMLabel db "TINKERBOOT"
BytesPerSector dw 512
SectorsPerCluster db 1
ReservedForBoot dw 1
NumberOfFats db 2
RootDirEntries dw 224

LogicalSectors dw 2880
MediumByte db 0F0h
SectorsPerFat dw 9
SectorsPerTrack dw 18
Sides dw 2
HiddenSectors dd 0
LargeSectors dd 0
DriveNo dw 0
Signature db 41
VolumeID dd 00000000h
VolumeLabel db "NS_OS "
FileSystem db "FAT12 "


; ------------------------------------------------------------------
; Main bootloader code

bootloader_start:
mov ax, 07C0h
add ax, 544
cli
mov ss, ax
mov sp, 4096
sti

mov ax, 07C0h
mov ds, ax



mov byte [bootdev], dl

mov eax, 0



floppy_ok:
mov ax, 19
call l2hts

mov si, buffer
mov bx, ds
mov es, bx
mov bx, si

mov ah, 2
mov al, 14

pusha


read_root_dir:
popa
pusha

stc
int 13h

jnc search_dir
call reset_floppy
jnc read_root_dir

jmp reboot


search_dir:
popa

mov ax, ds
mov es, ax
mov di, buffer

mov cx, word [RootDirEntries]
mov ax, 0


next_root_entry:
xchg cx, dx

mov si, kern_filename
mov cx, 11
rep cmpsb
je found_file_to_load

add ax, 32

mov di, buffer
add di, ax

xchg dx, cx
loop next_root_entry

mov si, file_not_found
call print_string
jmp reboot


found_file_to_load:
mov ax, word [es:di+0Fh]
mov word [cluster], ax

mov ax, 1
call l2hts

mov di, buffer
mov bx, di

mov ah, 2
mov al, 9

pusha


read_fat:
popa
pusha

stc
int 13h
jnc read_fat_ok
call reset_floppy
jnc read_fat

mov si, disk_error
call print_string
jmp reboot


read_fat_ok:
popa

mov ax, 2000h
mov es, ax
mov bx, 0

mov ah, 2
mov al, 1

push ax


load_file_sector:
mov ax, word [cluster]
add ax, 31

call l2hts

mov ax, 2000h
mov es, ax
mov bx, word [pointer]

pop ax
push ax

stc
int 13h

jnc calculate_next_cluster

call reset_floppy
jmp load_file_sector


calculate_next_cluster:
mov ax, [cluster]
mov dx, 0
mov bx, 3
mul bx
mov bx, 2
div bx
mov si, buffer
add si, ax
mov ax, word [ds:si]

or dx, dx

jz even


odd:
shr ax, 4
jmp short next_cluster_cont


even:
and ax, 0FFFh

next_cluster_cont:
mov word [cluster], ax
cmp ax, 0FF8h
jae end

add word [pointer], 512
jmp load_file_sector


end:
pop ax
mov dl, byte [bootdev]

jmp 2000h:0000h


; ------------------------------------------------------------------
; BOOTLOADER SUBROUTINES

reboot:
mov ax, 0
int 16h
mov ax, 0
int 19h


print_string:
pusha

mov ah, 0Eh
.repeat:
lodsb
cmp al, 0
je .done
int 10h
jmp short .repeat

.done:
popa
ret


reset_floppy:
push ax
push dx
mov ax, 0
mov dl, byte [bootdev]
stc
int 13h
pop dx
pop ax
ret


l2hts:

push bx
push ax

mov bx, ax

mov dx, 0
div word [SectorsPerTrack]
add dl, 01h
mov cl, dl
mov ax, bx

mov dx, 0
div word [SectorsPerTrack]
mov dx, 0
div word [Sides]
mov dh, dl ;e
mov ch, al

pop ax
pop bx

mov dl, byte [bootdev] ; Set correct device

ret


; ------------------------------------------------------------------
; STRINGS AND VARIABLES

kern_filename db "KERNEL BIN" ; این کرنل hello word که تو C نوشتم

disk_error db "Floppy error! Press any key...", 0
file_not_found db "kernel not found!", 0

bootdev db 0
cluster dw 0
pointer dw 0


; ------------------------------------------------------------------
; END OF BOOT SECTOR AND BUFFER START

times 510-($-$$) db 0
dw 0AA55h


buffer:

; ================================================== ================

احسان!
شنبه 11 مرداد 1393, 13:38 عصر
منظورتون از بوت سکتور همون بوت لودره؟اگه بله!چرا از بوت لودر های موجود مثل گراب استفاده نمیکنید؟

tanzadeh7
شنبه 11 مرداد 1393, 14:51 عصر
منظورتون از بوت سکتور همون بوت لودره؟

اره همون بوت لودر


چرا از بوت لودر های موجود مثل گراب استفاده نمیکنید؟
من میخوام بوت لودر رو خودم نوشته باشم و فقط از هسته لینوکس استفاده کنم مثل اندروید:لبخند:

یه سوا دیگه هم برام پیش اومده gnome-shell از کجا شروع میشه یعنی main اون کجاست

احسان!
شنبه 11 مرداد 1393, 21:46 عصر
اره همون بوت لودر


من میخوام بوت لودر رو خودم نوشته باشم و فقط از هسته لینوکس استفاده کنم مثل اندروید:لبخند:

یه سوا دیگه هم برام پیش اومده gnome-shell از کجا شروع میشه یعنی main اون کجاست

جریان اندروید کلا جدا هستش.(با این روش نمیشه.)
منظورتون رو از اینکه گنوم شل از کجا شروع میشه متوجه نمیشم.گنوم شل رو دیگه خود لینوکس اجرا میکنه.در واقع محیط گرافیکی جدا هستش.;)

به هر حال اگر میخواید یه توزیع لینوکس از پایه بسازید(و نه ریمیستر) باید اطلاعات بیشتری داشته باشید،میتونید کتاب LFS رو مطالعه کنید.

tanzadeh7
یک شنبه 12 مرداد 1393, 15:36 عصر
جریان اندروید کلا جدا هستش.(با این روش نمیشه.)
منظورتون رو از اینکه گنوم شل از کجا شروع میشه متوجه نمیشم.گنوم شل رو دیگه خود لینوکس اجرا میکنه.در واقع محیط گرافیکی جدا هستش.;)

به هر حال اگر میخواید یه توزیع لینوکس از پایه بسازید(و نه ریمیستر) باید اطلاعات بیشتری داشته باشید،میتونید کتاب LFS رو مطالعه کنید.

ساخت توزیع گنو/لیتوکس کار خیلی سختی نیست میخوام یه چیز سخت تر باشه یعنی فرمت خاص خودش رو شناسایی کنه و نرم افزار های لینوکس روش نصب نشه قبلم گفتم یه چیزی شبیه اندروید

pswin.pooya
سه شنبه 14 مرداد 1393, 13:38 عصر
برای اینکار باید خیلی بیشتر ار اینها اطلاعات داشته باشید.

مورد اول اینه که بوت لودر باید مولتی بوت باشه تا بتونه هسته‌ ( و نه گنوم) رو لود کنه. و بعد با کد بوت لودر بالا زیاد نمی تونید پیش برید. الان قضیه بوت لودرها به مراتب پیچیده تر از کدهای بالا هست.


ساخت توزیع گنو/لیتوکس کار خیلی سختی نیست میخوام یه چیز سخت تر باشه یعنی فرمت خاص خودش رو شناسایی کنه و نرم افزار های لینوکس روش نصب نشه قبلم گفتم یه چیزی شبیه اندروید
برای اینکار پلان خاصی دارید؟ یا طرح اولیه ای توی ذهنتون هست؟ میدونید باید چی کار کنید؟


یه سوا دیگه هم برام پیش اومده gnome-shell از کجا شروع میشه یعنی main اون کجاست
۱. گنوم برنامه هست. نه هسته.
۲. شما نباید دنبال تابع main باشید اگر هم پیداش کنید به درتون نمی خوره.
۳. برای اجرای برنامه احتیاج به entry point برنامه هست نه تابع main. یکی از مسئولیتهای نقطه ورود فراخوانی تابع main ( در اکثر برنامه های C/C++ ) هست.

tanzadeh7
سه شنبه 14 مرداد 1393, 19:52 عصر
مورد اول اینه که بوت لودر باید مولتی بوت باشه تا بتونه هسته‌ ( و نه گنوم) رو لود کنه. و بعد با کد بوت لودر بالا زیاد نمی تونید پیش برید. الان قضیه بوت لودرها به مراتب پیچیده تر از کدهای بالا هست.


برای ساخت سیستم عامل موبایل فکر نکنم نیازی به مولتی پوت نیست.


۱. گنوم برنامه هست. نه هسته.
۲. شما نباید دنبال تابع main باشید اگر هم پیداش کنید به درتون نمی خوره.
۳. برای اجرای برنامه احتیاج به entry point برنامه هست نه تابع main. یکی از مسئولیتهای نقطه ورود فراخوانی تابع main ( در اکثر برنامه های C/C++‎ ) هست.

میدونم که گنوم نرم افزار است من میخوام از گنوم برای محیط گرافیکی استتفاده کنم.


چجوری باید linux kernel رو به حافظه لود کنم و از گنوم به عنوان محیط گرافیکی اون استفاده کنم

pswin.pooya
سه شنبه 14 مرداد 1393, 21:16 عصر
برای ساخت سیستم عامل موبایل فکر نکنم نیازی به مولتی پوت نیست.

میدونی مولتی بوت چیه؟!

tanzadeh7
سه شنبه 14 مرداد 1393, 21:49 عصر
میدونی مولتی بوت چیه؟!

یک روش برای داشتن چندین سیستم عامل بر روی یک کامپیوتر

pswin.pooya
سه شنبه 14 مرداد 1393, 22:22 عصر
یک روش برای داشتن چندین سیستم عامل بر روی یک کامپیوتر


نه، یه استاندارد برای بوت هسته هست که یکسری داده رو در اختیار هسته برای بوت شدن قرار میده. این استاندارد همچنین مواردی مثل فایلهای مورد نیاز هسته و ... رو قبل از اجرای هسته داخل حافظه قرار میده تا هسته بتونه از اونها استفاده کنه. که باعث میشه به شدت از پیچیدگی بوت هسته جلوگیری به عمل بیاد و البته کد هسته هم قابلیت پورت بیشتری رو پیدا کنه.

این استاندارد همچنین کمک میکنه که برای سیستم عاملهای مختلف تنها از یک بوت لودر بشه استفاده کرد.

هسته لینوکس و البته سیستم عاملهای زیادی با این روش بوت میشن.