2009-01-31 32 views

Trả lời

2

Rất đơn giản, nhưng điều xảy ra là gián đoạn xảy ra khi bạn cố gắng truy cập vào địa chỉ bộ nhớ dành riêng. Việc ngắt chuyển đổi ngữ cảnh sang chế độ hạt nhân và thực thi mã hạt nhân (gọi hệ thống thực tế) thay mặt người dùng. Khi cuộc gọi hoàn tất, kiểm soát được trả về mã người dùng.

+0

Mã hạt nhân như thế nào, thư viện liên kết động, lắp ráp hoặc liên kết động? – MainID

+0

Hạt nhân là hạt nhân đang chạy trên hệ thống của bạn, tức là hình ảnh hệ điều hành trong bộ nhớ. – tvanfosson

29

Hãy xem this.

Bắt đầu với phiên bản 2.5, Linux kernel giới thiệu một cơ chế mục mới hệ thống gọi trên Pentium II + xử lý. Do vấn đề hiệu suất trên bộ vi xử lý Pentium IV với phương pháp ngắt phần mềm hiện có, một hệ thống thay thế cuộc gọi nhập cơ chế được thực hiện sử dụng hướng dẫn SYSENTER/SYSEXIT sẵn trên Pentium II + bộ xử lý. Bài viết này khám phá cơ chế mới này. Cuộc thảo luận được giới hạn ở cấu trúc x86 và tất cả mã nguồn danh sách dựa trên hạt nhân Linux 2.6.15.6.

  1. Cuộc gọi hệ thống là gì?

    Cuộc gọi hệ thống cung cấp cho người dùng xử lý cách yêu cầu dịch vụ từ hạt nhân. Loại dịch vụ nào của ? Các dịch vụ được quản lý theo hệ điều hành như bộ nhớ, bộ nhớ, mạng, quản lý quy trình vv Ví dụ: nếu một quá trình người dùng muốn đọc tệp, nó sẽ phải thực hiện các cuộc gọi hệ thống 'mở' và 'đọc'. Nói chung, các cuộc gọi hệ thống không được gọi trực tiếp là . Thư viện C cung cấp giao diện cho tất cả các cuộc gọi của hệ thống.

  2. Điều gì xảy ra trong cuộc gọi hệ thống?

    Đoạn mã hạt nhân được chạy theo yêu cầu của quy trình người dùng. Mã này chạy trong vòng 0 (với đặc quyền hiện tại mức -CPL- 0), là mức cao nhất của mức độ đặc quyền trong kiến ​​trúc x86 . Tất cả quy trình người dùng chạy trong vòng 3 (CPL 3).

    Vì vậy, để thực hiện cơ chế hệ thống cuộc gọi, những gì chúng ta cần là

    1) một cách để gọi ring 0 mã từ vòng 3.

    2) một số mã hạt nhân để phục vụ yêu cầu.

  3. Tốt cách cũ để làm việc đó

    Cho đến khi một số thời gian trở lại, Linux sử dụng để triển khai hệ thống kêu gọi tất cả x86 nền tảng sử dụng ngắt phần mềm. Để thực hiện cuộc gọi hệ thống, quy trình người dùng sẽ sao chép số gọi hệ thống mong muốn thành% eax và sẽ thực thi 'int 0x80'. Điều này sẽ tạo ra gián đoạn 0x80 và một thói quen dịch vụ ngắt sẽ được gọi là . Đối với ngắt 0x80, quy trình này là "tất cả các cuộc gọi hệ thống xử lý" thường trình. Thói quen này sẽ thực hiện trong vòng 0. Quy trình này, như được xác định trong tệp /usr/src/linux/arch/i386/kernel/entry.S, sẽ lưu trạng thái hiện tại và gọi xử lý cuộc gọi hệ thống thích hợp dựa trên giá trị bằng% eax.

  4. cách sáng bóng mới để làm việc đó

    Nó được phát hiện ra rằng phần mềm ngắt phương pháp này là chậm hơn nhiều vào bộ vi xử lý Pentium IV. Để giải quyết vấn đề này , Linus đã triển khai một cơ chế gọi hệ thống thay thế để tận dụng lợi thế của SYSENTER/SYSEXIT hướng dẫn được cung cấp bởi tất cả các bộ xử lý Pentium II +. Trước khi đi xa hơn bằng cách làm mới này, hãy làm cho chúng tôi quen thuộc hơn với các hướng dẫn này.

3

Nó đi qua glibc, mà đưa ra một ngắt 0x80 sau khi điền đăng ký với các thông số. Trình xử lý ngắt của hạt nhân sau đó tìm kiếm syscall trong bảng syscall và gọi hàm sys _ *() có liên quan.

10

Điều đó tùy thuộc vào ý nghĩa của cuộc gọi hệ thống. Bạn có nghĩa là một cuộc gọi thư viện C (thông qua glibc) hoặc một cuộc gọi hệ thống thực tế? Các cuộc gọi thư viện C luôn kết thúc bằng cách sử dụng các cuộc gọi hệ thống ở cuối.

