Kendi kişisel eğlencem için çekirdeğin içindekileri değiştirmek, yamalar uygulamak, aygıt sürücülerini ve modülleri kullanmakla ilgileniyorum.
Deneyimli programcılara yönelik, çekirdek hackleme için kapsamlı bir kaynak var mı?
Kendi kişisel eğlencem için çekirdeğin içindekileri değiştirmek, yamalar uygulamak, aygıt sürücülerini ve modülleri kullanmakla ilgileniyorum.
Deneyimli programcılara yönelik, çekirdek hackleme için kapsamlı bir kaynak var mı?
Yanıtlar:
**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
+addSection: Kernel Virtualization Engine
KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.
Başlatılmamış için Önerilen Kitaplar
void *i
“Erkekler, belirli bir yaşama sahip olmadıkça veya hiçbir şekilde içeriğinin en azından bir kısmını görene ve yaşayana kadar hiçbir erkeğin derin bir kitabı anlayamadığı sürece kitapları anlamıyor”. –Ezra Lirası
Binlerce kilometre karelik bir yolculuk tek bir adımla başlamalıdır. Aşağıdaki kitaplardan hangisiyle başlayacağınız konusunda kafa karışıklığınız varsa, endişelenmeyin, dilediğiniz birini seçin. Başıboş dolanan herkes kaybolmuş değildir. Gibi bütün yollar nihayetinde karayolu bağlanmak , sayfaların herhangi çıkmaz toplantı olmadan ilerleme olarak çekirdek yolculukta yeni şeyler keşfetmek ve sonuçta bağlanacaktır code-set
. Dikkatle okuyun ve unutmayın: Kod, Edebiyat değildir .
Geriye kalan şey bir şey veya bir duygu ya da görüntü ya da zihinsel bir resim ya da bir hatıra ya da bir fikir değildir. Bu bir fonksiyondur. Bir çeşit süreç. Hayatın "daha büyük" bir şeyin işlevi olarak tanımlanabilecek bir yönü. Ve bu nedenle, bunun başka bir şeyden gerçekten "ayrı" olmadığı görülüyor. Bir bıçağın işlevi gibi - bir şeyi kesmek - aslında bıçağın kendisinden ayrı değildir. İşlev şu anda kullanımda olabilir veya olmayabilir, ancak ASLA potansiyel olarak ayrı değildir.
Solovay Strassen Asallık Testi için Derandomize Algoritması :
Çelişmemek ve kafa karıştırmamak için okuyun; ne inanmak, ne de kabullenmek; ne de konuşma ve söylem bulmak için; ama tartmak ve düşünmek. Bazı kitaplar tadılanacak, bazıları yutulacak ve bazıları da çiğnenecek ve sindirilecek: yani, bazı kitaplar yalnızca bölümler halinde okunacak, bazıları okunacak, meraklanmayacak ve bazıları da tamamen okunacak ve özenle ve dikkatle.
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();
}
}
Çekirdek Linux (5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)
“Doğanın çekirdeği ve kabuğu yoktur; o aynı anda her şeydir ”- Johann Wolfgang von Goethe
Okuyucu, işletim sistemi konseptleri konusunda iyi bilgilendirilmelidir ; uzun süren işlemlerin adil bir şekilde anlaşılması ve işlemlerin kısa süren patlamaları ile olan süreçleri; yumuşak ve zor gerçek zamanlı kısıtlamaları yerine getirirken hataya dayanıklılık. Okurken, n/ack
çekirdek alt sistemlerdeki linux çekirdek kaynağı tarafından yapılan tasarım seçimlerini anlamak önemlidir .
Konular [ve] sinyalleri platforma, umutsuzluğa, dehşete ve çılgınlığa (~ Anthony Baxte) platforma bağımlı bir izdir. Bu, çekirdeğe dalmadan önce kendi kendini değerlendiren bir C uzmanı olmanız gerektiği söyleniyor. Ayrıca Bağlantılı Listeler, Yığınlar, Kuyruklar, Kırmızı Siyah Ağaçlar, Hash Fonksiyonları ve ark.
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;
}
Linux Çekirdeği kaynağının güzelliği ve sanatı, birlikte kullanılan kasıtlı kod gizliliğinde yatmaktadır. Bu genellikle iki veya daha fazla işlemi içeren hesaplama anlamını temiz ve zarif bir şekilde iletmek için zorunludur. Bu, özellikle çok çekirdekli mimari için kod yazarken geçerlidir.
Gerçek Zamanlı Sistemlerde Video Anlatım , Görev Planlaması , Hafıza Sıkıştırma , Hafıza Engelleri , SMP
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
Linux Aygıt Sürücüleri (1 -> 2 -> 4 -> 3 -> 8 -> ...)
"Müzik sizi yanınızda taşımaz. Sadece küçük bir duygu ya da hikaye çekirdeğine odaklanma yeteneğinizle kesinlikle taşımanız gerekir." - Debbie Harry
Göreviniz temel olarak donanım aygıtı ile yazılım çekirdeği arasında yüksek hızlı bir iletişim arayüzü oluşturmaktır. Cihazın davranışını ve kontrol ve veri durumlarını ve fiziksel kanalları sağladığını anlamak için donanım referans veri sayfasını / el kitabını okumalısınız. Özel mimariniz için Montaj Bilgisi ve VLSI'nin adil bir bilgisi Donanım Tanımlama VHDL veya Verilog gibi diller uzun vadede size yardımcı olacaktır.
S : Peki neden donanım özelliklerini okumak zorundayım?
C : “Yazılımın köprüleyemediği bir karbon ve silikon uçağı var” - Rahul Sonnad
Bununla birlikte, yukarıdakiler Hesaplamalı Algoritmalar ( Sürücü kodu - alt yarı işleme ) için bir Universal Torna Tezgahında tamamen simüle edilebileceği için bir sorun yaratmaz . Hesaplanan sonuç matematiksel alanda doğruysa, fiziksel alanda da doğru olduğu kesindir .
Linux Aygıt Sürücüleri Üzerine Video Dersler (Bölüm 17 ve 18), Gömülü KMS Sürücüsünün Anatomisi , Pin Kontrolü ve GPIO Güncellemesi , Ortak Saat Çerçevesi , Gerçek Bir Linux Sürücüsü Yaz - 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;
}
Çekirdek Ağ İletişimi (1 -> 2 -> 3 -> ...)
“Bir klan çağır, bir ağ çağır, bir kabile çağır, bir aile de.
Çekirdekten bir paket geçişi anlamak, çekirdek ağını anlamada anahtardır. Netfilter veya IPSec internals ve daha fazlasını anlamak istiyorsak bunu anlamak şarttır. Linux çekirdeği ağ tabakasının en önemli iki yapılar şunlardır: struct sk_buff
vestruct net_device
static inline int sk_hashed(const struct sock *sk)
{
return !sk_unhashed(sk);
}
Çekirdek Hata Ayıklama (1 -> 4 -> 9 -> ...)
Onunla iletişim kurarken, biri tam olarak ne anlama geldiğini söylemediği sürece, sorun ortaya çıkmaya zorlanır. ~ Alan Turing, bilgisayarlar hakkında
Brian W. Kernighan, Yeni Başlayanlar için Unix gazetesinde (1979), "En etkili hata ayıklama aracı hala dikkatli bir şekilde düşünülmüş, akıllıca yerleştirilmiş baskı ifadeleriyle birleşti" dedi. Neyin toplanacağını bilmek, hızlı bir teşhis için doğru verileri hızlıca almanıza yardımcı olacaktır. Büyük bilgisayar bilimcisi Edsger Dijkstra, bir keresinde, testin böceklerin varlığını gösterebildiğini ancak bulunmadıklarını gösterebileceğini söyledi. İyi soruşturma uygulamaları sorunları hızlı bir şekilde çözme ihtiyacını, becerilerinizi geliştirme ihtiyacını ve konu uzmanlarının etkin kullanımını dengelemelidir.
En dibe vurduğun zamanlar vardır, hiçbir şey işe yaramaz ve tüm seçeneklerinden biter. O zaman gerçek hata ayıklama başlar. Bir hata, etkisiz çözümdeki bir tespitten ayrılmanız gereken molayı sağlayabilir.
Video Dersler Çekirdek Debug ve Profil Oluşturma üzerinde , Çekirdek Analizi dökümü , GDB bulunan çok Debugging , denetleme Çok Çekirdekli yarışı Koşullar , hata ayıklama Elektronik
/* 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
*/
Dosya Sistemleri (1 -> 2 -> 6 -> ...)
"En azından dosya sistemlerinde olduğu gibi sanal belleğe sahip olmak istedim". - Ken Thompson
Bir UNIX sisteminde, her şey bir dosyadır; eğer bir şey bir dosya değilse, adlandırılmış boru ve soketler dışında bir işlemdir. Bir dosya sisteminde, bir dosya, dosyayı inode
oluşturan asıl verilerle ilgili bilgileri içeren bir tür seri numarası ile temsil edilir . Linux Sanal Dosya Sistemi VFS
, her dosya sistemindeki bellekteki bilgileri bağlandığı ve kullanıldığı gibi önbelleğe alır. Dosya sistemini doğru bir şekilde güncellemek için çok özen gösterilmelidir; çünkü bu önbellekler içindeki veriler dosyalar ve dizinler oluşturulur, yazılır ve silinir. Bu önbelleklerin en önemlisi, bireysel dosya sistemlerinin temel blok depolama aygıtlarına erişme biçimine entegre edilmiş olan Tampon Önbelleğidir.
Depolama Sistemlerinde Video Dersleri , Flash Dostu Dosya Sistemi
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);
}
Güvenlik (1 -> 2 -> 8 -> 4 -> 3 -> ...)
“UNIX, kullanıcılarının aptalca şeyler yapmalarını engellemek için tasarlanmadı; - Doug Gwyn
Kullanılmadığı takdirde hiçbir teknik çalışmaz. Etik teknolojiyle değişiyor.
" F × S = k " özgürlük ve güvenlik ürünü sabittir. - Niven Yasası
Şifreleme çevrimiçi güven temeli oluşturur. Hacking, güvenlik kontrollerini teknik, fiziksel veya insani temelli bir elementte kullanmaktır. Çekirdeği diğer çalışan programlardan korumak, güvenli ve kararlı bir sisteme atılan ilk adımdır, ancak bu açıkça yeterli değildir: farklı kullanıcı-arazi uygulamaları arasında da bir derece koruma mevcut olmalıdır. İstismarlar yerel veya uzaktaki hizmetleri hedefleyebilir.
“Kaderini, kaba kuvvetini kıramazsın ... bir arka kapıya, Yaşam için bir yan kanala ihtiyacın var.” - Clyde Dsouza
Bilgisayarlar sorunları çözmezler, çözümler yürütürler. Deterministik olmayan her algoritmik kodun arkasında kararlı bir zihin vardır. - / var / log / dmesg
Video Dersler Kriptografi ve Ağ Güvenliği , Güvenlik Ad alanları , Uzaktan Saldırıları Karşı Koruma , Güvenli Gömülü Linux
env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
Çekirdek Kaynağı (0.11 -> 2.4 -> 2.6 -> 3.18)
"Şarap gibi, çekirdek programlama ustalığı zamanla olgunlaşır. Ancak, şaraptan farklı olarak süreçte daha da güzelleşir". --Lawrence Mucheka
Programcıların sanatçı olduğunu düşünmeyebilirsiniz, ancak programlama son derece yaratıcı bir meslektir. Mantık temelli yaratıcılık. Bilgisayar bilimi eğitimi kimseyi uzman programcı yapamaz, fırçaları incelemek ve pigment birini uzman ressam yapamaz. Zaten bildiğiniz gibi, yolu bilmek ve yolu yürümek arasında bir fark vardır; kolları çekip almak ve çekirdek kaynak koduyla ellerinizi kirletmek çok önemlidir. Sonunda, böylece kazandığınız çekirdek bilginizle nereye giderseniz gidin parlayacaksınız .
Olgunlaşmamış kodlayıcılar taklit eder; olgun kodlayıcılar çalmak; kötü kodlayıcılar aldıklarını engeller ve iyi kodlayıcılar daha iyi veya en azından farklı bir şey haline getirir. İyi kodlayıcı, hırsızlığını, benzersiz, tamamen yırtılmış olandan tamamen farklı bir duyguya dönüştürür.
Çekirdek Tarifler Üzerine Video Dersler
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 harika bir kaynaktır.
Greg Kroah-Hartman ve " Linux Çekirdeğini Anlama " yazısını Robert Love'dan " Kısaca Linux Çekirdeğini " okumanızı öneririm . Okumalısınız :)
Linux Aygıt Sürücüleri başka iyi bir kaynaktır. İçsel çalışmalara girmeniz için başka bir yol sağlar. Önsözden:
Bu, yüzeyde, Linux sistemi için aygıt sürücüleri yazma hakkında bir kitap. Tabii ki bu değerli bir amaçtır; Yeni donanım ürünlerinin akışının yakında herhangi bir zamanda yavaşlaması beklenmiyor ve birileri bu yeni cihazların Linux ile çalışmasını sağlamak zorunda kalacak. Fakat bu kitap aynı zamanda Linux çekirdeğinin nasıl çalıştığı ve çalışmalarını ihtiyaçlarınıza veya ilgi alanlarınıza göre nasıl uyarlayabileceğinizle de ilgili. Linux açık bir sistemdir; Bu kitapla daha büyük bir geliştirici topluluğunun daha açık ve erişilebilir olmasını umuyoruz.
Bkz Linux Belgelendirme Projesi . Özellikle "Linux Çekirdek modül kılavuzu".
Linux Çekirdeği 2.4 Internals , bakmak için başka bir çevrimiçi kaynaktır. Önyükleme ile başlayan, oldukça 'temel' bir yaklaşım izliyor gibi görünüyor. İşte TOK:
Ve daha da tatlı hale getirmek için, Robert Love out tarafından yeni bir Linux Çekirdek Geliştirme Üçüncü Sürümü var ve Slashdot'un bir incelemesi var.
Claudia Salzberg et al. Tarafından Linux Kernel Primer ile başlayın. Yeni başlayanlar için başlamak iyi. Robert Love'ın kitabı kesinlikle yeni başlayanların başlaması gereken bir kitap değil. İkinci kitap orta seviyenin üstünde.