কার্নেল স্পেসে একটি হার্ড-ডিস্ক রাইটিং পর্যবেক্ষণ (ড্রাইভার / মডিউল সহ)


13

এই পোস্টটি কিছুটা ঘন / অগোছালো থাকলে অগ্রিম ক্ষমা চাইছি, তবে এটি আরও ভালভাবে গঠনের জন্য আমার খুব কষ্ট হচ্ছে ... মূলত, হার্ড ডিস্ক লেখার পরে কী ঘটে যায় তা আমি অধ্যয়ন করতে চাই এবং আমি জানতে চাই:

  • নীচে আমার বোঝাটি কি সঠিক - এবং যদি না হয় তবে আমি কোথায় ভুল করছি?
  • ডিস্ক লেখার সময় পিসিতে ঘটে যাওয়া সমস্ত দিক সম্পর্কে লগ ডেটা "ক্যাপচার" করার কি আরও ভাল সরঞ্জাম আছে?

আরও বিশদে - প্রথমে, আমি যে ওএসটি ব্যবহার করছি তা হ'ল:

$ 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

সুতরাং, আমার কাছে নিম্নলিখিতগুলি সহজ (উদাহরণস্বরূপ অপারেশনগুলির ব্যর্থতার জন্য সাধারণ চেকগুলি এড়িয়ে যায়) ব্যবহারকারী-স্পেস সি প্রোগ্রামে 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;
}

আমি এটি দিয়ে তৈরি gcc -g -O0 -o wtest wtest.c। এখন, যেহেতু আমি লেখার চেষ্টা করছি /tmp, আমি নোট করছি যে এটি মূলের নীচে একটি ডিরেক্টরি /- সুতরাং আমি যাচ্ছি 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)
...

সুতরাং, আমার মূল ফাইল সিস্টেমটি ডিভাইসের /একটি বিভাজন /dev/sda(এবং আমি অন্যান্য পার্টিশনগুলি "স্ট্যান্ডলোন" ডিস্ক / মাউন্ট হিসাবেও ব্যবহার করছি)। এই ডিভাইসের জন্য ড্রাইভারটি সন্ধান করতে, আমি ব্যবহার করি 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
...

