建议和反馈

请填写你的反馈内容

全面了解LINUX数据结构如何工作-1

2019-10-15 ·1363次阅读 ·读完需要11分钟

本文列出了Linux使用的主要数据结构。对于那些有兴趣深入学习Linux内核的人或有兴趣进行高级Linux操作系统故障排除的人来说,这是一个绝对的指南。


block_dev_struct

block_dev_struct数据结构用于将块设备注册为可供缓冲区高速缓存使用。它们在blk_dev向量中结合在一起。

struct blk_dev_struct { 

void(* request_fn)(void); 

结构请求* current_request; 

结构请求插件;

struct tq_struct plug_tq; 

}; 


buffer_head

buffer_head数据结构在缓冲区高速缓存中保存有关块缓冲区的信息。

/ * bh状态位* /

#define BH_Uptodate 0 / * 1如果缓冲区包含有效数据* / 

#define BH_Dirty 1 / * 1如果缓冲区脏了* / 

#define BH_Lock 2 / * 1如果缓冲区被锁定* / 

#define BH_Req 3 / * 0如果缓冲区已失效* / 

#define BH_Touched 4 / * 1如果缓冲区已被触摸(老化)* / 

#define BH_Has_aged 5 / * 1如果缓冲区已老化(老化)* / 

#define BH_Protected 6 / *如果缓冲区受保护,

则为1 * / #define BH_FreeOnIO 7 / * 1以在IO之后丢弃buffer_head * /


struct buffer_head { 

/ *第一行缓存:* / 

unsigned long b_blocknr; / *块号* / 

kdev_t b_dev; / *设备(B_FREE =免费)* / 

kdev_t b_rdev; / *实际设备* / 

unsigned long b_rsector; / *磁盘上的实际缓冲区位置* / 

struct buffer_head * b_next; / *哈希队列列表* / 

struct buffer_head * b_this_page; / * 

一页中的缓冲区循环列表* /


  / *第二个缓存行:* / 

unsigned long b_state; / *缓冲区状态位图(上方)* / 

struct buffer_head * b_next_free; 

unsigned int b_count; / *使用此块的用户* / 

unsigned long b_size; / *块大小* /


  / *随后是非性能关键数据。* / 

char * b_data; / *指向数据块的指针* / 

unsigned int b_list; / *列出此缓冲区的出现* / 

unsigned long b_flushtime; / * 

应该写入此(脏)缓冲区的时间* / 

无符号长b_lru_time; / * 

上次使用此缓冲区的时间。* / 

struct wait_queue * b_wait; 

struct buffer_head * b_prev; / 

*双链哈希列表* / struct buffer_head * b_prev_free; / *缓冲区双链表* / 

struct buffer_head * b_reqnext; / *请求队列* / 

}; 


设备

系统中的每个网络设备都由设备数据结构表示。

结构设备

