


24 jam untuk mengetahui tentang kernel Linux dan isu yang berkaitan dengan pelaksanaan sistem fail Linux
Penggunaan Linux dan pengaturcaraan program ruang pengguna berkait rapat dengan sistem fail. Anda mungkin sudah biasa dengan konsep sistem fail, jadi saya tidak akan menerangkannya terlalu banyak. Lagipun, selagi anda boleh memahami konsep ini, mereka yang ingin mempelajari lebih lanjut sentiasa boleh mendapatkan lebih banyak maklumat melalui enjin carian seperti Baidu. Sekarang saya akan memberi tumpuan kepada sistem fail maya Linux.
Sistem fail maya ialah salah satu ciri penting Linux, yang menyokong banyak sistem fail yang berbeza. Struktur sistem fail ditunjukkan dalam rajah di bawah: [Lihat teks asal untuk gambar]
VFS (Sistem Fail Maya) dalam gambar di atas bergantung pada struktur data untuk menyimpan gambaran umum sistem fail Struktur data disenaraikan seperti berikut:
-
Struktur blok super: menyimpan maklumat yang berkaitan dengan sistem fail yang dipasang
-
Struktur nod indeks: menyimpan maklumat tentang fail
-
Struktur fail: menyimpan maklumat tentang fail yang dibuka oleh proses
-
Struktur kemasukan direktori: menyimpan maklumat tentang nama laluan dan fail yang ditunjukkan oleh nama laluan.
Inti Linux menggunakan pembolehubah global untuk menyimpan penunjuk kepada struktur yang dinyatakan sebelum ini Semua struktur disimpan dalam senarai terpaut berganda. Struktur ini menggunakan medan list_head, gunakannya untuk menunjuk ke elemen sebelumnya dalam senarai terpaut Jadual berikut ialah pembolehubah global yang disimpan oleh kernel dan jenis senarai terpaut yang ditunjukkan oleh pembolehubah ini (pembolehubah global yang berkaitan dengan VFS. )
Pembolehubah global | Jenis struktur |
---|---|
super_blocks | super_block |
sistem_fail | jenis_sistem_fail |
pergigian_tidak digunakan | pergigian |
vfsmntlist | vfsmount |
inode_in_use | inod |
inode_unused | inod |
Struktur super_block, file_system_type, dentry, dan vfsmoubt semuanya disimpan dalam senarai terpautnya sendiri Nod indeks boleh mendapati diri mereka berada pada inode_in_use global atau inode_unused, atau pada senarai terpaut tempatan yang sangat pantas.
Selain struktur VFS utama, terdapat beberapa struktur lain yang berinteraksi dengan VFS, fs_struct dan files_struct, namespace, fd_set Rajah di bawah menerangkan bagaimana deskriptor proses dikaitkan dengan struktur berkaitan fail.