সুতরাং, /dev/sdaহার্ড ডিস্কটি স্পষ্টতই ata_piix(এবং 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

অনেক কিছু স্থগিত করার সাথে সাথে আমাকে পুরনো সিসলগ থেকে টানতে হবে, তবে উপরেরটি বুট করার সময় সিসলগ থেকে যথাযথ স্নিপেটের মতো মনে হয়, যেখানে ata_piix(এবং sd) ড্রাইভার প্রথমবারের জন্য লাথি মারছে।

আমার প্রথম বিভ্রান্তির বিষয়টি হ'ল আমি অন্যথায় ata_piixবা sdড্রাইভারগুলি পর্যবেক্ষণ করতে পারি না :

$ 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

সুতরাং আমার প্রথম প্রশ্নটি হল - কেন আমি ata_piixএখানে কেবলমাত্র বুট-টাইম লগগুলিতে মডিউলটি পর্যবেক্ষণ করতে পারি না ? এটি ata_piix( কারণ sd) (একচেটিয়া) কার্নেলটিতে (লোডযোগ্য) .koকার্নেল মডিউল হিসাবে নির্মিত হওয়ার বিপরীতে, (এবং ) বিল্ট-ইন ড্রাইভার হিসাবে নির্মিত হয়েছে ?

ডান - তাই এখন, আমি ftraceলিনাক্স অন্তর্নির্মিত ফাংশন ট্রেসার দিয়ে প্রোগ্রামটি চালানোর পরে কী ঘটে তা পর্যবেক্ষণ করার চেষ্টা করছি ।

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
'

... এবং এখানে ftraceলগ সম্পর্কিত একটি স্নিপেট রয়েছে write:

4604.352690 | 0) west-31632 | | sys_writ () {
 4604.352690 | 0) west-31632 | 0.750 আমাদের | fget_light ();
 4604.352692 | 0) west-31632 | | vfs_writ () {
 4604.352693 | 0) west-31632 | | rw_verify_area () {
 4604.352693 | 0) west-31632 | | সিকিউরিটি_ফায়াল_পরিমাণ () {
 4604.352694 | 0) west-31632 | | apparmor_file_permission () {
 4604.352695 | 0) west-31632 | 0.811 আমাদের | common_file_perm ();
 4604.352696 | 0) west-31632 | 2.198 আমাদের | }
 4604.352697 | 0) west-31632 | 3.573 আমাদের | }
 4604.352697 | 0) west-31632 | 4.979 আমাদের | }
 4604.352698 | 0) west-31632 | | do_sync_writ () {
 4604.352699 | 0) west-31632 | | ext4_file_writ () {
 4604.352700 | 0) west-31632 | | জেনেরিক_ফাইল_আইও_ রাইট () {
 4604.352701 | 0) west-31632 | | মিটেক্স_লক () {
 4604.352701 | 0) west-31632 | 0.666 আমাদের | _cond_resched ();
 4604.352703 | 0) west-31632 | 1.994 আমাদের | }
 4604.352704 | 0) west-31632 | | __ জেনেরিক_ফিল_আইও_রাইট () {
...
 4604.352728 | 0) west-31632 | | ফাইল_আপডেট_টাইম () {
...
 4604.352732 | 0) west-31632 | 0.756 আমাদের | mnt_want_write_file ();
 4604.352734 | 0) west-31632 | | __মার্ক_ইনোড_ডার্টি () {
...
 4604.352750 | 0) west-31632 | | ext4_mark_inode_dirty () {
 4604.352750 | 0) west-31632 | 0.679 আমাদের | _cond_resched ();
 4604.352752 | 0) west-31632 | | ext4_re সংরক্ষণ_inode_writ () {
...
 4604.352777 | 0) west-31632 | | __ext4_j Journal_get_writ_access () {
...
 4604.352795 | 0) west-31632 | | ext4_mark_iloc_dirty () {
...
 4604.352806 | 0) west-31632 | | __ext4_j Journal_stop () {
...
 4604.352821 | 0) west-31632 | 0.684 আমাদের | mnt_drop_write ();
 4604.352822 | 0) west-31632 | + 93.541 আমাদের | }
 4604.352823 | 0) west-31632 | | জেনেরিক_ফায়াল_ফারড_রাইট () {
 4604.352824 | 0) west-31632 | 0.654 আমাদের | iov_iter_advance ();
 4604.352825 | 0) west-31632 | | জেনেরিক_পারফর্ম_উইট () {
 4604.352826 | 0) west-31632 | 0.709 আমাদের | iov_iter_fault_in_readable ();
 4604.352828 | 0) west-31632 | | ext4_da_writ_begin () {
 4604.352829 | 0) west-31632 | | ext4_j Journal_start_sb () {
...
 4604.352847 | 0) west-31632 | 1.453 আমাদের | __block_write_begin ();
 4604.352849 | 0) west-31632 | + 21.128 আমাদের | }
 4604.352849 | 0) west-31632 | | iov_iter_copy_from_user_atomic () {
 4604.352850 | 0) west-31632 | | __kmap_atomic () {
...
 4604.352863 | 0) west-31632 | 0.672 আমাদের | mark_page_accessed ();
 4604.352864 | 0) west-31632 | | ext4_da_writ_end () {
 4604.352865 | 0) west-31632 | | জেনেরিক_রাইট_এন্ড () {
 4604.352866 | 0) west-31632 | | block_writ_end () {
...
 4604.352893 | 0) west-31632 | | __ext4_j Journal_stop () {
...
 4604.352909 | 0) west-31632 | 0.655 আমাদের | mutex_unlock ();
 4604.352911 | 0) west-31632 | 0.727 আমাদের | generic_write_sync ();
 4604.352912 | 0) west-31632 | ! 212.259 আমাদের | }
 4604.352913 | 0) west-31632 | ! 213.845 আমাদের | }
 4604.352914 | 0) west-31632 | ! 215.286 আমাদের | }
 4604.352914 | 0) west-31632 | 0.685 আমাদের | __fsnotify_parent ();
 4604.352916 | 0) west-31632 | | fsnotify () {
 4604.352916 | 0) west-31632 | 0.907 আমাদের | __srcu_read_lock ();
 4604.352918 | 0) west-31632 | 0.685 আমাদের | __srcu_read_unlock ();
 4604.352920 | 0) west-31632 | 3.958 আমাদের | }
 4604.352920 | 0) west-31632 | ! 228.409 আমাদের | }
 4604.352921 | 0) west-31632 | ! 231.334 আমাদের | }