{


  / * 

*这是此结构的“可见”部分的第一个字段

*(即用户在“ Space.c”文件中看到的)。它是名称

*接口。

* / 

char *名称;


  / * I / O特定字段* / 

unsigned long rmem_end; / * shmem“ recv” end * / 

无符号长rmem_start; / * shmem“ recv” start * / 

无符号长mem_end; / *共享内存结尾* / 

无符号长mem_start; / *共享内存启动* / 

无符号长base_addr; / *设备I / O地址* / 

unsigned char irq; / *设备IRQ号* /


  / *低级状态标志。* / 

volatile unsigned char start,/ *开始操作* / 

中断;/ *中断到达* / 

无符号长忙;/ *发送器忙* / 

结构设备*下一个;


  / *设备初始化功能。仅调用一次。* / 

int(* init)(结构设备* dev);


  / *某些硬件也需要这些字段,但它们不是

Space.c中指定的通常设置的一部分。* / 

unsigned char if_port; / *可选的AUI,TP,* / 

无符号字符dma; / * DMA通道* /


  struct enet_statistics *(* get_stats)(结构设备* dev);


  / * 

*这标志着结构“可见”部分的结束。以后的所有

*字段都是系统内部的,并且可能

会随意更改*(读取:可能会随意清理)。

* /


  / *将来的网络关闭代码可能需要这些。* / 

unsigned long trans_start; / * 

上次发送的时间(抖动)* / 

无符号长last_rx; / *最后接收时间* / 

无符号短标志;/ *接口标志(BSD)* / 

无符号短系列;/ *地址族ID * / 

无符号短度量;/ *路由度量* / 

unsigned short mtu; / * MTU值* / 

无符号短类型;/ *硬件类型* / 

unsigned short hard_header_len; / *硬件hdr len * /

无效* priv; / *私人数据* /


  / *接口地址信息。* / 

无符号字符广播[MAX_ADDR_LEN];

未签名的字符填充;               

未签名的字符dev_addr [MAX_ADDR_LEN];  

unsigned char addr_len; / *硬件地址len * / 

unsigned long pa_addr; / *协议地址* / 

无符号长pa_brdaddr; / *协议广播地址* / 

无符号长pa_dstaddr; / *协议PP其他地址* / 

无符号长pa_mask; / *协议网络掩码* / 

无符号短pa_alen; / *协议地址len * /


  struct dev_mc_list * mc_list; / * M'cast mac地址* / 

int mc_count; / *未安装mcasts * / 


struct ip_mc_list * ip_mc_list; / * IP广播过滤器链* / 

__u32 tx_queue_len; / *每个队列的最大帧数* / 


/ *对于负载平衡驱动程序对支持* / 

unsigned long pkt_queue; / *数据包排队* / 

结构设备*从属;/ *从设备* / 

struct net_alias_info * alias_info; / *主要开发者别名信息* / 

struct net_alias * my_alias; / * alias devs * / 


/ *指向接口缓冲区的指针。* / 

struct sk_buff_head buffs [DEV_NUMBUFFS];


  /* Pointers to interface service routines. */

int                     (*open)(struct device *dev);

int                     (*stop)(struct device *dev);

int                     (*hard_start_xmit) (struct sk_buff *skb,

struct device *dev);

int                     (*hard_header) (struct sk_buff *skb,

struct device *dev,

unsigned short type,

void *daddr,

void *saddr,

unsigned len);

int                     (*rebuild_header)(void *eth, 

struct device *dev,

unsigned long raddr,

struct sk_buff *skb);

void                    (*set_multicast_list)(struct device *dev);

int                     (*set_mac_address)(struct device *dev,

void *addr);

int                     (*do_ioctl)(struct device *dev, 

struct ifreq *ifr,

int cmd);

int                     (*set_config)(struct device *dev,

struct ifmap *map);

void                    (*header_cache_bind)(struct hh_cache **hhp,

struct device *dev, 

unsigned short htype,

__u32 daddr);

void                    (*header_cache_update)(struct hh_cache *hh,

struct device *dev,

unsigned char *  haddr);

int                     (*change_mtu)(struct device *dev,

int new_mtu);

struct iw_statistics *(* get_wireless_stats)(结构设备* dev); 

}; 


device_struct

device_struct数据结构用于注册字符和块设备(它们保留其名称和可用于该设备的文件操作集)。chrdevs和blkdevs向量的每个有效成员分别代表一个字符或块设备。

struct device_struct { 

const char * name; 

struct file_operations * fops; 

}; 


文件

每个打开的文件,套接字等都由文件数据结构表示。

结构文件{ 

mode_t f_mode; 

loff_t f_pos; 

无符号短f_flags; 

无符号短f_count;

无符号长f_reada,f_ramax,f_raend,f_ralen,f_rawin;

结构文件* f_next,* f_prev; 

int f_owner; / * pid或-pgrp,其中应发送SIGIO * / 

struct inode * f_inode; 

struct file_operations * f_op; 

无符号长f_version; 

无效* private_data; / *是tty驱动程序可能需要的,可能还有其他* / 

}; 


files_struct

files_struct数据结构描述了进程已打开的文件。

struct files_struct { 

int count; 

fd_set close_on_exec; 

fd_set open_fds; 

结构文件* fd [NR_OPEN]; 

}; 


fs_struct

struct fs_struct { 

int count;

无符号短Umask;

struct inode * root,* pwd; 

}; 


gendisk

gendisk数据结构保存有关硬盘的信息。找到磁盘然后在分区中进行探测时,将在初始化期间使用它们。

struct hd_struct { 

long start_sect; 

长nr_sects; 

};


struct gendisk { 

int major; / *驱动程序的主号码* / 

const char * major_name; / *主要驱动程序的名称* / 

int minor_shift; / *将minor移位以

获得真实的minor的次数* / 

int max_p; / *每个设备的最大分区数* / 

int max_nr; / *实际设备的最大数量* /


    无效(* init)(struct gendisk *); 

/ *在

做我们的事情之前调用了初始化* / 

struct hd_struct * part; / *分区表* / 

int * sizes; / *设备大小(以块为单位),复制到

blk_size [] * / 

int nr_real; / *实际设备数* /


    无效* real_devices; / *内部使用* / 

struct gendisk * next; 

}; 


inode

VFS inode数据结构包含有关磁盘上文件或目录的信息。

