امین سالم
برنامه نویس و متخصص Distributed Ledgers

HAL چیست؟ معرفی Hardware Abstraction Layer در لینوکس

HAامروز میخوایم بیشتر با HAL لایه ای که با سخت افزارها در ارتباط هستش و در واقع به صورت عامیانه ی خودمون لباس بسیار ساده تر از چیز یکه سخت افزارهای سیستمی ما هستن رو براشون آماده میکنه, آشنا بشیم. خب در قسمت قبلی در مورد ماهیت و کارایی هر کدوم از لایه ها در سطح سیستم عامل صحبت کردیم ولی خب خارج از لایه ی انتزاعی حتما با خودمون باید بگیم این مواردی که گفته شد رو چطوری میشه بهشون دسترسی داشت. در پوشه root دایرکتوری به نام sys داریم که HAL کل اطلاعات خودش رو اونجا نگه میداره. ابتدا با دستور cd sys به پوشه ی sys رفته سپس دستور ls رو برای نشان دادن محتوای این دایرکتوری میزنیم که محتویات زیر رو داخل سیستم خودتون مشاهده خواهید کرد:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
➜  /sys ls
block  class  devices   fs          kernel  power
bus    dev    firmware  hypervisor  module

برای نمونه دایرکتوری block, بلوک های سیستمی که اغلب هاردها یا فضاهای ذخیره سازی داخلی یا خارجی سیستم هستن رو نشون میده. این فضاها میتونن هارد داخلی, خارجی, USB ها و Logical Volume هایی باشند که موقع نصب یا پیکربندی سیستم ایجاد میشوند.

➜  /sys cd block 
➜  block ls
dm-0  dm-1  sda  sr0

اگر برای نمونه وارد پوشه ی sda بشیم, این امکانات و مشخصات و تنظیمات رو به من خواهد داد:

➜  block cd sda 
➜  sda ls
alignment_offset   events             integrity  sda1  sda7    subsystem
bdi                events_async       power      sda2  sda8    trace
capability         events_poll_msecs  queue      sda3  sda9    uevent
dev                ext_range          range      sda4  size
device             holders            removable  sda5  slaves
discard_alignment  inflight           ro         sda6  stat

در کل یک سری اطلاعات به صورت فایل از سخت افزارهای سیستم در اختیار قرار میده و کاری به اسم و مدل سخت افزارهای ما نداره, فقط میگه هارد تو فلان مدله و این امکانات رو در اختیار میذاره. در مورد دایرکتوری مربوط به HAL که اطلاعات سخت افزاری رو نشون میده صحبت کردیم ولی خب لینوکس به باز بودن و قابلیت تغییر مشهوره و چقد خوب میشه اگه بتونیم به بعضی از سخت افزارهامون دسترسی و باهاشون تعامل داشته باشیم.

در پوشه ی root دایرکتوری به نام proc وجود داره که ما علاوه بر دیدن پروسس های سیستم میتونیم به سخت افزارهامون و اطلاعات کرنل (هسته سیستم عامل) مون به صورت انتزاعی هم دسترسی داشته باشیم(اطلاعاتی رو ازشون بخونیم یا روشون بنویسیم.)

➜  ~ cd /proc
➜  /proc ls
1     1326  1505  184   20    30    459   7     832            loadavg
10    1336  1516  1840  2066  31    46    7010  834            locks
1032  1339  1547  1849  2067  3190  462   720   9              mdstat
11    1343  1592  185   2068  32    4641  721   938            meminfo
110   1348  16    1851  2080  33    47    724   acpi           misc
111   1351  1606  1853  2082  34    479   726   asound         modules
112   1357  1611  1869  2090  3466  48    727   buddyinfo      mounts
1129  1363  1622  1870  21    36    480   74    bus            mtrr
113   1383  1626  1875  2101  3694  4875  745   cgroups        net
1130  14    1628  1883  2115  37    49    747   cmdline        pagetypeinfo
1131  1404  1633  1885  2119  3734  50    748   consoles       partitions
1133  1405  1636  1886  2122  3778  51    752   cpuinfo        sched_debug
1134  1412  1673  1887  2126  378   5167  753   crypto         schedstat
114   1415  1678  1889  2154  38    52    754   devices        scsi
115   1426  1681  1893  2184  3811  53    755   diskstats      self
116   1427  1693  1894  22    385   54    756   dma            slabinfo
117   1434  1698  1895  2212  386   542   758   driver         softirqs
118   1447  17    1901  2213  387   55    759   execdomains    stat
1184  1448  1714  1917  2254  388   56    764   fb             swaps
119   1449  1728  1927  2270  3882  565   769   filesystems    sys
12    1450  1737  1928  23    389   58    776   fs             sysrq-trigger
120   1457  1751  1934  24    39    589   785   interrupts     sysvipc
121   1458  1755  1948  2479  4     59    786   iomem          thread-self
122   1464  1757  1961  25    40    594   787   ioports        timer_list
123   1465  1762  1962  2592  4085  6     788   irq            tty
1264  1468  1764  1974  26    4152  60    789   kallsyms       uptime
1268  1474  1775  1976  2649  4161  612   790   kcore          version
1270  1476  1777  1977  27    4241  632   791   keys           vmallocinfo
1275  1477  1783  1978  28    43    635   8     key-users      vmstat
1277  1478  18    1979  2812  44    6460  806   kmsg           zoneinfo
13    1494  182   1980  2822  448   6746  811   kpagecgroup
130   1498  1822  1983  2840  45    6769  814   kpagecount
131   15    1829  1984  29    4503  697   823   kpageflags
1322  1501  1836  2     2978  451   698   830   latency_stats