এটি আমার বিভ্রান্তির দ্বিতীয় বিষয় - আমি প্রত্যাশা অনুযায়ী write()কার্নেল-স্পেসের সাথে ব্যবহারকারীর স্থানটি পর্যবেক্ষণ করতে পারি sys_write(); এবং এর মধ্যে sys_write()আমি সুরক্ষা সম্পর্কিত ফাংশন (উদাঃ apparmor_file_permission()), "জেনেরিক" রাইটিং ফাংশন (উদাঃ generic_file_aio_write()), ext4ফাইল সিস্টেম সম্পর্কিত ফাংশন (উদাঃ ext4_journal_start_sb()) পর্যবেক্ষণ করি - তবে আমি (বা ) ড্রাইভারের সাথে সম্পর্কিত কিছু পর্যবেক্ষণ করি না ?!ata_piixsd

পৃষ্ঠা ট্রেসিং ও প্রোফাইলিং - Yocto প্রকল্প ব্যবহার দাড়ায় blkমধ্যে রেখক ftraceসম্পর্কে ব্লক ডিভাইস অপারেশন আরও তথ্য পেতে, কিন্তু এটা এই উদাহরণে আমার জন্য কিছুই রিপোর্ট। এছাড়াও, লিনাক্স ফাইলসিস্টেম ড্রাইভারস - অ্যানন ইন্লোরিওন (টিউটরফস) পরামর্শ দেয় যে ফাইল সিস্টেমগুলি (ক্যান ?) এছাড়াও কার্নেল মডিউল / ড্রাইভার হিসাবে প্রয়োগ করা যেতে পারে, এবং আমি অনুমান করছি যে এটিও ext4একই অবস্থা।

অবশেষে, আমি শপথ করতে পারলাম যে function_graphট্রেসারের দেখানো ফাংশনের পাশে আমি বর্গাকার বন্ধনীগুলিতে ড্রাইভারের নামটি আগে পর্যবেক্ষণ করেছি , তবে আমার ধারণা যে আমি মিশ্রিত জিনিসগুলি পেয়েছি - এটি সম্ভবত স্ট্যাকের (পেছনের) চিহ্নগুলিতে প্রদর্শিত হতে পারে তবে তা নয় ফাংশন গ্রাফে। তদতিরিক্ত, আমি পরিদর্শন করতে পারি /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]
...

... এবং উত্স লিনাক্স / ড্রাইভার / আতা / আতা_পিক্স.সি. এর সাথে পরীক্ষা করে নিশ্চিত করুন যে উদাহরণস্বরূপ piix_init_sata_mapএটি একটি ফাংশন ata_piix। যা সম্ভবত আমাকে বলতে হবে: যে মডিউলগুলি কার্নেলের মধ্যে সংকলিত হয় (সুতরাং তারা একঘেয়ে কার্নেলের একটি অংশ হয়ে যায়) তারা কোন মডিউল থেকে আসে সে সম্পর্কে তথ্য "হারান"; তবে লোডযোগ্য মডিউলগুলি যা পৃথক .koকার্নেল অবজেক্ট হিসাবে নির্মিত হয় সেগুলি সংরক্ষণ করে (উদাহরণস্বরূপ [psmouse]বর্গাকার বন্ধনীতে দেখানো)। সুতরাং, ftraceলোডযোগ্যযোগ্য কার্নেল মডিউলগুলি থেকে আসা ফাংশনগুলির জন্য কেবল "উত্সত মডিউল" তথ্য প্রদর্শন করা যায়। এটা কি সঠিক?