struct inode { 

kdev_t i_dev; 

无符号长i_ino;

umode_t i_mode; 

nlink_t i_nlink; 

uid_t i_uid; 

gid_t i_gid; 

kdev_t i_rdev; 

off_t i_size; 

time_t i_atime; 

time_t i_mtime; 

time_t i_ctime;

无符号长i_blksize;

无符号长i_blocks;

无符号长i_version;

无符号的长i_nrpages;

结构信号量i_sem; 

struct inode_operations * i_op; 

struct super_block * i_sb; 

struct wait_queue * i_wait; 

struct file_lock * i_flock; 

struct vm_area_struct * i_mmap; 

struct page * i_pages; 

struct dquot * i_dquot [MAXQUOTAS]; 

struct inode * i_next,* i_prev; 

struct inode * i_hash_next,* i_hash_prev; 

struct inode * i_bound_to,* i_bound_by;

struct inode * i_mount; 

无符号的简短i_count;

无符号短i_flags;

未签名的char i_lock; 

unsigned char i_dirt; 

未签名的char i_pipe; 

未签名的char i_sock; 

未签名的char i_seek; 

未签名的char i_update; 

无符号的简短i_writecount; 

union { 

struct pipe_inode_info pipe_i; 

struct minix_inode_info minix_i; 

struct ext_inode_info ext_i; 

struct ext2_inode_info ext2_i; 

struct hpfs_inode_info hpfs_i; 

struct msdos_inode_info msdos_i;

struct umsdos_inode_info umsdos_i; 

struct iso_inode_info isofs_i; 

struct nfs_inode_info nfs_i; 

struct xiafs_inode_info xiafs_i; 

struct sysv_inode_info sysv_i; 

struct affs_inode_info affs_i; 

struct ufs_inode_info ufs_i; 

struct socket socket_i; 

无效* generic_ip; 

} u; 

}; 


ipc_perm

ipc_perm数据结构描述System V IPC对象的访问权限。

struct ipc_perm 

key_t key; 

ushort uid; / *所有者euid和egid * / 

ushort gid; 

超短腿 / *创建者euid和egid * / 

ushort cgid;

超短模式 / *访问模式请参见下面的模式标志* / 

ushort seq; / *序列号* / 

}; 


irqaction

irqaction数据结构用于描述系统的中断处理程序。

struct irqaction { 

void(* handler)(int,void *,struct pt_regs *); 

无符号长标志;

无符号的长面具;

const char *名称; 

无效* dev_id; 

struct irqaction *下一个;

}; 


linux_binfmt


Linux可以理解的每种二进制文件格式都由linux_binfmt数据结构表示。

struct linux_binfmt { 

  struct linux_binfmt * next; 

  长* use_count; 

  int(* load_binary)(struct linux_binprm *,struct pt_regs * regs); 

  int(* load_shlib)(int fd); 

  int(* core_dump)(长签名者,struct pt_regs * regs); 

}; 


mem_map_t                 

mem_map_t数据结构(也称为页面)用于保存有关物理内存每个页面的信息。

typedef struct page { 

  / *这些必须是第一个(自由区域处理)* / 

  struct page * next; 

  结构页*上一页; 

  struct inode * inode;

  无符号长偏移量;

  结构页* next_hash; 

  atomic_t计数; 

  未签名的标志;/ *原子标志,一些可能

                                   异步更新* / 

  unsigneddirty:16,

                     age:8; 

  struct wait_queue *等待; 

  结构页面* prev_hash; 

  struct buffer_head *缓冲区; 

  无符号长swap_unlock_entry; 

  无符号长map_nr; / *页面-> map_nr ==页面-mem_map * / 

} mem_map_t; 


mm_struct

mm_struct数据结构用于描述任务或进程的虚拟内存。

struct mm_struct { 

  int count;

  pgd_t * pgd; 

  无符号的长上下文;

  无符号的长start_code,end_code,start_data,end_data;

  无符号长start_brk,brk,start_stack,start_mmap; 

  无符号长arg_start,arg_end,env_start,env_end; 

  无符号长rss,total_vm,locked_vm;

  无符号长def_flags; 

  struct vm_area_struct * mmap; 

  struct vm_area_struct * mmap_avl; 

  struct信号量mmap_sem; 

}; 


pci_bus系统中的

每个PCI总线都由pci_bus数据结构表示。

struct pci_bus { 

  struct pci_bus * parent; / *此桥位于* /父总线上* / 

  struct pci_bus * children; / *此总线上的P2P桥接链* /

  struct pci_bus *下一步; / *所有PCI总线的链* /


  struct pci_dev *自我; / *父设备看到的桥接设备* / 

struct pci_dev * devices; / *此网桥后面的设备* /


  无效* sysdata; / *用于特定于系统的扩展名的钩子* /


  未签名的字符号;/ *总线号* / 

unsigned char primary; / *主网桥的数量* / 

unsigned char secondary; / *次网桥的数量* / 

unsigned char子级;/ *从属总线的最大数量* / 

}; 