Cách cũ để thực hiện cuộc gọi hệ thống là thông qua phần mềm gián đoạn, tức là hướng dẫn int. Windows có int 0x2e trong khi Linux có int 0x80. Hệ điều hành thiết lập một trình xử lý ngắt cho 0x2e hoặc 0x80 trong Bảng mô tả ngắt (IDT). Trình xử lý này sau đó thực hiện cuộc gọi hệ thống. Nó sao chép các đối số từ chế độ người dùng sang chế độ lõi (điều này được điều khiển bởi một quy ước cụ thể cho hệ điều hành). Trên Linux, các đối số được chuyển bằng cách sử dụng ebx, ecx, edx, esiedi. Trên Windows, các đối số được sao chép từ ngăn xếp. Trình xử lý sau đó thực hiện một số loại tra cứu (để tìm địa chỉ của hàm) và thực hiện cuộc gọi hệ thống. Sau khi hoàn thành cuộc gọi hệ thống, lệnh iret sẽ trở về chế độ người dùng.

Cách mới là sysentersysexit. Hai hướng dẫn này về cơ bản thực hiện tất cả công việc đăng ký cho bạn. Hệ điều hành đặt hướng dẫn lên thông qua Đăng ký mô hình cụ thể (MSR). Sau đó nó thực tế giống như sử dụng int.

+0

"Các cuộc gọi thư viện C luôn kết thúc bằng cách sử dụng các cuộc gọi hệ thống cuối cùng". - bất kỳ tham chiếu đến điều đó? –

+0

@MywikiWitwiki Không * bất kỳ cuộc gọi thư viện nào * C, nhưng các cuộc gọi đến 'read',' write' etc làm. Lý do duy nhất mà họ có thể không - nếu họ thậm chí còn tồn tại - là do tối ưu hóa cực kỳ chuyên ngành. Bạn có thể cho rằng chúng luôn chuyển sang chế độ hạt nhân, trừ khi bạn là một chuyên gia về hạt nhân với những hiểu biết sáng tạo. –

2

int X trong hội đồng dịch sang số gọi hệ thống n.
Đọc syscall cũ có thể được gán số 4.
Khi khởi động hệ thống, OS xây dựng bảng con trỏ gọi là bảng mô tả ngắt (IDT).
Mức độ đặc quyền hiện tại (CPL) được lưu ở một trong các bit của thanh ghi CS (kỹ thuật 2 bit trên x86).
Đây là các bước theo sau là hướng dẫn int:
• Tìm nạp bộ mô tả thứ n từ IDT, trong đó n là đối số của int.
• Kiểm tra CPL trong% cs là < = DPL, trong đó DPL là cấp đặc quyền trong bộ mô tả.
• Nếu không thì người dùng không có đủ đặc quyền để thực hiện điều này và sẽ dẫn đến lệnh int 13 (lỗi bảo vệ chung) đang được thực hiện, (người dùng không có đủ đặc quyền)
• Nếu có thì mã người dùng có đủ đặc quyền để thực hiện cuộc gọi hệ thống này, ngữ cảnh thực hiện hiện tại được lưu (sổ đăng ký vv), bởi vì bây giờ chúng ta chuyển sang chế độ hạt nhân.
Thông tin bao gồm thanh ghi, cờ vì khi cuộc gọi hệ thống được kết nối, chúng tôi muốn tiếp tục thực hiện từ nơi chúng tôi đã thoát. • Các tham số cho cuộc gọi hệ thống được lưu trên ngăn xếp hạt nhân, bởi vì cuộc gọi hệ thống được thực hiện trong chế độ lõi.

VSYSCALL (NHANH HỆ THỐNG CALL)
Mỗi cuộc gọi hệ thống thời gian được thực hiện bởi người sử dụng, hệ điều hành tiết kiệm tình trạng hiện tại của máy (tức là đăng ký, chồng con trỏ vv) và chuyển sang chế độ hạt nhân để thực hiện . Đối với một số hệ thống gọi nó là không cần thiết để lưu tất cả các đăng ký. Ex gettime của cuộc gọi hệ thống ngày đọc thời gian hiện tại và trả về cuộc gọi hệ thống. Vì vậy, một số cuộc gọi hệ thống được thực hiện thông qua những gì được gọi là vsyscalls. Ở đây khi một cuộc gọi hệ thống được thực hiện, nó được thực hiện trong chính không gian người dùng mà không bao giờ chuyển sang hạt nhân. Vì vậy, thời gian được lưu.
Xem ở đây để biết chi tiết về vsyscall http://www.trilithium.com/johan/2005/08/linux-gate/
và đây Anyone can understand how gettimeofday works?

0

Một syscall được làm bằng một hướng dẫn bẫy đặc biệt, một số syscall và tranh luận.

  1. Lệnh bẫy đặc biệt được sử dụng để chuyển từ chế độ người dùng sang chế độ hạt nhân có đặc quyền không giới hạn.
  2. Số syscall và đối số được thông qua bằng cách đăng ký.
Các vấn đề liên quan