উপরের বিষয়টি বিবেচনায় নেওয়া, এই প্রক্রিয়াটি সম্পর্কে বর্তমানে আমার বোঝার বিষয়টি:

  • বুট করার সময় ata_piixড্রাইভারটি /dev/sdaহার্ড ডিস্কের মধ্যে একটি ডিএমএ (?) মেমরি ম্যাপিং স্থাপন করে
    • এই কারণে, সব ভবিষ্যতের ব্যবহারের /dev/sdaমাধ্যমে ata_piixকার্নেল (যেমন, অনুসরণযোগ্য নয়) স্বচ্ছ হবে - সব থেকে কার্নেল দেখতে হবে, শুধু লেখা আছে / মেমরি অবস্থানে লিখেছেন (অগত্যা নির্দিষ্ট অনুসরণযোগ্য কার্নেল ফাংশন কল), যা function_graphট্রেসার দ্বারা রিপোর্ট করা হয় না
  • বুট করার সময় sdড্রাইভারটি পার্টিশনগুলির পার্টিশনগুলির আরও "পার্স" করবে /dev/sda, তাদের উপলব্ধ করবে এবং সম্ভবত পার্টিশনের মধ্যে মেমরি ম্যাপিংগুলি পরিচালনা করবে <-> ডিস্ক ডিভাইস
    • আবার, sdএটি কার্নেলের সাথে স্বচ্ছ হয়ে অ্যাক্সেস অপারেশন করা উচিত
  • যেহেতু উভয়ই ata_piixএবং sdইন-কার্নেল সংকলিত রয়েছে, এমনকি যদি তাদের কিছু ক্রিয়াকলাপ ক্যাপচার হওয়ার পরেও ঘটে তবে ftraceআমরা কোন মডিউলটি আসতে পারি তার তথ্য (উত্স ফাইলগুলির সাথে "ম্যানুয়াল" পারস্পরিক সম্পর্ক ছাড়া) পেতে পারি না
  • পরবর্তীতে, mountএকটি পার্টিশন এবং সংশ্লিষ্ট ফাইল সিস্টেম ড্রাইভারের মধ্যে সম্পর্ক স্থাপন / আবশ্যক স্থাপন করে (এই ক্ষেত্রে ext4)
    • এই বিন্দু থেকে, মাউন্ট করা ফাইল সিস্টেমের সমস্ত অ্যাকসেসগুলি ext4ফাংশন দ্বারা পরিচালিত হবে - যা কার্নেল দ্বারা সনাক্তযোগ্য; তবে ext4ইন-কার্নেল হিসাবে সংকলিত আছে, ট্রেসার আমাদের উত্সের মডিউল তথ্য দিতে পারে না
  • সুতরাং, পর্যবেক্ষণ করা "জেনেরিক" লিখেছেন, ext4ফাংশনগুলির মাধ্যমে বলা হয়, শেষ পর্যন্ত মেমরির অবস্থানগুলিতে অ্যাক্সেস করতে পারে, যার ম্যাপিংটি প্রতিষ্ঠিত করেছে ata_piix- তবে এগুলি ছাড়াও, ata_piixডেটা স্থানান্তরে সরাসরি হস্তক্ষেপ করে না (এটি সম্ভবত ডিএমএ দ্বারা পরিচালিত হয় (প্রসেসরের বাইরেও) (গুলি) এবং এটি এতে স্বচ্ছ)।

এই বোঝাপড়াটি কি সঠিক?

