Quan sát ghi đĩa cứng trong không gian kernel (với trình điều khiển / mô-đun)


13

Xin lỗi trước nếu bài đăng này hơi dày đặc / lộn xộn, nhưng tôi gặp khó khăn trong việc xây dựng nó tốt hơn ... Về cơ bản, tôi muốn nghiên cứu những gì xảy ra khi ghi vào đĩa cứng và tôi muốn biết:

  • Sự hiểu biết của tôi dưới đây có đúng không - và nếu không, tôi sẽ sai ở đâu?
  • Có công cụ nào tốt hơn để "thu thập" dữ liệu nhật ký, về tất cả các khía cạnh xảy ra trên PC, trong quá trình ghi đĩa không?

Chi tiết hơn - đầu tiên, HĐH tôi đang sử dụng là:

$ uname -a
Linux mypc 2.6.38-16-generic #67-Ubuntu SMP Thu Sep 6 18:00:43 UTC 2012 i686 i686 i386 GNU/Linux

Vì vậy, tôi có một cách đơn giản sau (ví dụ: các kiểm tra thông thường về lỗi hoạt động bị bỏ qua) chương trình C không gian người dùng , wtest.c:

#include <stdio.h>
#include <fcntl.h>  // O_CREAT, O_WRONLY, S_IRUSR

int main(void) {
  char filename[] = "/tmp/wtest.txt";
  char buffer[] = "abcd";
  int fd;
  mode_t perms = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;

  fd = open(filename, O_RDWR|O_CREAT, perms);
  write(fd,buffer,4);
  close(fd);

  return 0;
}

Tôi xây dựng cái này với gcc -g -O0 -o wtest wtest.c. Bây giờ, vì tôi đang cố gắng viết thư /tmp, tôi lưu ý rằng đó là một thư mục dưới thư mục gốc /- vì vậy tôi kiểm tra mount:

$ mount
/dev/sda5 on / type ext4 (rw,errors=remount-ro,commit=0)
...
/dev/sda6 on /media/disk1 type ext4 (rw,uhelper=hal,commit=0)
/dev/sda7 on /media/disk2 type ext3 (rw,nosuid,nodev,uhelper=udisks,commit=0,commit=0,commit=0,commit=0,commit=0,commit=0)
...

Vì vậy, hệ thống tập tin gốc của tôi /là một phân vùng của /dev/sdathiết bị (và tôi cũng đang sử dụng các phân vùng khác dưới dạng đĩa / mount "độc lập"). Để tìm trình điều khiển cho thiết bị này, tôi sử dụng hwinfo:

$ hwinfo --disk
...
19: IDE 00.0: 10600 Disk
...
  SysFS ID: /class/block/sda
  SysFS BusID: 0:0:0:0
...
  Hardware Class: disk
  Model: "FUJITSU MHY225RB"
...
  Driver: "ata_piix", "sd"
  Driver Modules: "ata_piix"
  Device File: /dev/sda
...
  Device Number: block 8:0-8:15
...

Vì vậy, /dev/sdađĩa cứng rõ ràng được xử lý bởi trình điều khiển ata_piix(và sd).

$ grep 'ata_piix\| sd' <(gunzip </var/log/syslog.2.gz)
Jan 20 09:28:31 mypc kernel: [    1.963846] ata_piix 0000:00:1f.2: version 2.13
Jan 20 09:28:31 mypc kernel: [    1.963901] ata_piix 0000:00:1f.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
Jan 20 09:28:31 mypc kernel: [    1.963912] ata_piix 0000:00:1f.2: MAP [ P0 P2 P1 P3 ]
Jan 20 09:28:31 mypc kernel: [    2.116038] ata_piix 0000:00:1f.2: setting latency timer to 64
Jan 20 09:28:31 mypc kernel: [    2.116817] scsi0 : ata_piix
Jan 20 09:28:31 mypc kernel: [    2.117068] scsi1 : ata_piix
Jan 20 09:28:31 mypc kernel: [    2.529065] sd 0:0:0:0: [sda] 488397168 512-byte logical blocks: (250 GB/232 GiB)
Jan 20 09:28:31 mypc kernel: [    2.529104] sd 0:0:0:0: Attached scsi generic sg0 type 0
Jan 20 09:28:31 mypc kernel: [    2.529309] sd 0:0:0:0: [sda] Write Protect is off
Jan 20 09:28:31 mypc kernel: [    2.529319] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
Jan 20 09:28:31 mypc kernel: [    2.529423] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Jan 20 09:28:31 mypc kernel: [    2.674783]  sda: sda1 sda2 < sda5 sda6 sda7 sda8 sda9 sda10 >
Jan 20 09:28:31 mypc kernel: [    2.676075] sd 0:0:0:0: [sda] Attached SCSI disk
Jan 20 09:28:31 mypc kernel: [    4.145312] sd 2:0:0:0: Attached scsi generic sg1 type 0
Jan 20 09:28:31 mypc kernel: [    4.150596] sd 2:0:0:0: [sdb] Attached SCSI removable disk