pci_dev系统中的

每个PCI设备(包括PCI-PCI和PCI-ISA桥接设备)均由pci_dev数据结构表示。

/ * 

*每个插槽号/功能号

*组合都有一个pci_dev结构:

* / 

struct pci_dev { 

struct pci_bus * bus; / *此设备位于* /总线上* / 

struct pci_dev * sibling; / *此总线上的下一个设备* /

struct pci_dev *下一步; / *所有设备的链* /


  无效* sysdata; / *用于特定于系统的扩展名的钩子* /


  unsigned int devfn; / *编码的设备和功能索引* / 

无符号的卖空者;

未签名的短设备;

unsigned int类;/ * 3个字节:(base,sub,prog-if)* / 

unsigned int master:1; / *设置设备是否具有主机功能* / 

/ * 

*从理论上讲,可以从配置

*空间中读取irq级别,并且一切正常。但是,旧的PCI芯片不

*支持这些寄存器,而是返回0。例如,

Vision864-P rev 0芯片可以使用INTA,但在

中断线和引脚寄存器中返回0 。pci_init()

*使用PCI_INTERRUPT_LINE的值初始化该字段

*这是pcibios_fixup()的工作,如果需要更改它

*必填。除非设备

*根本无法生成中断,否则该字段不得为0 。

* / 

unsigned char irq; / *此设备生成的irq * / 

}; 


request

请求数据结构用于向系统中的块设备发出请求。请求始终是向缓冲区高速缓存读取数据块或从缓冲区高速缓存写入数据块。

struct request { 

volatile int rq_status;    

#define RQ_INACTIVE(-1)

#define RQ_ACTIVE 1 

#define RQ_SCSI_BUSY 0xffff 

#define RQ_SCSI_DONE 0xfffe 

#define RQ_SCSI_DISCONNECTING 0xffe0


    kdev_t rq_dev; 

int cmd; / *读取或写入* / 

int错误;

无符号长扇区;

无符号长nr_sectors; 

无符号长current_nr_sectors;

char *缓冲区;

struct semaphore * sem; 

struct buffer_head * bh; 

struct buffer_head * bhtail; 

struct request *接下来;

}; 



评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

C#中的智能合约入门

在上一篇文章NEO区块链简介中,我们讨论了NEO区块链及其用途,在本文中,我们学习了如何使用Visual Studio和C#为NEO区块链智能合约设置开发机器。在下一篇文章中,我将更详细地讨论智能合约......
区块技术花 · 2019-12-07
139阅读 · 0赞赏 · 0问答

如何使用Metamask和Remix在Ropsten TestNet上部署和测试智能合约

想象一下要去一家冰淇淋店,品尝一些口味的冰淇淋,然后再选择要支付的口味。以太坊测试网就是这样。在将智能合约部署到实际花费真实以太币的真实以太坊网络之前,您需要通过将其部署在只是模拟真实以太坊网络的测试......
比特币论坛 · 2019-12-06
371阅读 · 0赞赏 · 0问答

在.NET Core中构建基本区块链

区块链技术是比特币的基础,比特币是世界上最受欢迎的加密货币。随着比特币的流行,区块链也获得了很大的曝光。人们现在也开始在非加密货币类型的应用程序中使用区块链。看看中本聪(Satoshi Nakamot......
btc论坛 · 2019-12-06
392阅读 · 0赞赏 · 0问答

去中心化应用程序堆栈

目前,Intranet处于隔离状态,无法相互通信和共享信息。现在基于区块链的网络也是如此。甚至对所有人开放的公共网络(例如比特币网络)也可以在其他公共网络之间独立运行,而无法在它们之间直接进行通信。在......
开发者小白 · 2019-12-05
473阅读 · 0赞赏 · 0问答

在.NET Core中构建区块链-交易和奖励

在上一篇文章中,我谈到了区块链技术中的工作量证明,工作量证明需要大量的计算时间,反过来,它也需要大量的电能。一个例子是,2017年11月整个比特币网络消耗的电力高于爱尔兰。比特币网络中的所有节点都是志......
btc论坛 · 2019-12-05
468阅读 · 0赞赏 · 0问答

在.NET Core中构建区块链-工作证明

基本区块链可以很容易地被篡改。即使存在验证机制,通过更新一个块并重新计算其后所有块的哈希,被篡改的区块链也通过了验证。在现实世界中,情况可能会变得更糟,因为可以使用现代计算机在短时间内进行重新计算。我......
btc论坛 · 2019-12-05
420阅读 · 0赞赏 · 0问答

Rooney

1894

LK币

4

粉丝

22

笔记

感谢"Rooney"

这篇精彩的笔记,目前已经帮助

  • 0
  • 1
  • 3
  • 6
  • 3
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!