সম্পর্কিত কিছু অনুচ্ছেদ:

  • উপরের আমার সেটআপে, আমি একটি পিসিআই ডিভাইস ড্রাইভার ( ata_piix) এবং একটি ফাইল সিস্টেম ড্রাইভার ( ext4) সনাক্ত করতে পারি; তবে "লিখন" কার্যকরকরণের পথে কোথাও চরিত্র বা ব্লক ড্রাইভার ব্যবহার করা হয়েছে এবং যদি তা হয় তবে সেগুলি কোনটি?
  • এই ড্রাইভারগুলির মধ্যে কে কেচিং পরিচালনা করবে (তাই অপ্রয়োজনীয় ডিস্ক ক্রিয়াকলাপ বাদ দেওয়া বা অনুকূলিত করা যায়?)
  • আমি এর আগে থেকেই জানি /dev/shmর্যামের একটি ফাইল সিস্টেম; mount | grep shmআমার জন্য রিপোর্ট: none on /dev/shm type tmpfs (rw,nosuid,nodev)। এর অর্থ কি - এর বিপরীতে /dev/sda- shmফাইল সিস্টেমটিতে কেবল "নিজস্ব" অ্যাড্রেসগুলি থেকে কোনও ডিভাইসের দিকে বাসের ঠিকানাগুলিতে (ডিএমএ) ম্যাপিংয়ের অভাব হয়; এবং এইভাবে tmpfsফাইল সিস্টেমের মাধ্যমে সমস্ত অ্যাক্সেসগুলি প্রকৃত র‌্যামে শেষ হয়?

4
হাই sdaau। এটি একটি ভাল প্রশ্ন, তবে এই পোস্টের দৈর্ঘ্য অত্যধিক এবং সেখানে বেশ কয়েকটি প্রশ্ন রয়েছে। এটি প্রশংসনীয় যে আপনি কেবল সাহায্যের ডেস্কের প্রশ্ন জিজ্ঞাসার চেয়ে বিষয়গুলি বোঝার চেষ্টা করছেন যা আমরা এখানে প্রায়শই পাই। এই প্রতিটি প্রশ্নের নিজেরাই একটি দীর্ঘ উত্তর যোগ্যতা অর্জন করবে। আমি কমপক্ষে আপনার পোস্টটি পরিষ্কারভাবে সংজ্ঞায়িত টুকরো টুকরো টুকরো টুকরো করে বিভক্ত করার এবং প্রতিটি টুকরোকে একটি পৃথক প্রশ্নে রাখার পরামর্শ দিচ্ছি, এইভাবে প্রশ্নের ধারাবাহিক তৈরি করা উচিত।
ফাহিম মিঠা

তারপরে আপনি এই প্রশ্নগুলি একসাথে বা ক্রমানুসারে পোস্ট করতে পারেন। এটা ঠিক আছে, আমি মনে করি, যদি আপনি কোনও প্রশ্নের মধ্যে অন্য প্রশ্ন (বা প্রশ্ন) উল্লেখ করেন।
ফাহিম মিঠা

1
আপনি যদি আপনার প্রশ্ন পরিষ্কার করার বিষয়ে টিপস চান তবে আমি আপনাকে চ্যাটরুমে প্রবেশ করার পরামর্শ দিই এবং সেখানকার লোকদের সাথে কথা বলব। আমরা ইতিমধ্যে এখানে এটি সম্পর্কে কথা বলা হয়েছে। :-)
ফাহিম মিঠা

@ ফাহিমমিঠা এই মন্তব্যের জন্য অনেক ধন্যবাদ - আমারও একই রকম সন্দেহ ছিল, তবে প্রশ্নগুলি কীভাবে কাটানো যায় তা সম্পর্কে আমি সত্যিই নিশ্চিত ছিলাম না - এবং এখনও অবগত ছিলাম না আমি এর জন্য চ্যাটটি ব্যবহার করতে পারি (এবং আমি আগ্রহী ছিলাম না) এই জাতীয় পরামর্শ সম্পর্কে জিজ্ঞাসা করার জন্য মেটা ব্যবহার করে); অবশ্যই পরের বার চ্যাটটি চেষ্টা করে দেখবে। ধন্যবাদ, এবার এটি একটি খুব গ্রহণযোগ্য উত্তর দিয়ে কাজ করেছে ... চিয়ার্স!
sdaau

@ sdaau, আপনি কীভাবে ডিস্ক অ্যাক্সেস পর্যবেক্ষণ করবেন তা বুঝতে পেরেছেন?
আরশ