چون یادگیری ما قرار هست ساده باشه و نمیخوایم با تنظیمات پیچیده جلو بریم به سراغ پوشه ی procsysfs خواهیم رفت و که فایلی با عنوان file_max که حداکثر تعداد باز بودن فایل درون سیستم عامل از طریف یک کاربر را مشخص میکند:

➜  fs ls
aio-max-nr         file-nr           mqueue                protected_hardlinks
aio-nr             inode-nr          nr_open               protected_symlinks
binfmt_misc        inode-state       overflowgid           quota
dentry-state       inotify           overflowuid           suid_dumpable
dir-notify-enable  lease-break-time  pipe-max-size
epoll              leases-enable     pipe-user-pages-hard
file-max           mount-max         pipe-user-pages-soft
➜  fs cat file-max 
385672

که به صورت کاملا Live قابلیت تغییر

[root@fedora]/proc/sys/fs# echo 100000 > file-max 
[root@fedora]/proc/sys/fs# cat file-max 
100000

همچنین در پوشه ی proc به اطلاعات دیگه مثل اطلاعات cpu و ریز جزيیات هر پروسسور خودتون و همچنین اطلاعات حافظه به منظور درک بهتر نسبت به جزییات سیستم خودتون داشته باشید, میتونید با دستور زیر دسترسی پیدا کنید:

➜  /proc cat cpuinfo| less
➜  /proc cat meminfo | less

و همچنین تمام بلوک های حافظه قابل خواندن سیستمی را هم از طریق دستور زیر میتوانیم ببینیم :

➜  /proc cat mounts

تنظیمات جالب شبکه ای سطح کرنل سیستم عامل هم داخل پوشه ی procsysnet موجود میباشد, که شما میتونید تنظیمات مربوط به حافظه tcp در سیستم خودتون (tcp-mem) و یا اطلاعات مربوط به پروتکل icmp (دریافت ایمیل) و اطلاعات مربوط به بسته های ip را تغییر دهید. برای نمونه بعد از گرفتن دستور cat ip-forward میتونید مقدار این دستور رو دست خوش تغییر کنید در واقع این فایل به شما میگه که آیا سیستم شما نقض روتر را ایفا میکند و ip ها را از از خود به مسیر دیگری عبور میدهد

➜  /proc cd sys/net/ipv4 
➜  ipv4 ls

فقط این نکته رو فراموش نکنیم که پوشه proc یک دایرکتوری مجازی از تنظیمات سطح کرنل میباشد و اگر واقعا قصد تغییر دایمی این تنظیمات رو بر روی سیستم خود داریم باید از طریق دایرکتوری etc اقدام به تغییر این موارد در سطح کرنل نماییم.


امین سالم
امین سالم

برنامه نویس و متخصص Distributed Ledgers

فارغ التحصیل رشته سخت افزار دانشگاه شاهد هستم ، بیشتر فعالیتی که در حوزه شبکه داشته ام در حوزه زیرساخت های ارتباطی سیسکو و مایکروسافت بوده است ، دوره های CISCO(CCNA_CCNP) و MCSE را در مجتمع فنی تهران شعبه ابن سینا سپری کرده ام ، در حوزه رباتیک دارای عناوین مختلف کشوری در مسابقات داخلی هستم و علاقه مند به کارهای عملی در حوزه شبکه می باشد ، در این راستا در چندین شرکت بصورت پروژه ای و کارآموزی پروژه هایی در حوزه زیرساختی ، مایکروسافتی و VOIP را نیز انجام داده ام ، بصورت کلی دستی در برنامه نویسی و

نظرات