Yüklenebilir bir çekirdek modülü ile Linux 3.2.x'e yeni bir Sistem çağrısı ekleme [kapalı]


11

Linux çekirdeği 3.2.x'te belirli bir yeni sistem çağrısı eklemek istiyorum, ancak yüklenebilir bir çekirdek modülü olarak (çekirdeği tekrar tekrar derlemek istemediğim için)

İnternette ve ayrıca SO'da birçok yazı okudum ve bazı yerler, sistem çağrılarının yüklenebilir modüller olarak uygulanmasının mümkün olmadığını iddia ederken, diğerleri bunun mümkün olduğunu söylüyor.

Hangisi? Mümkünse nasıl yapılır?


Bu sorunun konusu burada değil: Unix ve Linux programlama ve kullanım ile ilgilidir. Yığın Taşması'nı sormalısınız . Bu kadar belirsiz olmayın: Stack Overflow'da bulduğunuz yayınlara bağlantı verin ve sonuçsuz veya çelişkili bulduğunuz şeyi açıklayın.
Gilles 'SO- kötü olmayı bırak'

2
Bu sorunun bir işletim sistemi olarak Linux ile kendisini programlamaktan daha ilgili olduğuna inanıyorum. Sistem yeteneklerimizi genişletme olasılıklarının neler olduğunu ve sınırlarının ne olduğunu bilmek de oldukça önemlidir. Bu, örneğin, bazı özelliklerin neden yüklenebilir modül olarak uygulanmasının mümkün olmadığını ve çekirdek düzeltme eki gerektirdiğini anlamanızı sağlar. Bunun neden böyle olduğunu bilmek, aynı zamanda, kullanılabilirlik çekirdeği geliştiricilerinin yapmak zorunda olduğu güvenlikle ilgili bazı fikirler de verebilir. Bu soru, OP'nin yalnızca mümkün olup olmadığını sorup sormadığı ve konuyu nasıl uygulayıp uygulayamayacağı sorusunu sormaktan daha mı fazla olur?
Krzysztof Adamski

1
Linux Çekirdek Posta Listesi'nde çok sayıda <strok> alev </stroke> tartışması vardı, örneğin reiserfs, Linus dahil bazı temel geliştiriciler tarafından gerçekten sevilmeyen kendi sistem çağrılarını kullandı. Sizin durumunuzda ioctl()s'yi görev için kullanırım , kolayca modüler hale getirilebilirler. Afaik, sistem çağrılarının sayısının oldukça zor kodlanmış bir şey olabildiğince zorlaştırmasının arkasındaki ana neden ve kimse kaosun resme ne alacağını istemiyor. Ancak aynı işlevselliğe ulaşmak için çok sayıda çekirdek arabirimi vardır, örneğin sysfs, ioctls veya benzeri.
peterh - Monica'yı geri döndür

Yanıtlar:


14

Sistem çağrı tablosu (çağrılan sys_call_table) statik bir boyut dizisi olduğu için mümkün değildir . Ve boyutu derleme zamanında kayıtlı sistem sayısı ile belirlenir. Bu, bir başkası için yer olmadığı anlamına gelir.

Tanımlı arch/x86/kernel/syscall_64.cdosyadaki x86 mimarisi için uygulamayı kontrol edebilirsiniz sys_call_table. Boyutu tam olarak __NR_syscall_max+1. __NR_syscall_max, tüm sistem çağrılarının bulunduğu bir tablo olduğu (son sistem çağrısı sayısı ) arch/x86/kernel/asm-offsets_64.colarak tanımlanır .sizeof(syscalls) - 1syscall

Olası bir çözüm, sys_setaltrootbellekte daha fazla yer gerektirmeyeceğinden , mevcut bazı (veya mimarinizde bir tane varsa kullanımdan kaldırılmış olanı, örneğin bkz .) Sistem çağrı numarasını yeniden kullanmaktır. Bazı mimarilerde, sistem çağrı tablosunda (x86'nın 64 bit sürümü gibi) delikler de olabilir, böylece bunu da kullanabilirsiniz.

Yeni bir sistem çağrısı geliştiriyorsanız ve denerken yeniden başlatmayı önlemek istiyorsanız bu tekniği kullanabilirsiniz. Yeni sistem çağrınızı tanımlamanız, mevcut girişi syscall tablosunda bulmanız ve daha sonra modülünüzden değiştirmeniz gerekir.

Çekirdek modülünden bunu yapmak önemsiz değildir, çünkü çekirdek sys_call_table2.6 sürümünden itibaren modüllere dışa aktarmaz (bu sembolün dışa aktarıldığı son çekirdek sürümü idi 2.5.41).

Bu sorunu çözmenin bir yolu, sys_call_tablesembolü modüllere vermek için çekirdeğinizi değiştirmektir . Bunu yapmak için, aşağıdaki iki satırı eklemelisiniz kernel/kallsyms.c( bunu üretim makinelerinde yapmayın ):

extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);

Diğer bir teknik sistem tablolarını dinamik olarak bulmaktır. Her kelimeyi bir işaretçi ile bilinen sistem çağrısı işleviyle karşılaştırarak çekirdek belleği üzerinde yineleme yaparsınız. Bu bilme sistem aramasının ofsetini bildiğiniz için, tablo başlangıç ​​adresini hesaplayabilirsiniz.


1

Maalesef çekirdeğe yüklenebilir modüller olarak sistem çağrıları ekleyemezsiniz. Her yeni sistem çağrısı eklediğinizde, çekirdeği derlemenin acısını almalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.