উত্তর:


10

আপনি একটি প্রশ্নে অনেক বেশি প্রশ্ন জিজ্ঞাসা করেছেন - ভাল, প্রযুক্তিগতভাবে নয়, যেমনটি আমার ধারণা, "এই বোঝাটি কি সঠিক" দ্রুত উত্তর দেওয়া যেতে পারে: না। তবে এটি কোনও কার্যকর উত্তর নয়।

প্রথমত, আপনি ঠিক বলেছেন ata_piixএবং sd_modআপাতদৃষ্টিতে আপনার কার্নেলের সাথে সংকলন করা হচ্ছে। এটি আপনি কার্নেলটি কনফিগার করার একটি পছন্দ — আপনি এটি বাদ দিতে পারেন, অন্তর্ভুক্ত করতে পারেন, বা মডিউল হিসাবে অন্তর্ভুক্ত করতে পারেন। (এক্সটোর সাথে একই)।

দ্বিতীয়ত, আপনি ধরে নিয়েছেন যে লেখাগুলি আসলে সেগুলির চেয়ে অনেক সহজ be একটি লিখন কীভাবে কাজ করে তার মূল রূপরেখা হ'ল ফাইল সিস্টেম কোডটি বাফার-ক্যাশের অংশ হিসাবে মেমরিতে লেখার জন্য ডেটা রাখে এবং এটি লেখার প্রয়োজন অনুসারে চিহ্নিত করে ("নোংরা") হিসাবে চিহ্নিত করে। (যতক্ষণ না র‌্যামে ইতিমধ্যে এর পরিমাণের খুব বেশি থাকে, সেই ক্ষেত্রে এটি আসলে লিখতে বাধ্য হয় ...)

পরে, বিভিন্ন জিনিস (যেমন bdflushকার্নেল থ্রেড) আসলে নোংরা পৃষ্ঠাগুলি ডিস্কে ফ্লাশ করে। এটি যখন আপনি এসডি, এসসিসি, লিবাটা, আটা_পিক্স, আইও শিডিউলার, পিসিআই ইত্যাদির মাধ্যমে কলগুলি দেখতে পেতেন তখন যখন সম্ভবত এই লিখনের সাথে ডিএমএ জড়িত রয়েছে, তখন ডেটা স্থানান্তরিত হতে পারে এবং সম্ভবত কমান্ডও রয়েছে। তবে ডিস্ক লেখেন, কমপক্ষে SATA- এ, আদেশগুলি প্রেরণ দ্বারা পরিচালিত হয় যার মূলত "ডেটা ওয়াই সহ সেক্টর এক্স লিখুন" mean তবে এটি অবশ্যই পুরো ডিস্কটিকে মেমরি-ম্যাপিংয়ের মাধ্যমে হ্যান্ডেল করা হয়নি (বিবেচনা করুন: আপনি 32-বিট মেশিনে 4GiB এর চেয়ে বেশি বড় ডিস্কগুলি ব্যবহার করতে পারেন)।

ক্যাচিং ফাইল সিস্টেম, ব্লক স্তর ইত্যাদির সাথে মিলে মেমরি ম্যানেজমেন্ট সাবসিস্টেম (ড্রাইভার নয়) দ্বারা পরিচালিত হয় aching

tmpfsবিশেষ, এটি মূলত সম্পূর্ণরূপে ক্যাশে। এটি কেবলমাত্র বিশেষ ক্যাশে যা কখনই বাতিল বা লিখিত হয় না (যদিও এটি সরিয়ে দেওয়া যায়)। আপনি কোড mm/shmem.cএবং অন্যান্য বেশ কয়েকটি জায়গায় সন্ধান করতে পারেন ( ack-grep --cc CONFIG_TMPFSসেগুলি সন্ধান করার চেষ্টা করুন)।