Tôi phải rút từ syslog cũ vì tôi đình chỉ rất nhiều, nhưng ở trên có vẻ như đoạn trích thích hợp từ syslog khi khởi động, nơi trình điều khiển ata_piix(và sd) lần đầu tiên khởi động.

Điểm khó hiểu đầu tiên của tôi là tôi không thể quan sát các trình điều khiển ata_piixhoặc sdtrình điều khiển khác:

$ lsmod | grep 'ata_piix\| sd'
$
$ modinfo sd
ERROR: modinfo: could not find module sd
$ modinfo ata_piix
ERROR: modinfo: could not find module ata_piix

Vì vậy, câu hỏi đầu tiên của tôi là - tại sao tôi không thể quan sát ata_piixmô-đun ở đây, chỉ trong nhật ký thời gian khởi động? Có phải vì ata_piix(và sd) được xây dựng dưới dạng trình điều khiển tích hợp trong nhân (nguyên khối), trái ngược với việc được xây dựng dưới dạng .komô-đun hạt nhân (có thể tải) ?

Đúng vậy - bây giờ, tôi đang cố gắng quan sát những gì xảy ra khi chạy chương trình với trình ftracetheo dõi chức năng tích hợp sẵn của Linux.

sudo bash -c '
KDBGPATH="/sys/kernel/debug/tracing"
echo function_graph > $KDBGPATH/current_tracer
echo funcgraph-abstime > $KDBGPATH/trace_options
echo funcgraph-proc > $KDBGPATH/trace_options
echo 0 > $KDBGPATH/tracing_on
echo > $KDBGPATH/trace
echo 1 > $KDBGPATH/tracing_on ; ./wtest ; echo 0 > $KDBGPATH/tracing_on
cat $KDBGPATH/trace > wtest.ftrace
'

... và đây là một đoạn của ftracenhật ký liên quan đến write:

4604,352690 | 0) wtest-31632 | | sys_write () {
 4604,352690 | 0) wtest-31632 | 0,750 chúng tôi | fget_light ();
 4604,352692 | 0) wtest-31632 | | vfs_write () {
 4604,352693 | 0) wtest-31632 | | rw_verify_area () {
 4604,352693 | 0) wtest-31632 | | security_file_ allow () {
 4604,352694 | 0) wtest-31632 | | apparmor_file_ allow () {
 4604,352695 | 0) wtest-31632 | 0.811 chúng tôi | chung_file_perm ();
 4604,352696 | 0) wtest-31632 | 2.198 chúng tôi | }
 4604,352697 | 0) wtest-31632 | 3.573 chúng tôi | }
 4604,352697 | 0) wtest-31632 | 4.979 chúng tôi | }
 4604,352698 | 0) wtest-31632 | | do_sync_write () {
 4604,352699 | 0) wtest-31632 | | ext4_file_write () {
 4604,352700 | 0) wtest-31632 | | generic_file_aio_write () {
 4604,352701 | 0) wtest-31632 | | mutex_lock () {
 4604,352701 | 0) wtest-31632 | 0,666 chúng tôi | _cond_resched ();
 4604.352703 | 0) wtest-31632 | 1.994 chúng tôi | }
 4604.352704 | 0) wtest-31632 | | __generic_file_aio_write () {
...
 4604,352728 | 0) wtest-31632 | | file_update_time () {
...
 4604,352732 | 0) wtest-31632 | 0,756 chúng tôi | mnt_want_write_file ();
 4604,352734 | 0) wtest-31632 | | __mark_inode_denty () {
...
 4604,352750 | 0) wtest-31632 | | ext4_mark_inode_denty () {
 4604,352750 | 0) wtest-31632 | 0,679 chúng tôi | _cond_resched ();
 4604,352752 | 0) wtest-31632 | | ext4_reserve_inode_write () {
...
 4604,352777 | 0) wtest-31632 | | __ext4_journal_get_write_access () {
...
 4604,352795 | 0) wtest-31632 | | ext4_mark_iloc_denty () {
...
 4604.352806 | 0) wtest-31632 | | __ext4_journal_stop () {
...
 4604,352821 | 0) wtest-31632 | 0,684 chúng tôi | mnt_drop_write ();
 4604,352822 | 0) wtest-31632 | + 93,541 chúng tôi | }
 4604,352823 | 0) wtest-31632 | | generic_file_buffered_write () {
 4604,352824 | 0) wtest-31632 | 0,654 chúng tôi | iov_iter_advance ();
 4604,352825 | 0) wtest-31632 | | generic_perform_write () {
 4604,352826 | 0) wtest-31632 | 0,709 chúng tôi | iov_iter_fault_in_readable ();
 4604,352828 | 0) wtest-31632 | | ext4_da_write_begin () {
 4604,352829 | 0) wtest-31632 | | ext4_journal_start_sb () {
...
 4604,352847 | 0) wtest-31632 | 1.453 chúng tôi | __block_write_begin ();
 4604,352849 | 0) wtest-31632 | + 21.128 chúng tôi | }
 4604,352849 | 0) wtest-31632 | | iov_iter_copy_from_user_atomic () {
 4604,352850 | 0) wtest-31632 | | __kmap_atomic () {
...
 4604,352863 | 0) wtest-31632 | 0,672 chúng tôi | mark_page_accessed ();
 4604,352864 | 0) wtest-31632 | | ext4_da_write_end () {
 4604,352865 | 0) wtest-31632 | | generic_write_end () {
 4604,352866 | 0) wtest-31632 | | block_write_end () {
...
 4604,352893 | 0) wtest-31632 | | __ext4_journal_stop () {
...
 4604.352909 | 0) wtest-31632 | 0,655 chúng tôi | mutex_unlock ();
 4604,352911 | 0) wtest-31632 | 0,727 chúng tôi | generic_write_sync ();
 4604,352912 | 0) wtest-31632 | ! 212.259 chúng tôi | }
 4604,352913 | 0) wtest-31632 | ! 213.845 chúng tôi | }
 4604,352914 | 0) wtest-31632 | ! 215.286 chúng tôi | }
 4604,352914 | 0) wtest-31632 | 0,685 chúng tôi | __fsnotify_parent ();
 4604,352916 | 0) wtest-31632 | | fsnotify () {
 4604,352916 | 0) wtest-31632 | 0,907 chúng tôi | __srcu_read_lock ();
 4604,352918 | 0) wtest-31632 | 0,685 chúng tôi | __srcu_read_unlock ();
 4604,352920 | 0) wtest-31632 | 3.958 chúng tôi | }
 4604,352920 | 0) wtest-31632 | ! 228,409 chúng tôi | }
 4604,352921 | 0) wtest-31632 | ! 231.334 chúng tôi | }

Đây là điểm nhầm lẫn thứ hai của tôi - tôi có thể quan sát không gian người dùng write()dẫn đến không gian kernel sys_write(), như mong đợi; và trong sys_write(), tôi quan sát các hàm liên quan đến bảo mật (ví dụ apparmor_file_permission()), các hàm ghi "chung" (ví dụ generic_file_aio_write()), ext4các hàm liên quan đến hệ thống tệp (ví dụ ext4_journal_start_sb()) - nhưng tôi không quan sát thấy bất cứ điều gì liên quan đến trình điều khiển ata_piix(hoặc sd)?!

Trang Truy tìm và lược tả - Dự án Yocto đề xuất sử dụng công cụ blktheo dõi ftraceđể có thêm thông tin về hoạt động của thiết bị khối, nhưng nó không báo cáo gì cho tôi với ví dụ này. Ngoài ra, Trình điều khiển hệ thống tập tin Linux - Annon Inglorion (tutorfs) đề xuất rằng các hệ thống tập tin cũng (có thể) được triển khai như các mô-đun / trình điều khiển hạt nhân và tôi cũng đoán đó là trường hợp ext4tương tự.

Cuối cùng, tôi có thể đã thề rằng trước đó tôi đã quan sát tên trình điều khiển trong dấu ngoặc vuông bên cạnh chức năng được hiển thị bởi người function_graphtheo dõi, nhưng tôi đoán rằng tôi đã trộn lẫn mọi thứ - nó có thể xuất hiện như thế trong dấu vết ngăn xếp (trở lại), nhưng không trong biểu đồ hàm. Hơn nữa, tôi có thể kiểm tra /proc/kallsyms:

