Saya sudah menemukan tutorial Baking Pi , tetapi mereka hanya menggunakan bahasa assembly . Saya mengikuti pelajaran pertama, tetapi saya sudah bertanya-tanya bagaimana cara menggunakan C sebagai gantinya. Maksud saya, ada alasan mengapa mereka menciptakan bahasa tingkat tinggi. Saya mencoba mengkompilasi kode C ke .o
file object ( ), mengkompilasi
.section .init
.globl _start
_start:
bl main
loop$:
b loop$
ke file objek lain dan menautkannya bersama sehingga memperoleh kernel.img
. Saya kemudian mengganti kernel yang sudah ada dengan kernel saya sendiri, tetapi tidak menjalankan kode C. Kode C yang saya tulis harus menyalakan OK LED dan kemudian kembali (kemudian muncul loop$: b loop$
). Tetapi LED OK berkedip secara acak beberapa kali dan kemudian mati. Ini kode C saya:
int main(int argc, char ** argv) {
volatile unsigned *gpioAddr = (volatile unsigned *)0x20200000;
*(gpioAddr + 4) = 1 << 18;
*(gpioAddr + 40) = 1 << 16;
return 0;
}
Bagaimana cara saya menggunakan C untuk pengembangan sistem operasi pada Raspberry Pi?
Saya ragu itu adalah kesalahan dalam kode (meskipun saya hanya penggemar). Saya sadar mengatur C mungkin rumit, tetapi saya bukan yang pertama melakukan ini. AFAIK, semua OS yang dominan saat ini kebanyakan ditulis dalam C, jadi harus ada artikel yang menjelaskan prosesnya. Saya akan sangat senang dengan daftar langkah juga, jadi saya bisa google untuk langkah-langkah itu dan mungkin mengajukan pertanyaan yang sedikit kurang luas.
Catatan: rakitan ARM yang setara dengan kode C di atas berfungsi dengan baik. Menyalakan LED (setelah sedikit berkedip). Saya pikir (harapan) yang menunjukkan Raspberry Pi saya baik-baik saja.
sumber
Jawaban:
Saya menulis kernel yang sangat sederhana bertahun-tahun yang lalu, dan menjalankannya pada 386. Saya belum pernah melakukan pemrograman bare metal selama bertahun-tahun, tetapi secara umum Anda perlu menulis beberapa kode assembler yang akan:
Menyiapkan tumpukan itu mudah - temukan beberapa memori yang tidak digunakan, dan muat alamat yang pernah digunakan sebagai penunjuk tumpukan.
Dalam kode C Anda, Anda perlu init struktur data OS seperti kumpulan memori dan tabel utas. Anda tidak akan dapat menggunakan fungsi C library - Anda harus menulis sendiri hal itu.
Jika Anda ingin menulis os multitugas sederhana, Anda harus menulis beberapa rutin assembler untuk menyimpan register CPU di stack, dan memuat serangkaian nilai register yang berbeda dari stack thread lain. Dan Anda harus menulis API untuk membuat utas berbeda.
sumber
Saya belum melihat kode Anda secara mendalam, tetapi bagi saya Anda berada di jalur yang benar. Pastikan bahwa:
_start
simbol memang yang digunakan saat kompilasi & menghubungkan berkas perakitan dan file C Anda (dan yangmain()
tidak digunakan sebagai gantinya)main()
, Anda harus menggunakan konvensi pemanggilan C:return
pernyataan dalam C)int main() { ... }
objdump -S main.o
) dan lihat bagaimana ia memanipulasi tumpukan.loop$
.The pengembangan sistem operasi wiki akan menjadi ressource sangat berguna - itu terutama berkaitan dengan pengembangan x86 tetapi informasi yang paling masih berlaku untuk pi raspberry.
Beberapa sumber spesifik raspberry-pi osdev lainnya:
kernel.img
tendangan Anda dimulai.kernel.img
dieksekusi.sumber
Masalah utama yang mungkin Anda temui adalah C library dan kode prolog. Itu dimulai sebelum kode Anda sendiri mulai mengeksekusi dan mengatur tumpukan, tumpukan dan melakukan banyak hal bermanfaat lainnya. Namun, ketika Anda mencoba memprogram untuk bare metal Anda tidak memiliki OS yang berjalan di bawah Anda dan Anda sebaiknya menghindari memanggil fungsi-fungsi ini. Untuk melakukan itu, Anda memerlukan versi perpustakaan C yang dimodifikasi dan / atau beberapa simbol global yang didefinisikan atau diganti dengan milik Anda. Proses ini sedikit melibatkan, itu sebabnya orang 'Baking Pi' memilih untuk menggunakan perakitan untuk tutorial mereka.
sumber
Coba ini sebagai gantinya:
http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/
Juga, pengalaman x86 sedikit berbeda. Ini mungkin berlaku untuk pemrograman OS telanjang logam ARM umum. Tapi untuk Pi, maaf itu gpu start dulu dan mengatur sedikit sebelum kode OS (?) Anda.
sumber
s-matyukevich/raspberry-pi-os
https://github.com/s-matyukevich/raspberry-pi-os
Repo yang luar biasa ini melakukan bootstrap C kedua, dan masuk ke topik yang cukup kompleks.
Lebih jauh lagi, ia melihat bagaimana kernel Linux melakukan sesuatu, dan membubuhi keterangan kode kernel Linux.
Lihatlah tutorial pertama untuk pengaturan minimalis: https://github.com/s-matyukevich/raspberry-pi-os/tree/43f682d406c8fc08736ca3edd08a1c8e477c72b0/src/lesson01/src
Saya sangat merekomendasikannya.
sumber