2012-11-30 40 views
6

Tôi muốn xây dựng hạt nhân riêng của riêng mình với một bảng syscall khác. (cùng một syscalls nhưng ở vị trí/số khác nhau)Thay đổi số hệ thống hạt nhân linux

Tôi đã làm việc trên hạt nhân 3.2.29.

Thay đổi hạt nhân là khá dễ dàng:

1) thay đổi vị trí syscall trong vòm/x86/kernel/syscall_table_32.S

2) thay đổi số vĩ mô syscall trong vòm/x86 /include/asm/unistd_32.h

3) biên dịch và cài đặt kernel mới

tôi chuyển sang các syscalls xung quanh: sys_open mất địa điểm và số lượng sys_read, và ngược lại.

Tôi thấy rằng nếu tôi biên dịch glibc với tiêu đề hạt nhân đã sửa đổi, tôi có thể có một hệ thống đang chạy, nhưng không may là nó không đủ và hệ thống của tôi sẽ không khởi động.

Tôi có thiếu gì đó không? Tôi cần phải làm gì khác để có một hệ thống đang chạy?


Các bước tôi đã lấy là:

1) xây dựng và cài đặt kernel như mô tả trong câu hỏi của tôi

2) giải nén kernel header mới sử dụng make headers_install INSTALL_HDR_PATH=[path]

3) xây dựng glibc với thông số --with-headers=[path/include]

4) Tôi đã sử dụng đĩa CD trực tiếp để truy cập hệ thống tệp bên ngoài để cài đặt glibc mới, sử dụng make install install_root=[the original file system] (vì vậy hệ thống sẽ không bị hỏng trong khi cài đặt)

Tôi hy vọng rằng glibc mới được xây dựng đúng cách, nhưng tôi không chắc chắn.

Sau đó, khi khởi động hệ thống, khởi động dừng trong màn hình vỏ (initrafms): Tôi đoán tôi cần phải xây dựng lại initrd, nhưng làm cách nào để biên dịch nó theo bảng syscall mới?

+0

Vui lòng không đóng bình chọn các câu hỏi về chủ đề, đặc biệt là khi họ có upvotes và câu trả lời. –

+0

Tại sao một người làm như vậy? –

+0

@JonasWielicki trước khi một người nào đó "helpfully" chỉnh sửa nó ra khỏi câu hỏi, nó đã được giải thích rằng đây là thử nghiệm sau một bài tập ở trường để thêm một syscall mới. Trong khi tiện ích có vấn đề, sự thay đổi được dự tính ở đây chắc chắn kêu gọi sự chú ý đến cách mọi thứ hoạt động và có nhiều phụ thuộc. Hacking lên một hệ thống mà không ai phụ thuộc vào có thể là một cách tuyệt vời để tìm hiểu mọi thứ. –

Trả lời

0

Việc xáo trộn số cuộc gọi hệ thống thực sự sẽ bị tổn thương. Bạn sẽ cần ít nhất để xây dựng lại tất cả các tệp nhị phân được liên kết tĩnh trên hệ thống của bạn và initrd của bạn (nếu bạn sử dụng một).

+0

và mã khởi động trong các ứng dụng xây dựng năng động cũng có thể làm một hoặc hai syscalls (như thoát (2)) –

+0

@tmyklebu Bạn có nghĩ rằng 'glibc' có thể được biên dịch để làm việc trên hệ thống mới, whitout bằng cách sử dụng hệ thống mới để biên dịch nó? Và nếu có, thì các bước chung cần thiết để thực hiện điều đó là gì? – assafmo

+0

@tmyklebu Tôi muốn có một hệ thống làm việc tối thiểu, vì vậy tôi sẽ chỉ xây dựng lại các tệp nhị phân liên kết tĩnh cần thiết, nhưng bạn có thể cho tôi bất kỳ dẫn đầu nào về việc xây dựng lại initrd cho hệ thống mới không? – 4x6hw

0

Bạn chưa từng nói lúc khởi động bị lỗi, nhưng ngay cả khi hạt nhân xuất hiện, có khả năng các chương trình quan trọng có trong ramdisk initrd bị lỗi vì chúng có số syscall gốc cứng. Bạn sẽ cần phải xây dựng lại và đóng gói lại những người là tốt.

Bạn có thể cân nhắc thay thế init đầu tiên bằng một loại chương trình chào hỏi thế giới tĩnh để xác minh rằng hạt nhân của bạn có thể hỗ trợ một không gian người dùng; sau đó xem xét các chi tiết của việc tạo ra tất cả sự phức tạp của một kết nối không gian người dùng Linux hiện đại.

+0

tôi đã chỉnh sửa câu hỏi để mô tả quy trình tốt hơn và khi khởi động không thành công – 4x6hw

0

bạn đã phải học cách đọc các messsage của pansic dump và cho chúng ta thấy những gì kenrel hoảng loạn. Nếu không có thông tin này, mọi người khó có thể giúp bạn hoặc cung cấp cho bạn gợi ý hữu ích.

1

Bạn sẽ phải xây dựng lại mọi thứ. Ngay cả khi tất cả các tệp nhị phân của bạn được liên kết động, có thể các syscalls cũ được gạch chân vào nhị phân vì nhiều hàm C chỉ là return syscall(__NR_somecall,...).

Bạn có thể thực hiện việc này theo cách thủ công, nhưng có thể khó giữ các thanh công cụ thẳng trừ khi bạn sử dụng chuỗi công cụ có thể ghép chéo như xây dựng, thổ dân hoặc tương tự. Chọn bất kỳ điều gì phù hợp nhất với bạn (tôi thích thổ dân của Rob Landley - http://landley.net/aboriginal/)

Sau đó, để initrd của bạn chỉ mở rộng ảnh cũ bằng cách sử dụng {z, bz, xz} cat oldinit.rd | ​​cpio -id; rm oldinit.rd. Thay thế các mô-đun hạt nhân cũ, libs và nhị phân bằng mới và cpio và nén nó trở lại (cpio cần tùy chọn -H newc) ... hoặc bây giờ bạn có thể xây dựng lại hạt nhân của bạn và trỏ initramfs vào thư mục đó, nhưng sẽ không khuyên bạn nên nếu initrd của bạn có thể cần thay đổi thường xuyên, chẳng hạn như nếu bạn đang thử nghiệm một cấu trúc syscall hoàn toàn mới và phải gỡ rối rất nhiều.

Các vấn đề liên quan