$ grep 'piix\| sd\|psmouse' /proc/kallsyms
...
00000000 d sd_ctl_dir
00000000 d sd_ctl_root
00000000 d sdev_class
00000000 d sdev_attr_queue_depth_rw
00000000 d sdev_attr_queue_ramp_up_period
00000000 d sdev_attr_queue_type_rw
00000000 d sd_disk_class
...
00000000 t piix_init_sata_map
00000000 t piix_init_sidpr
00000000 t piix_init_one
00000000 t pci_fixup_piix4_acpi
...
00000000 t psmouse_show_int_attr        [psmouse]
00000000 t psmouse_protocol_by_type     [psmouse]
00000000 r psmouse_protocols    [psmouse]
00000000 t psmouse_get_maxproto [psmouse]
...

... và kiểm tra với nguồn Linux / trình điều khiển / ata / ata_piix.c , xác nhận rằng ví dụ piix_init_sata_mapthực sự là một hàm trong ata_piix. Mà có lẽ nên nói với tôi rằng: các mô-đun được biên dịch trong kernel (để chúng trở thành một phần của hạt nhân nguyên khối) "làm mất" thông tin về mô-đun chúng đến từ đâu; tuy nhiên, các mô-đun có thể tải được xây dựng dưới dạng .kocác đối tượng hạt nhân riêng biệt , bảo toàn thông tin đó (ví dụ như [psmouse]được hiển thị ở trên trong dấu ngoặc vuông). Do đó, cũng ftracechỉ có thể hiển thị thông tin "mô-đun khởi tạo", chỉ cho các chức năng đến từ các mô-đun hạt nhân có thể tải. Điều này có đúng không?

Trên đây được xem xét, đây là sự hiểu biết mà tôi có về quá trình hiện tại:

  • Khi khởi động, ata_piixtrình điều khiển thiết lập ánh xạ bộ nhớ DMA (?) Giữa /dev/sdavà đĩa cứng
    • bởi vì điều này, tất cả các truy cập trong tương lai sẽ /dev/sdathông ata_piixsuốt với kernel (nghĩa là không thể theo dõi được) - vì tất cả các kernel sẽ thấy, chỉ đọc / ghi vào các vị trí bộ nhớ (không nhất thiết phải gọi đến các hàm kernel có thể theo dõi cụ thể), mà không được báo cáo bởi function_graphtracer
  • Khi khởi động, sdtrình điều khiển sẽ tiếp tục "phân tích" các phân vùng /dev/sda, làm cho chúng khả dụng và có thể xử lý ánh xạ bộ nhớ giữa các phân vùng <-> thiết bị đĩa
    • một lần nữa, điều này sẽ làm cho các hoạt động truy cập thông qua sdtrong suốt đến kernel
  • Vì cả hai ata_piixsdđược biên dịch trong kernel, ngay cả khi một số chức năng của chúng cuối cùng bị bắt giữ ftrace, chúng tôi không thể có được thông tin về mô-đun mà các chức năng đó sẽ đến từ đâu (ngoài tương quan "thủ công" với các tệp nguồn)
  • Sau đó, mountthiết lập mối quan hệ / ràng buộc giữa một phân vùng và trình điều khiển hệ thống tệp tương ứng (trong trường hợp này ext4)
    • kể từ thời điểm này, tất cả các truy cập vào hệ thống tập tin được gắn kết sẽ được xử lý bởi các ext4hàm - có thể truy nguyên theo kernel; nhưng như ext4được biên dịch trong kernel, trình theo dõi không thể cung cấp cho chúng ta thông tin mô-đun khởi tạo
  • Vì vậy, ghi "chung" được quan sát, được gọi thông qua các ext4hàm, cuối cùng sẽ truy cập các vị trí bộ nhớ, có ánh xạ được thiết lập bởi ata_piix- nhưng ngoài điều đó, ata_piixkhông can thiệp trực tiếp vào việc truyền dữ liệu (có thể được xử lý bởi DMA (bên ngoài bộ xử lý (s), và do đó minh bạch với nó).

Sự hiểu biết này có đúng không?

Một số câu hỏi con liên quan:

  • Trong thiết lập của tôi ở trên, tôi có thể xác định trình điều khiển thiết bị PCI ( ata_piix) và trình điều khiển hệ thống tập tin ( ext4); nhưng có các trình điều khiển ký tự hoặc khối được sử dụng ở đâu đó trên đường dẫn thực thi "ghi" và nếu có thì chúng là gì?
  • Những trình điều khiển nào sẽ xử lý bộ nhớ đệm (vì vậy các hoạt động đĩa không cần thiết được bỏ qua hoặc tối ưu hóa?)
  • Tôi biết từ trước đó /dev/shmlà một hệ thống tập tin trong RAM; mount | grep shmcho tôi báo cáo : none on /dev/shm type tmpfs (rw,nosuid,nodev). Điều đó có nghĩa là - trái ngược với /dev/sda- shmhệ thống tập tin đơn giản là thiếu ánh xạ (DMA) từ các phần tử "của chính nó" đến các địa chỉ bus đối với một thiết bị; và do đó tất cả các truy cập thông qua tmpfstrình điều khiển hệ thống tập tin kết thúc trong RAM thực tế?

4
Chào sdaau. Đây là một câu hỏi hay, nhưng độ dài của bài đăng này là quá mức, và có một số câu hỏi trong đó. Điều đáng khen ngợi là bạn đang cố gắng hiểu mọi thứ, thay vì chỉ hỏi những câu hỏi trợ giúp, đó là những gì chúng ta chủ yếu nhận được ở đây. Mỗi câu hỏi sẽ có một câu trả lời dài. Tôi khuyên bạn ít nhất nên chia bài viết của bạn thành các phần được xác định rõ ràng và đặt mỗi phần vào một câu hỏi riêng biệt, do đó tạo ra một loạt các câu hỏi.
Faheem Mitha

Sau đó, bạn có thể đăng những câu hỏi này với nhau hoặc tuần tự. Đó là Ok, tôi nghĩ, nếu bạn tham khảo một câu hỏi (hoặc câu hỏi) khác trong một câu hỏi.
Faheem Mitha

1
Nếu bạn muốn có mẹo làm sạch câu hỏi của mình, tôi khuyên bạn nên vào phòng chat và nói chuyện với những người ở đó. Chúng tôi đã nói về nó ở đây. :-)
Faheem Mitha

