2011-11-05 43 views
10

Tôi không thể tìm thấy thông tin này ở bất kỳ đâu. Ở khắp mọi nơi tôi nhìn, tôi thấy mọi thứ liên quan đến cách chồng trông như thế nào khi bạn nhấn "chính" (bất kể điểm vào của bạn là gì), đó sẽ là đối số chương trình và môi trường, nhưng điều tôi đang tìm kiếm là cách thiết lập hệ thống ngăn xếp hợp tác với macro switch_to. Lần đầu tiên tác vụ được chuyển sang, nó sẽ cần phải có EFLAGS, EBP, các thanh ghi mà GCC lưu và địa chỉ trả về từ hàm schedule() trên ngăn xếp được trỏ tới bởi "tsk-> thread-> esp", nhưng những gì tôi không thể tìm ra là làm thế nào hạt nhân thiết lập ngăn xếp này, vì nó cho phép GCC lưu sổ đăng ký mục đích chung (sử dụng các tham số đầu ra cho lắp ráp nội tuyến).Trạng thái ngăn xếp hạt nhân của quá trình Linux khi tạo quy trình là gì?

Tôi chỉ đề cập đến máy tính x86. Tôi đang nghiên cứu hệ thống xử lý/lập kế hoạch Linux cho hạt nhân nhỏ của riêng mình, tôi đang cố gắng viết và tôi không thể tìm được những gì tôi đang thiếu. Tôi biết tôi đang thiếu một cái gì đó kể từ khi thực tế là Slackware đang chạy trên máy tính của tôi là một minh chứng cho thực tế là lịch trình hoạt động: P

EDIT: Tôi dường như đã nói xấu này. Tôi đang tìm kiếm thông tin về cách các nhiệm vụ hạt nhân ngăn xếp được thiết lập không phải cách nhiệm vụ tác vụ người dùng được thiết lập. Cụ thể hơn, ngăn xếp mà tsk-> thread-> esp trỏ tới và "switch_to" chuyển sang.

+0

Dường như bạn có hai câu hỏi riêng biệt ở đây - 1) trạng thái ngăn xếp trên tiến trình init và 2) kernel 'schedule()' trong IRQ. Bạn có lẽ nên đăng một trong những câu hỏi này dưới dạng câu hỏi mới và giữ một trong số các câu hỏi ở đây; theo cách đó bạn sẽ nhận được câu trả lời tập trung vào mỗi câu hỏi. Trên Stack Overflow, bắt đầu một câu hỏi riêng biệt cho mỗi câu hỏi là hoàn toàn tốt đẹp. –

+0

Được rồi, sẽ làm! Tôi đã đọc câu trả lời/câu hỏi ở đây trong một thời gian dài, nhưng không bao giờ được đăng! Cảm ơn bạn đã tip :) Vâng, tôi sẽ trong khoảng 5 phút. Tôi phải đợi: P – Caleb1994

Trả lời

6

Ngăn xếp hạt nhân ban đầu cho một quy trình mới được đặt trong copy_thread(), đó là một chức năng đặc trưng cho vòm. Các phiên bản x86, ví dụ, bắt đầu ra như thế này:

int copy_thread(unsigned long clone_flags, unsigned long sp, 
unsigned long unused, 
struct task_struct *p, struct pt_regs *regs) 
{ 
    struct pt_regs *childregs; 
    struct task_struct *tsk; 
    int err; 

    childregs = task_pt_regs(p); 
    *childregs = *regs; 
    childregs->ax = 0; 
    childregs->sp = sp; 

    p->thread.sp = (unsigned long) childregs; 
    p->thread.sp0 = (unsigned long) (childregs+1); 

    p->thread.ip = (unsigned long) ret_from_fork; 

p->thread.spp->thread.ip là thread mới của con trỏ ngăn xếp nhân và con trỏ lệnh tương ứng.

Lưu ý rằng nó không nơi một lưu %eflags, %ebp vv ở đó, bởi vì khi một thread mới được tạo ra thực hiện là lần đầu tiên chuyển sang, nó bắt đầu ra thực hiện tại ret_from_fork (đây là nơi __switch_to() trở về cho một mới thread), có nghĩa là nó không thực hiện nửa sau của quy trình switch_to().

+0

Cảm ơn bạn! Điều này thật đúng với gì mà tôi đã tìm kiếm! Tôi sẽ không bao giờ đoán được trong copy_thread. – Caleb1994

+0

@ Caleb1994: Nó có ý nghĩa khi bạn nhớ rằng tất cả các luồng mới của việc thực hiện được tạo ra trên Linux bằng cách nhân bản một cái hiện có. Tôi đã thêm một đoạn văn khác vào cuối có thể hữu ích. – caf

+1

Điều đó đã giúp ích rất nhiều! Hạt nhân nhỏ của tôi bây giờ hỗ trợ ngã ba() và một cuộc gọi() loại năng suất :) Cảm ơn rất nhiều sự giúp đỡ của bạn! – Caleb1994

2

Trạng thái ngăn xếp khi tạo quy trình được mô tả trong phần bổ sung X86-64 SVR4 ABI (đối với AMD64, tức là máy 64 bit 64 bit). Tương đương với bộ xử lý Intel 32 bit có lẽ là ABI i386. Tôi khuyên bạn nên đọc cũng Assembly HOWTO. Và tất nhiên, bạn có lẽ nên đọc tập tin hạt nhân Linux có liên quan.

+0

Các trang đó mô tả trạng thái của ngăn xếp ** sau khi thực thi ** đã bắt đầu. Vấn đề của tôi là trạng thái của ngăn xếp ** trước ** thực thi. tức là khi hạt nhân đang thiết lập ngăn xếp.Vấn đề duy nhất của tôi là Linux rời khỏi trình biên dịch để lưu các thanh ghi mục đích chung (được lưu trên ngăn xếp), nhưng cách chúng được lưu có thể khác nhau tùy thuộc vào trình biên dịch, do đó tôi bị nhầm lẫn về cách hệ thống đặt lên ngăn xếp ban đầu. Tôi đã xem xét mã, nhưng tôi không thể tìm thấy nơi mà quá trình được lấp đầy. Nó ẩn đằng sau máy trừu tượng ở đâu đó. – Caleb1994

+0

Ngăn xếp không tồn tại trước khi thực thi. Vì vậy, tôi không hiểu những gì bạn muốn. Hạt nhân đang xây dựng ngăn xếp quy trình ban đầu như được mô tả trong tài liệu ABI. –

+0

Có thể bạn đã quên rằng ngăn xếp hạt nhân và không gian người dùng khác nhau? –

2

Google cho "khởi động quá trình bố cục ngăn xếp linux" cho liên kết this: "Trạng thái khởi động của nhị phân ELF Linux/i386", mô tả thiết lập hạt nhân thực hiện trước khi chuyển quyền kiểm soát sang mã khởi động libc.

+0

là nó nhà nước chỉ sau khi 'exec'? – osgx

+0

Vâng, đó là trạng thái ngay trước khi lệnh đầu tiên của quá trình của bạn bắt đầu thực hiện. –

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