Pertama, mari kita perkenalkan struktur fs_struct Struktur fs_struct boleh dirujuk oleh berbilang proses deskriptor Kod berikut boleh didapati dalam include/Linux/fs_struct.h. Jika anda tidak memahami kod dengan baik, sila berikan saya nasihat
struct fs_struct{ atomic_t count; //保存引用特定fs_struct的进程描述符数目 rwlock_t lock; int umask; //保存一个掩码,表示将要在打开文件上设置的许可权 struct dentry * root, *pwd ,*altroot; //都是指针,,,, struct vfsmount * rootmnt, *pwdmnt, *altrootmnt; //指针, };
files_struct mengandungi maklumat tentang fail terbuka dan deskriptornya, ia menggunakan koleksi ini untuk mengumpulkan deskriptornya. Kod berikut boleh dilihat dalam include/linux/file.h
struct files_struct{ atomic_t count; //与fs_struct类似 spinlock_t file_lock; int max_fds; //表示进程能够打开的文件的最大数 int max_fdset; //表示描述符的最大数 int next_fd; //保存下一个将要分配的文件描述符的值 struct file ** fd; //fd数组指向打开的文件对象的数组 fd_set *close_on_exec; //是指向文件描述符集的一个指针,这些文件描述符在exec()时候就被标志位将要关闭,如果在exec()时候被标志位“打开”的文件描述符数超过close_on_exec_init域的大小,则改变close_on_exec域的值; fd_set *open_fds; //是一个指针,指向被标记为“打开”的文件描述符集合, fd_set close_on_exec_init; //保存一个位域,表示打开文件对应的文件描述符 fd_set open_fds_init; //这些都是fd_set类型的域,其实都不懂,,, struct file *fd_array[NR_OPEN_DEFAULT];//fd_array数组指针指向前32个打开的文件描述法 };
Mulakan struktur fs_struct melalui makro INIT_FILES:
#define INIT_FILES \ { .count = ATOMIC_INIT(1), .file_lock = SPIN_LOCK_UNLOCKED, .max_fds = NR_OPEN_DEFAULT, .max_fdset = __FD_SETSIZE, .next_fd = 0, .fd = &init_files.fd_array[0]; .close_on_exec = &init_files.close_on_exec_init, .open_fds = &init_files.open_fds_init, .close_on_exec_init = {{0, }}, .open_fda_init = {{0, }}, .fd_array = {NULL, } }
Takrifan global NR_OPEN_DEFAULT ditetapkan kepada BITS_PER_LONG, iaitu 32 dalam sistem 32-bit dan 64 dalam sistem 64-bit
Mari perkenalkan penimbalan halaman Mari kita lihat cara ia berfungsi dan dilaksanakan. Dalam Linux, memori dibahagikan kepada sekatan Setiap satu mempunyai senarai terpaut halaman aktif dan senarai terpaut yang tidak aktif, ia akan ditulis kembali ke cakera

Inti penimbalan halaman ialah objek address_space, dan kodnya boleh dilihat dalam include/linux/fs.h (Saya tidak faham kod ini dengan baik, sila beri saya nasihat):
struct address_space{ struct inode *host; struct radix_tree_root page_tree; spinlock_t tree_lock; unsigned long nrpages; pgoff_t writeback; struct address_space_operations *a_ops; struct prio_tree_root i_map; unsigned inr i_map_lock; struct list_head i_mmap_nonlinear; spinlock_t i_mmap_lock; atomic_t truncate_count; unsigned long flags; struct backing_dev_info *backing_dev_info; spinlock_t private_lock; struct list_head private_list; struct address_space *assoc_mapping; };Inti Linux juga mewakili setiap sektor pada peranti blok sebagai struktur buffer_head Kawasan fizikal yang digunakan oleh struktur buffer_head ialah blok logik b_blocknr peranti b_dev Memori fizikal yang dirujuk ialah data memori b_data bermula dari saiz blok b_size bait, blok memori ini berada dalam halaman fizikal b_page, dan strukturnya adalah seperti berikut:

open() fungsi:
fungsi terbuka digunakan untuk membuka dan mencipta fail. Berikut ialah penerangan ringkas tentang fungsi terbuka
#include int open(const char *pathname, int oflag, ... );
Pulangan nilai: Jika berjaya, kembalikan deskriptor fail, jika tidak, kembalikan -1
Untuk fungsi terbuka, parameter ketiga (...) hanya digunakan semasa mencipta fail baharu dan digunakan untuk menentukan bit kebenaran akses fail tersebut. nama laluan ialah nama laluan fail yang akan dibuka/dicipta (seperti C:/cpp/a.cpp); dalam fcntl.h) melalui logik ATAU.
- O_RDONLY mod baca sahaja
- O_SALAH mod tulis sahaja
- O_RDWR mod baca dan tulis
- Apabila membuka/membuat fail, anda mesti menggunakan sekurang-kurangnya satu daripada tiga pemalar di atas. Pemalar berikut adalah pilihan:
- O_APPEND Setiap operasi tulis ditulis pada penghujung fail
- O_CREAT Jika fail yang dinyatakan tidak wujud, buat fail ini
- O_EXCL Jika fail yang hendak dibuat sudah wujud, kembalikan -1 dan ubah suai nilai errno
- O_TRUNC Jika fail wujud dan dibuka dalam mod tulis sahaja/baca-tulis, kosongkan keseluruhan kandungan fail
- O_NOCTTY Jika nama laluan menghala ke peranti terminal, jangan gunakan peranti ini sebagai terminal kawalan.
- O_NONBLOCK Jika nama laluan menghala ke FIFO/fail sekat/fail aksara, tetapkan pembukaan fail dan I/O seterusnya kepada mod tanpa sekatan (mod tanpa sekatan)
- Tiga pemalar berikut juga dipilih, ia digunakan untuk menyegerakkan input dan output
- O_DSYNC menunggu I/O fizikal selesai sebelum menulis. Tanpa menjejaskan pembacaan data yang baru ditulis, jangan tunggu kemas kini atribut fail.
- O_RSYNC baca menunggu semua operasi tulis ke kawasan yang sama selesai sebelum meneruskan
- O_SYNC menunggu I/O fizikal tamat sebelum menulis, termasuk I/O untuk mengemas kini atribut fail
POSIX.1 引入常量 _POSIX_NO_TRUNC 用于决定是否截断长文件名/长路径名。如果_POSIX_NO_TRUNC 设定为禁止截断,并且路径名长度超过 PATH_MAX(包括 ‘\0’),或者组成路径名的任意文件名长度超过 NAME_MAX,则返回错误信息,并且把 errno 置为 ENAMETOOLONG。
close()函数
进程使用完文件后,发出close()系统调用:
sysopsis
#include int close(int fd);
参数:fd文件描述符
函数返回值:0成功,-1出错
参数fd是要关闭的文件描述符。需要说明的是:当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。
read()函数
当用户级别程序调用read()函数时,Linux把它转换成系统调sys_read():
功能描述:从文件读取数据。
所需头文件: #include
函数原型:ssize_t read(int fd, void *buf, size_t count);
参数:
-
fd: 将要读取数据的文件描述词。
-
buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。
-
count:表示调用一次read操作,应该读多少数量的字符。
-
返回值:返回所读取的字节数;0(读到EOF);-1(出错)。
-
以下几种情况会导致读取到的字节数小于 count :
-
读取普通文件时,读到文件末尾还不够 count 字节。例:如果文件只有 30 字节,而我们想读取 100,字节,那么实际读到的只有 30 字节, 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0
-
从终端设备(terminal device)读取时,一般情况下每次只能读取一行。
-
从网络读取时,网络缓存可能导致读取的字节数小于 count字节。
-
读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 count 。
-
从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。
-
在读取了部分数据时被信号中断,读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。
例程如下(程序是网上找的例子,贴下来以以供大家理解一下)::
#include #include #include #include #include #include int main(void) { void* buf ; int handle; int bytes ; buf=malloc(10); /* LooksforafileinthecurrentdirectorynamedTEST.$$$andattempts toread10bytesfromit.Tousethisexampleyoushouldcreatethe fileTEST.$$$ */ handle=open("TEST.$$$",O_RDONLY|O_BINARY,S_IWRITE|S_IREAD); if(handle==-1) { printf("ErrorOpeningFile\n"); exit(1); } bytes=read(handle,buf,10); if(bytes==-1) { printf("ReadFailed.\n"); exit(1); } else { printf("Read:%dbytesread.\n",bytes); } return0 ; }
write()函数
功能描述:向文件写入数据。
所需头文件: #include
函数原型:ssize_t write(int fd, void *buf, size_t count);
返回值:写入文件的字节数(成功);-1(出错)
功能:write 函数向 filedes 中写入 count 字节数据,数据来源为 buf 。返回值一般总是等于 count,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。
例程如下(程序是网上找的例子,贴下来以以供大家理解一下):
#include #include #include #include #include #include int main(void) { int *handle; char string[40]; int length, res;/* Create a file named "TEST.$$$" in the current directory and write a string to it. If "TEST.$$$" already exists, it will be overwritten. */ if ((handle = open("TEST.$$$", O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE)) == -1) { printf("Error opening file.\n"); exit(1); } strcpy(string, "Hello, world!\n"); length = strlen(string); if ((res = write(handle, string, length)) != length) { printf("Error writing to the file.\n"); exit(1); } printf("Wrote %d bytes to the file.\n", res); close(handle); return 0; }
小结
今天看的代码不多,差不多都是网上找的代码,有些解释也是查阅资料写上去的,有些还是不懂,希望各路大神指教,这里我总结了有关Linux文件系统实现的问题,但是具体的细节方面并没有提及到,大家看了之后应该只能有一个大致的最Linux文件系统的了解,有读者问我看的是哪些书,这里我说明一下,看了Linux内核编程,还有深入理解Linux内核以及网上各种资料或者其他大牛写的好的博客。这里我是总结了一下,并且把自己不懂的还有觉得重要的说了一下,希望各位大神给些建议,thanks~
Atas ialah kandungan terperinci 24 jam untuk mengetahui tentang kernel Linux dan isu yang berkaitan dengan pelaksanaan sistem fail Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Purata gaji tahunan pentadbir Linux ialah $ 75,000 hingga $ 95,000 di Amerika Syarikat dan € 40,000 hingga € 60,000 di Eropah. Untuk meningkatkan gaji, anda boleh: 1. Secara berterusan mempelajari teknologi baru, seperti pengkomputeran awan dan teknologi kontena; 2. Mengumpulkan pengalaman projek dan menubuhkan portfolio; 3. Mewujudkan rangkaian profesional dan mengembangkan rangkaian anda.

Penggunaan utama Linux termasuk: 1. Sistem Operasi Pelayan, 2. Sistem Terbenam, 3. Linux cemerlang dalam bidang ini, menyediakan kestabilan, keselamatan dan alat pembangunan yang cekap.

Internet tidak bergantung pada sistem operasi tunggal, tetapi Linux memainkan peranan penting di dalamnya. Linux digunakan secara meluas dalam pelayan dan peranti rangkaian dan popular untuk kestabilan, keselamatan dan skalabiliti.

Inti sistem pengendalian Linux adalah antara muka baris arahannya, yang boleh melakukan pelbagai operasi melalui baris arahan. 1. Operasi Fail dan Direktori Gunakan LS, CD, MKDIR, RM dan arahan lain untuk menguruskan fail dan direktori. 2. Pengguna dan Pengurusan Kebenaran Memastikan keselamatan sistem dan peruntukan sumber melalui UserAdd, Passwd, CHMOD dan arahan lain. 3. Pengurusan proses menggunakan PS, membunuh dan arahan lain untuk memantau dan mengawal proses sistem. 4. Operasi rangkaian termasuk PING, IFCONFIG, SSH dan arahan lain untuk mengkonfigurasi dan menguruskan sambungan rangkaian. 5. Pemantauan sistem dan penyelenggaraan sistem seperti TOP, DF, DU untuk memahami status operasi sistem dan penggunaan sumber.

Pengenalan Linux adalah sistem operasi yang kuat yang disukai oleh pemaju, pentadbir sistem, dan pengguna kuasa kerana fleksibiliti dan kecekapannya. Walau bagaimanapun, kerap menggunakan arahan panjang dan kompleks boleh membosankan dan er

Linux sesuai untuk pelayan, persekitaran pembangunan, dan sistem tertanam. 1. Sebagai sistem pengendalian pelayan, Linux stabil dan cekap, dan sering digunakan untuk menggunakan aplikasi konkurasi tinggi. 2. Sebagai persekitaran pembangunan, Linux menyediakan alat arahan dan sistem pengurusan pakej yang cekap untuk meningkatkan kecekapan pembangunan. 3. Dalam sistem tertanam, Linux ringan dan disesuaikan, sesuai untuk persekitaran dengan sumber yang terhad.

Pengenalan: Mengamankan sempadan digital dengan penggodaman etika berasaskan Linux Di dunia yang semakin saling berkaitan, keselamatan siber adalah yang paling penting. Ujian penggodaman dan penembusan etika adalah penting untuk mengenal pasti dan mengurangkan keruntuhan secara proaktif

Kaedah untuk pembelajaran asas Linux dari awal termasuk: 1. Memahami sistem fail dan antara muka baris perintah, 2. Master arahan asas seperti LS, CD, MKDIR, 3.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

Dreamweaver Mac版
Alat pembangunan web visual

Dreamweaver CS6
Alat pembangunan web visual