Rất cám ơn về nhận xét, @FaheemMitha - Tôi cũng có những nghi ngờ tương tự, nhưng tôi không thực sự chắc chắn làm thế nào để cắt giảm các câu hỏi - và cho đến bây giờ tôi có thể sử dụng trò chuyện cho nó (và tôi không thích sử dụng meta để hỏi về loại lời khuyên đó); Chắc chắn sẽ thử trò chuyện lần sau. Rất may, lần này nó đã có kết quả với một câu trả lời rất dễ chấp nhận ... Chúc mừng!
sdaau

@sdaau, bạn đã tìm ra cách giám sát truy cập đĩa chưa?
chuộc

Câu trả lời:


10

Bạn đã hỏi quá nhiều trong một câu hỏi, nhưng về mặt kỹ thuật thì không, như tôi đoán "cách hiểu này có đúng không" có thể được trả lời nhanh chóng: không. Nhưng đó không phải là một câu trả lời hữu ích.

Đầu tiên, bạn nói đúng ata_piixsd_moddường như được biên dịch vào kernel của bạn. Đó là một lựa chọn bạn thực hiện để cấu hình kernel kernel, bạn có thể bỏ qua nó, bao gồm nó, hoặc đưa nó vào như một mô-đun. (Tương tự với ext4).

Thứ hai, bạn đã giả sử viết đơn giản hơn nhiều so với thực tế. Phác thảo cơ bản về cách hoạt động của ghi là mã hệ thống tập tin đặt dữ liệu được ghi vào bộ nhớ, như một phần của bộ đệm-bộ đệm và đánh dấu nó là cần ghi ("bẩn"). (Trừ khi có quá nhiều thứ trong RAM, trong trường hợp đó, nó thực sự buộc phải thực hiện ghi ...)

