什么是节点?在linux内核中如何实现的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是节点?在linux内核中如何实现的?相关的知识,希望对你有一定的参考价值。

参考技术A i节点是一个64字节长的表,存储着一个文件的元数据,包括文件大小、文件所有者、文件存取许可方式,以及文件类型,磁盘地址表。
struct inode
struct hlist_node i_hash;
struct list_head i_list; /* backing dev IO list */
struct list_head i_sb_list;
struct list_head i_dentry;
unsigned long i_ino;
atomic_t i_count;
unsigned int i_nlink;
uid_t i_uid;
gid_t i_gid;
dev_t i_rdev;
unsigned int i_blkbits;
u64 i_version;
loff_t i_size;
#ifdef __NEED_I_SIZE_ORDERED
seqcount_t i_size_seqcount;
#endif
struct timespec i_atime;
struct timespec i_mtime;
struct timespec i_ctime;
blkcnt_t i_blocks;
unsigned short i_bytes;
umode_t i_mode;
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
struct mutex i_mutex;
struct rw_semaphore i_alloc_sem;
const struct inode_operations *i_op;
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
struct super_block *i_sb;
struct file_lock *i_flock;
struct address_space *i_mapping;
struct address_space i_data;
#ifdef CONFIG_QUOTA
struct dquot *i_dquot[MAXQUOTAS];
#endif
struct list_head i_devices;
union
struct pipe_inode_info *i_pipe;
struct block_device *i_bdev;
struct cdev *i_cdev;
;

__u32 i_generation;

#ifdef CONFIG_FSNOTIFY
__u32 i_fsnotify_mask; /* all events this inode cares about */
struct hlist_head i_fsnotify_marks;
#endif

unsigned long i_state;
unsigned long dirtied_when; /* jiffies of first dirtying */

unsigned int i_flags;

atomic_t i_writecount;
#ifdef CONFIG_SECURITY
void *i_security;
#endif
#ifdef CONFIG_FS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
void *i_private; /* fs or device private pointer */
;

windows 内核中如何实现Sleep

在 Windows 内核中,可以调用 KeDelayExecutionThread 函数来实现类似于 Sleep 的功能。该函数将让调用线程延迟执行一段时间,例如,让线程休眠 1 毫秒。

下面是一个示例程序,演示如何在 Windows 内核中使用 KeDelayExecutionThread 函数来实现 Sleep 功能:

```
#include

VOID DriverUnload(PDRIVER_OBJECT DriverObject)

UNREFERENCED_PARAMETER(DriverObject);


NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)

UNREFERENCED_PARAMETER(RegistryPath);
KdPrint(("DriverEntry called\n"));

// 延迟执行 1 秒钟,相当于 Sleep(100)
LARGE_INTEGER delayInterval;
delayInterval.QuadPart = -1 * 100 * 100 * 10;
KeDelayExecutionThread(KernelMode, FALSE, &delayInterval);

KdPrint(("Delay finished\n"));

DriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;

```

这个示例程序将延迟执行 1 秒钟,然后在调用完成后卸载驱动程序。在延迟执行的部分,我们创建了一个 `LARGE_INTEGER` 类型的变量 `delayInterval`,用它来表示需要延迟的时间。然后,我们将其设置为负数,相当于指定延迟的时间间隔,这里我们将其设为 1 秒钟的时间间隔。

最后,我们调用 KeDelayExecutionThread 函数,并传递给它 delayInterval 参数,指定需要延迟执行的时间间隔。

需要注意的是,该示例程序的环境为 Windows 内核,因此需要使用相应的开发工具来编译和测试驱动程序。如果你是想在用户模式下实现类似 Sleep 的功能,请使用标准 C/C++ 库中的 Sleep 函数。
参考技术A Windows 内核中实现 Sleep 的方式是通过 API 函数 Sleep() 来实现的。Sleep() 函数可以让操作系统在一段时间内停止执行当前正在执行的任务,并把 CPU 空闲出来,从而让其他任务能够得到执行。这个函数需要传入一个参数(单位为毫秒),用来控制 Sleep() 休眠的时长。因此,如果想要实现休眠 100 毫秒的话,就应当使用 Sleep(100) 这个函数来实现。 参考技术B void KeSleep (int milliSeconds)

PKTIMER timer = (PKTIMER) ExAllocatePoolWithTag( NonPagedPool, sizeof (KTIMER), 'HELO' );
LARGE_INTEGER duetime;

if (!timer)
return;

duetime.QuadPart = (__int64) milliSeconds * -10000;
KeInitializeTimerEx(timer, NotificationTimer);
KeSetTimerEx(timer, duetime, 0, NULL);

KeWaitForSingleObject (timer, Executive, KernelMode, FALSE, NULL);

ExFreePoolWithTag(timer, 'HELO');
本回答被提问者采纳

以上是关于什么是节点?在linux内核中如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章

linux内核共享双向链表

linux内核共享双向链表

如何利用红黑树实现排名?

如何实现内核旁路(Kernel bypass)?

Docker是如何实现隔离的

「epoll」深入linux内核中是如何实现多路的IO管理的