Saya tertarik memodifikasi kernel internal, menerapkan tambalan, menangani driver perangkat dan modul, untuk kesenangan pribadi saya.
Apakah ada sumber daya komprehensif untuk peretasan kernel, yang ditujukan untuk programmer berpengalaman?
Saya tertarik memodifikasi kernel internal, menerapkan tambalan, menangani driver perangkat dan modul, untuk kesenangan pribadi saya.
Apakah ada sumber daya komprehensif untuk peretasan kernel, yang ditujukan untuk programmer berpengalaman?
Jawaban:
**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
+addSection: Kernel Virtualization Engine
KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.
Buku yang Direkomendasikan untuk Yang Tidak Diinisialisasi
void *i
"Laki-laki tidak mengerti buku sampai mereka memiliki kehidupan tertentu, atau setidaknya tidak ada orang yang mengerti buku yang dalam, sampai dia melihat dan hidup setidaknya sebagian dari isinya". –Ezra Pound
Perjalanan seribu kode-mil harus dimulai dengan satu langkah. Jika Anda bingung tentang buku-buku berikut ini, jangan khawatir, pilih salah satu dari pilihan Anda. Tidak semua yang berkeliaran hilang. Karena semua jalan akhirnya terhubung ke jalan raya , Anda akan menjelajahi hal-hal baru dalam perjalanan kernel Anda saat halaman berjalan tanpa menemui jalan buntu, dan akhirnya terhubung ke code-set
. Baca dengan pikiran sadar dan ingat: Kode bukan Sastra .
Apa yang tersisa bukanlah benda atau emosi atau gambar atau gambar mental atau memori atau bahkan sebuah ide. Itu adalah sebuah fungsi. Suatu proses semacam. Aspek Kehidupan yang bisa digambarkan sebagai fungsi dari sesuatu yang "lebih besar". Dan karena itu, tampaknya itu tidak benar-benar "terpisah" dari sesuatu yang lain. Seperti fungsi pisau - memotong sesuatu - pada kenyataannya, tidak terpisah dari pisau itu sendiri. Fungsi ini mungkin atau mungkin tidak digunakan saat ini, tetapi berpotensi TIDAK PERNAH terpisah.
Algoritma Solovay Strassen Derandomized untuk Uji Primality :
Baca untuk tidak bertentangan dan berselisih; atau untuk percaya dan menerima begitu saja; atau untuk menemukan pembicaraan dan wacana; tetapi untuk menimbang dan mempertimbangkan. Beberapa buku harus dicicipi, yang lain untuk ditelan, dan beberapa untuk dikunyah dan dicerna: yaitu, beberapa buku harus dibaca hanya dalam bagian-bagian, yang lain untuk dibaca, tetapi tidak ingin tahu, dan beberapa untuk dibaca seluruhnya , dan dengan ketekunan dan perhatian.
static void tasklet_hi_action(struct softirq_action *a)
{
struct tasklet_struct *list;
local_irq_disable();
list = __this_cpu_read(tasklet_hi_vec.head);
__this_cpu_write(tasklet_hi_vec.head, NULL);
__this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
local_irq_enable();
while (list) {
struct tasklet_struct *t = list;
list = list->next;
if (tasklet_trylock(t)) {
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED,
&t->state))
BUG();
t->func(t->data);
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
local_irq_disable();
t->next = NULL;
*__this_cpu_read(tasklet_hi_vec.tail) = t;
__this_cpu_write(tasklet_hi_vec.tail, &(t->next));
__raise_softirq_irqoff(HI_SOFTIRQ);
local_irq_enable();
}
}
Core Linux (5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)
“Alam tidak memiliki kernel atau shell; dia adalah segalanya sekaligus ”- Johann Wolfgang von Goethe
Pembaca harus berpengalaman dengan konsep sistem operasi ; pemahaman yang adil tentang proses yang berjalan lama dan perbedaannya dengan proses dengan ledakan eksekusi yang singkat; toleransi kesalahan saat memenuhi kendala real time lembut dan keras. Saat membaca, penting untuk memahami dan n/ack
pilihan desain yang dibuat oleh sumber kernel linux di subsistem inti.
Sinyal [dan] sinyal adalah jejak penderitaan, keputusasaan, horor, dan kegilaan yang bergantung pada platform (~ Anthony Baxte). Dikatakan bahwa Anda harus menjadi ahli C yang mengevaluasi diri, sebelum menyelam ke dalam kernel. Anda juga harus memiliki pengalaman yang baik dengan Linked Linked, Stacks, Antrian, Red Blacks Trees, Hash Functions, et al.
volatile int i;
int main(void)
{
int c;
for (i=0; i<3; i++) {
c = i&&&i;
printf("%d\n", c); /* find c */
}
return 0;
}
Keindahan dan seni dari sumber Kernel Linux terletak pada kebingungan kode yang disengaja yang digunakan bersama. Ini sering diperlukan untuk menyampaikan makna komputasi yang melibatkan dua atau lebih operasi dengan cara yang bersih dan elegan. Ini terutama benar ketika menulis kode untuk arsitektur multi-core.
Video Ceramah tentang Sistem Real-Time , Penjadwalan Tugas , Kompresi Memori , Memory Barriers , SMP
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
Driver Perangkat Linux (1 -> 2 -> 4 -> 3 -> 8 -> ...)
"Musik tidak membawa Anda. Anda harus membawanya dengan ketat dengan kemampuan Anda untuk benar-benar hanya fokus pada inti kecil emosi atau cerita". - Debbie Harry
Tugas Anda pada dasarnya adalah membuat antarmuka komunikasi berkecepatan tinggi antara perangkat keras dan kernel perangkat lunak. Anda harus membaca lembar data / manual referensi perangkat keras untuk memahami perilaku perangkat dan kontrol serta status datanya dan menyediakan saluran fisik. Pengetahuan tentang Majelis untuk arsitektur khusus Anda dan pengetahuan yang adil tentang VLSI Hardware Deskripsi Bahasa seperti VHDL atau Verilog akan membantu Anda dalam jangka panjang.
T : Tapi, mengapa saya harus membaca spesifikasi perangkat keras?
A : Karena, "Ada jurang karbon dan silikon yang tidak dapat dijembatani oleh perangkat lunak" - Rahul Sonnad
Namun, hal di atas tidak menimbulkan masalah bagi Algoritma Komputasi ( kode driver - pemrosesan setengah-bawah ), karena dapat sepenuhnya disimulasikan pada Mesin Universal Turing . Jika hasil yang dihitung berlaku di domain matematika , itu adalah kepastian bahwa itu juga berlaku di domain fisik .
Video Ceramah tentang Driver Perangkat Linux (Lec. 17 & 18), Anatomi Driver KMS Tertanam , Kontrol Pin dan Pembaruan GPIO , Kerangka Jam Umum , Tulis Driver Linux Nyata - Greg KH
static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
struct phy_device *phydev = phy_dat;
if (PHY_HALTED == phydev->state)
return IRQ_NONE; /* It can't be ours. */
/* The MDIO bus is not allowed to be written in interrupt
* context, so we need to disable the irq here. A work
* queue will write the PHY to disable and clear the
* interrupt, and then reenable the irq line.
*/
disable_irq_nosync(irq);
atomic_inc(&phydev->irq_disable);
queue_work(system_power_efficient_wq, &phydev->phy_queue);
return IRQ_HANDLED;
}
Kernel Networking (1 -> 2 -> 3 -> ...)
“Sebut saja klan, sebut saja jaringan, sebut itu suku, sebut saja keluarga: Apa pun Anda menyebutnya, siapa pun Anda, Anda memerlukannya.” - Jane Howard
Memahami paket walk-through di kernel adalah kunci untuk memahami jaringan kernel. Memahami itu adalah suatu keharusan jika kita ingin memahami Netfilter atau IPSec internal, dan banyak lagi. Dua struktur paling penting dari lapisan jaringan kernel linux adalah: struct sk_buff
danstruct net_device
static inline int sk_hashed(const struct sock *sk)
{
return !sk_unhashed(sk);
}
Kernel Debugging (1 -> 4 -> 9 -> ...)
Kecuali dalam berkomunikasi dengannya seseorang mengatakan dengan tepat apa yang dimaksud seseorang, masalah pasti akan terjadi. ~ Alan Turing, tentang komputer
Brian W. Kernighan, dalam makalah Unix for Beginners (1979) mengatakan, "Alat debugging yang paling efektif masih dipikirkan dengan cermat, ditambah dengan pernyataan cetak yang ditempatkan dengan bijaksana". Mengetahui apa yang harus dikumpulkan akan membantu Anda mendapatkan data yang tepat dengan cepat untuk diagnosis cepat. Ilmuwan komputer yang hebat Edsger Dijkstra pernah mengatakan bahwa pengujian dapat menunjukkan keberadaan bug tetapi tidak adanya mereka. Praktik investigasi yang baik harus menyeimbangkan kebutuhan untuk menyelesaikan masalah dengan cepat, kebutuhan untuk membangun keterampilan Anda, dan penggunaan ahli materi pelajaran yang efektif.
Ada saat-saat Anda mencapai titik terendah, sepertinya tidak ada yang berhasil dan Anda kehabisan semua opsi Anda. Kemudian debugging yang sebenarnya dimulai. Bug mungkin memberikan istirahat yang Anda butuhkan untuk melepaskan diri dari fiksasi pada solusi yang tidak efektif.
Video Ceramah tentang Kernel Debug dan Profiling , Analisis Core Dump , Debugging Multicore dengan GDB , Mengontrol Kondisi Ras Multi-Core , Debugging Electronics
/* Buggy Code -- Stack frame problem
* If you require information, do not free memory containing the information
*/
char *initialize() {
char string[80];
char* ptr = string;
return ptr;
}
int main() {
char *myval = initialize();
do_something_with(myval);
}
/* “When debugging, novices insert corrective code; experts remove defective code.”
* – Richard Pattis
#if DEBUG
printk("The above can be considered as Development and Review in Industrial Practises");
#endif
*/
Sistem File (1 -> 2 -> 6 -> ...)
"Saya ingin memiliki memori virtual, setidaknya karena digabungkan dengan sistem file". - Ken Thompson
Pada sistem UNIX, semuanya adalah file; jika sesuatu bukan file, itu adalah proses, kecuali untuk pipa dan soket bernama. Dalam sistem file, file diwakili oleh inode
, semacam nomor seri yang berisi informasi tentang data aktual yang membentuk file. Linux Virtual File System VFS
menyimpan informasi dalam memori dari setiap sistem file saat terpasang dan digunakan. Banyak kehati-hatian harus diambil untuk memperbarui sistem file dengan benar karena data di dalam cache ini dimodifikasi ketika file dan direktori dibuat, ditulis dan dihapus. Cache yang paling penting adalah Buffer Cache, yang terintegrasi ke dalam cara masing-masing sistem file mengakses perangkat penyimpanan blok yang mendasarinya.
Video Ceramah tentang Sistem Penyimpanan , Sistem File Flash Friendly
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
struct open_flags op;
int fd = build_open_flags(flags, mode, &op);
struct filename *tmp;
if (fd)
return fd;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
fd_install(fd, f);
}
}
putname(tmp);
return fd;
}
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE;
return do_sys_open(AT_FDCWD, filename, flags, mode);
}
Keamanan (1 -> 2 -> 8 -> 4 -> 3 -> ...)
"UNIX tidak dirancang untuk menghentikan penggunanya dari melakukan hal-hal bodoh, karena itu juga akan menghentikan mereka dari melakukan hal-hal yang pintar". - Doug Gwyn
Tidak ada teknik yang berfungsi jika tidak digunakan. Etika berubah dengan teknologi.
" F × S = k " produk kebebasan dan keamanan adalah konstan. - Hukum Niven
Kriptografi membentuk dasar kepercayaan online. Peretasan mengeksploitasi kontrol keamanan baik dalam elemen teknis, fisik atau berbasis manusia. Melindungi kernel dari program lain yang sedang berjalan adalah langkah pertama menuju sistem yang aman dan stabil, tetapi ini jelas tidak cukup: beberapa tingkat perlindungan harus ada di antara berbagai aplikasi pengguna lahan. Eksploitasi dapat menargetkan layanan lokal atau jarak jauh.
"Kamu tidak bisa meretas nasibmu, brute force ... kamu butuh pintu belakang, saluran samping ke dalam Life." - Clyde Dsouza
Komputer tidak memecahkan masalah, mereka menjalankan solusi. Di balik setiap kode algoritmik non-deterministik , ada pikiran yang ditentukan . - / var / log / dmesg
Video Ceramah tentang Kriptografi dan Keamanan Jaringan , Ruang Nama untuk Keamanan , Perlindungan Terhadap Serangan Jarak Jauh , Secure Embedded Linux
env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
Sumber Kernel (0.11 -> 2.4 -> 2.6 -> 3.18)
"Seperti anggur, penguasaan pemrograman kernel matang seiring waktu. Tetapi, tidak seperti anggur, prosesnya menjadi lebih manis dalam proses". - Hukum Mucheka
Anda mungkin tidak berpikir bahwa programmer adalah seniman, tetapi pemrograman adalah profesi yang sangat kreatif. Ini kreativitas berbasis logika. Pendidikan ilmu komputer tidak dapat membuat siapa pun menjadi programmer ahli seperti mempelajari kuas dan pigmen dapat membuat seseorang menjadi pelukis ahli. Seperti yang sudah Anda ketahui, ada perbedaan antara mengetahui jalan dan berjalan di jalan; itu sangat penting untuk menyingsingkan lengan baju Anda dan membuat tangan Anda kotor dengan kode sumber kernel. Akhirnya, dengan pengetahuan kernel yang Anda peroleh , ke mana pun Anda pergi, Anda akan bersinar .
Peniru yang tidak dewasa meniru; coders dewasa mencuri; coders yang buruk merusak apa yang mereka ambil, dan coders yang baik membuatnya menjadi sesuatu yang lebih baik, atau setidaknya sesuatu yang berbeda. Coder yang baik mengelas pencuriannya ke dalam seluruh perasaan yang unik, sangat berbeda dari yang darinya robek.
Video Ceramah tentang Resep Kernel
linux-0.11
├── boot
│ ├── bootsect.s head.s setup.s
├── fs
│ ├── bitmap.c block_dev.c buffer.c char_dev.c exec.c
│ ├── fcntl.c file_dev.c file_table.c inode.c ioctl.c
│ ├── namei.c open.c pipe.c read_write.c
│ ├── stat.c super.c truncate.c
├── include
│ ├── a.out.h const.h ctype.h errno.h fcntl.h
│ ├── signal.h stdarg.h stddef.h string.h termios.h
│ ├── time.h unistd.h utime.h
│ ├── asm
│ │ ├── io.h memory.h segment.h system.h
│ ├── linux
│ │ ├── config.h fdreg.h fs.h hdreg.h head.h
│ │ ├── kernel.h mm.h sched.h sys.h tty.h
│ ├── sys
│ │ ├── stat.h times.h types.h utsname.h wait.h
├── init
│ └── main.c
├── kernel
│ ├── asm.s exit.c fork.c mktime.c panic.c
│ ├── printk.c sched.c signal.c sys.c system_calls.s
│ ├── traps.c vsprintf.c
│ ├── blk_drv
│ │ ├── blk.h floppy.c hd.c ll_rw_blk.c ramdisk.c
│ ├── chr_drv
│ │ ├── console.c keyboard.S rs_io.s
│ │ ├── serial.c tty_io.c tty_ioctl.c
│ ├── math
│ │ ├── math_emulate.c
├── lib
│ ├── close.c ctype.c dup.c errno.c execve.c _exit.c
│ ├── malloc.c open.c setsid.c string.c wait.c write.c
├── Makefile
├── mm
│ ├── memory.c page.s
└── tools
└── build.c
Linux_source_dir/Documentation/*
Linux Kernel Newbies adalah sumber yang bagus.
Saya sarankan Anda membaca " Linux Kernel in a Nutshell ", oleh Greg Kroah-Hartman dan " Understanding the Linux Kernel ", oleh Robert Love. Harus dibaca :)
Linux Device Drivers adalah sumber yang bagus. Itu akan memberi Anda cara lain untuk masuk ke pekerjaan batin. Dari kata pengantar:
Di permukaan, ini adalah buku tentang menulis driver perangkat untuk sistem Linux. Itu adalah tujuan yang layak, tentu saja; aliran produk perangkat keras baru kemungkinan tidak akan melambat dalam waktu dekat, dan seseorang harus membuat semua gadget baru itu bekerja dengan Linux. Tetapi buku ini juga tentang bagaimana kernel Linux bekerja dan bagaimana menyesuaikan kerjanya dengan kebutuhan atau minat Anda. Linux adalah sistem terbuka; dengan buku ini, kami berharap, buku ini lebih terbuka dan dapat diakses oleh komunitas pengembang yang lebih besar.
Lihat Proyek Dokumentasi Linux . Terutama "panduan modul Kernel Linux".
Linux Kernel 2.4 Internal adalah sumber online lain untuk dilihat. Tampaknya mengambil pendekatan 'ground up' yang cantik, dimulai dengan booting. Di sini TOC:
Dan, untuk membuatnya lebih manis, ada Linux Kernel Development Edisi Ketiga oleh Robert Love out dan Slashdot memiliki ulasan.
Mulai dengan Linux Kernel Primer oleh Claudia Salzberg et al. Bagus untuk memulai dengan untuk pemula. Buku Robert Love jelas bukan buku yang harus dimulai oleh pemula. Buku terakhir berada di atas tingkat menengah.