Sau đó, nhiều thứ khác nhau (chẳng hạn như chuỗi bdflushkernel) thực sự xả các trang bẩn vào đĩa. Đây là khi bạn thấy các cuộc gọi thông qua sd, scsi, libata, ata_piix, bộ lập lịch io, PCI, v.v. Nhưng ghi đĩa, ít nhất là trong SATA, được xử lý bằng cách gửi các lệnh về cơ bản có nghĩa là "ghi sector X với dữ liệu Y". Nhưng nó chắc chắn không được xử lý bằng cách ánh xạ bộ nhớ toàn bộ đĩa (xem xét: bạn có thể sử dụng các đĩa lớn hơn 4GiB trên các máy 32 bit).

Bộ nhớ đệm được xử lý bởi hệ thống con quản lý bộ nhớ (không phải trình điều khiển), kết hợp với hệ thống tệp, lớp khối, v.v.

tmpfs là đặc biệt, về cơ bản là hoàn toàn bộ nhớ cache. Bộ nhớ cache đặc biệt của nó không bao giờ bị loại bỏ hoặc ghi lại (mặc dù nó có thể được hoán đổi). Bạn có thể tìm thấy mã ở mm/shmem.cvà một số nơi khác (cố gắng ack-grep --cc CONFIG_TMPFStìm chúng).

Về cơ bản, ghi vào đĩa đi qua một phần tốt trong các hệ thống con của kernel; mạng là mạng chính duy nhất tôi có thể nghĩ rằng nó không liên quan đến ví dụ của bạn. Giải thích chính xác nó đòi hỏi một nỗ lực dài cuốn sách; Tôi khuyên bạn nên tìm kiếm một.


Xin chào @derobert - cảm ơn rất nhiều vì câu trả lời của bạn; nó chứa loại thông tin chính xác mà tôi đã thiếu! Ban đầu tôi bắt đầu tìm kiếm một minh họa đơn giản về người dùng so với không gian kernel, nhưng tôi nhận ra ngay một bản ghi đĩa cứng không chính xác là thứ tôi hiểu đầy đủ, và không phải là tầm thường - cảm ơn vì đã xác nhận nó thực sự là một cuốn sách- nỗ lực lâu dài! Chúc mừng!
sdaau

Một lưu ý nhỏ: một số lời giải thích trong câu trả lời này (ví dụ: các trang bị bẩn) có thể quan sát được, nếu trong sudo bash...tập lệnh trong bộ nhớ OP: ftrace được tăng ( echo 8192 > $KDBGPATH/buffer_size_kb); và sync ;được thêm vào sau ./wtest ;cuộc gọi. Sau đó, tôi có thể nhìn thấy flush-8, kworker(dưới kthreaddtrong ps axf), và syncchính nó, như quy trình ftracekêu gọi các chức năng như ví dụ ata_bmdma_setup()(mà là một phần của libata, mà ata_piixđược xây dựng trên), hoặc get_nr_dirty_inodes().
sdaau

4

Vì vậy, câu hỏi đầu tiên của tôi là - tại sao tôi không thể quan sát mô-đun ata_piix ở đây, chỉ trong nhật ký thời gian khởi động? Có phải vì ata_piix (và sd) được xây dựng dưới dạng trình điều khiển tích hợp trong nhân (nguyên khối), trái ngược với việc được xây dựng dưới dạng mô-đun hạt nhân .ko (có thể tải)?

Bạn không cần phải đoán cấu hình của bạn là gì. Trên máy tôi có

$ uname -a
Linux orwell 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux

Tệp cấu hình dành cho kernel này được đặt tại /boot/config-3.2.0-4-amd64 .

Bạn hỏi về ata_piix. Tìm kiếm các .configtập tin trên , chúng tôi thấy CONFIG_ATA_PIIX=m. chúng ta có thể xác nhận điều này bằng cách làm

dlocate ata_piix.ko   

cách khác

dpkg -S ata_piix.ko

linux-image-3.2.0-4-amd64: /lib/modules/3.2.0-4-amd64/kernel/drivers/ata/ata_piix.ko

Vì vậy, ít nhất trong kernel của tôi, nó là một mô-đun.


Rất cám ơn về điều đó, @FaheemMitha - trong khi tôi đã nghe nói về (và đã sử dụng) tệp cấu hình trước đó, vì một số lý do tôi đã hoàn toàn quên nó trong ví dụ này; độc đáo phát hiện! :)Trên hệ thống của tôi, grep ATA_PIIX /boot/config-2.6.38-16-genericnói CONFIG_ATA_PIIX=y, mà có lẽ nên có nghĩa là trên hạt nhân này, ata_piixlà xây dựng "trong hạt nhân", và không phải là một mô-đun. Chúc mừng!
sdaau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.