মূলত, ডিস্কে লেখার জন্য কার্নেলের সাব-সিস্টেমের একটি ভাল অংশ জুড়ে যায়; নেটওয়ার্কিং হ'ল একমাত্র প্রধান যা আমি আপনার উদাহরণের সাথে জড়িত তা ভাবতে পারি না। সঠিকভাবে ব্যাখ্যা করার জন্য একটি বইয়ের দৈর্ঘ্য প্রচেষ্টা প্রয়োজন; আমি একটি সন্ধান করার পরামর্শ দিচ্ছি।


হাই @ডারবার্ট - আপনার উত্তরের জন্য অনেক অনেক ধন্যবাদ; এটিতে আমি যে সঠিক তথ্যটি হারিয়েছিলাম তা রয়েছে! আমি প্রথমে ব্যবহারকারী বনাম কার্নেল স্পেসের একটি সাধারণ চিত্র সন্ধানের সাথে শুরু করেছিলাম, তবে আমি শীঘ্রই বুঝতে পেরেছিলাম একটি হার্ড-ডিস্ক রাইটিং পুরোপুরি বুঝতে পারার মতো কিছু নয়, এবং এটি তুচ্ছ নয় - এটি নিশ্চিত করার জন্য ধন্যবাদ একটি বই- দৈর্ঘ্য প্রচেষ্টা! চিয়ার্স!
sdaau

একটি ছোট নোট: এই উত্তরের কিছু ব্যাখ্যা (উদাহরণস্বরূপ নোংরা পৃষ্ঠাগুলি ফ্লাশ করছে) পর্যবেক্ষণযোগ্য, যদি sudo bash...ওপিতে স্ক্রিপ্টে থাকে: ftrace মেমরিটি বাড়ানো হয় ( echo 8192 > $KDBGPATH/buffer_size_kb); এবং কল করার sync ;পরে যুক্ত করা হয় ./wtest ;। তারপর আমি দেখতে পারেন flush-8, kworker(অধীনে kthreaddমধ্যে ps axf), এবং syncপ্রসেস হিসেবে খোদ ftraceযেমন মতো কাজগুলির কলিং ata_bmdma_setup()(যা অংশ libata, যা ata_piixউপর তৈরী করে), অথবা get_nr_dirty_inodes()
sdaau

4

সুতরাং আমার প্রথম প্রশ্নটি হল - আমি এখানে বুট-টাইম লগগুলিতে কেন এটা_পিক্স মডিউলটি পর্যবেক্ষণ করতে পারি না? এটি কি কারণ আটা_পিক্স (এবং এসডি) (একচেটিয়া) কার্নেলের বিল্ট-ইন ড্রাইভার হিসাবে নির্মিত হয়েছে (লোডযোগ্য)। কো কার্নেল মডিউল হিসাবে নির্মিত হওয়ার বিপরীতে?

আপনার কনফিগারেশনটি কী তা অনুমান করার দরকার নেই। আমার মেশিনে

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

কনফিগারেশন ফাইলটি এই কার্নেলের জন্য অবস্থিত /boot/config-3.2.0-4-amd64

আপনি সম্পর্কে জিজ্ঞাসা ata_piix। উপরের .configফাইলটি সন্ধান করছি, আমরা দেখছি CONFIG_ATA_PIIX=m। আমরা এটি করে নিশ্চিত করতে পারি

dlocate ata_piix.ko   

অন্যথায়

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

কমপক্ষে আমার কার্নেলের মধ্যে এটি একটি মডিউল।


@ ফাহিমমিঠা - এর জন্য অনেক ধন্যবাদ - আমি এর আগে কনফিগার ফাইলটি (এবং ব্যবহৃত) শুনেছি, কিছু কারণে আমি এই উদাহরণে সম্পূর্ণরূপে ভুলে গিয়েছি; সুন্দর দাগ! :)আমার সিস্টেমে, grep ATA_PIIX /boot/config-2.6.38-16-genericবলছে CONFIG_ATA_PIIX=y, যার অর্থ সম্ভবত এই কার্নেলের মধ্যে হওয়া উচিত, ata_piixএটি "ইন-কার্নেল" তৈরি করা হয়, মডিউল হিসাবে নয়। চিয়ার্স!
sdaau
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.