linux的结构体
① linux驱动程序简单结构体
这应该是定义一个结构体,并初始化。Linux驱动中经常有这种形式。
比如声明了一个这样的结构体
struct num
{
int max;
int min;
};
然后有如下定义
static struct num mynum = {
.max = 5,
.min = 1,
};
这就意味着定义了一个叫做mynum的结构体,mynum.max初始化为5,mynum.min初始化为1。
当然也可以这么写:
static struct num mynum;
mynum.max = 5;
mynum.min = 1;
两种写法一个意思。
② 高手进,关于linux内核中的一类结构体,该结构体中的函数指针的参数指向这类结构体, 说下这么做有啥用
松耦合!例如现在内核从上到下有两层,A,B层。A层向上提供一个统一的接口,而B层有各种不同的实例,那么A层无需关心B层到底现在用的是哪个实例,屏蔽了底层的复杂性。
如A层现在使用了结构体struct softirq_action a, 而 a.action 可能被B层的实例赋值了不同的操作方法(这里就是函数指针),那么A层只需要用 a,它的这个函数成员被指向了它需要的地方
③ linux 结构体为什么不用typedef
typedef是把一个已经存在的类型,进行“重新”定义,而结构体本身是一个“未知”的数据类型,所以,不能使用typedef来定义
而对于已定义好的结构体类型,则可以用typedef来重新命名,如:
struct _st_ { int i; char s[100]; } ; //先定义一个结构体
typedef struct _st_ my_struct ; //重新定义一个新类型:my_struct ,与struct _st_是等效的
④ Linux常见文件结构体有哪些
linux虚拟文件系统核心数主要有以下几个数据结构: * 超级块结构(struct super_block {...} ) 该结构保存了一个被安装在linux系统上的文件系统的信息。对于基于磁盘的文件系统,该结构一般和保存在磁盘上的"文件系统控制块"对应。
⑤ Linux字符设备驱动的组成
在Linux中,字符设备驱动由如下几个部分组成。
1.字符设备驱动模块加载与卸载函数
在字符设备驱动模块加载函数中应该实现设备号的申请和cdev的注册,而在卸载函数中应实现设备号
的释放和cdev的注销。
Linux内核的编码习惯是为设备定义一个设备相关的结构体,该结构体包含设备所涉及的cdev、私有
数据及锁等信息。2.字符设备驱动的file_operations结构体中的成员函数
file_operations结构体中的成员函数是字符设备驱动与内核虚拟文件系统的接口,是用户空间对Linux
进行系统调用最终的落实者。设备驱动的读函数中,filp是文件结构体指针,buf是用户空间内存的地址,该地址在内核空间不宜直
接读写,count是要读的字节数,f_pos是读的位置相对于文件开头的偏移。
设备驱动的写函数中,filp是文件结构体指针,buf是用户空间内存的地址,该地址在内核空间不宜直
接读写,count是要写的字节数,f_pos是写的位置相对于文件开头的偏移。
由于用户空间不能直接访问内核空间的内存,因此借助了函数_from_user()完成用户空间缓冲
区到内核空间的复制,以及_to_user()完成内核空间到用户空间缓冲区的复制,见代码第6行和第14
行。
完成内核空间和用户空间内存复制的_from_user()和_to_user()的原型分别为:
unsigned long _from_user(void *to, const void _ _user *from, unsigned long count);
unsigned long _to_user(void _ _user *to, const void *from, unsigned long count);
上述函数均返回不能被复制的字节数,因此,如果完全复制成功,返回值为0。如果复制失败,则返
回负值。如果要复制的内存是简单类型,如char、int、long等,则可以使用简单的put_user()和
get_user()读和写函数中的_user是一个宏,表明其后的指针指向用户空间,实际上更多地充当了代码自注释的
功能。内核空间虽然可以访问用户空间的缓冲区,但是在访问之前,一般需要先检查其合法性,通过
access_ok(type,addr,size)进行判断,以确定传入的缓冲区的确属于用户空间。
⑥ linux下怎么查看某个结构体的定义
Linux下查看结构体、变量、函数的定义可以用一款Windows上的软件叫做Source Insight,这个软件在Linux的Wine环境中运行的非常好,是少数可以在Linux平台正常运行的Windows应用,这个软件最大的作用就是浏览代码,可以很容易的跳转到变量、函数、结构体、类的定义处,特别是代码项目比较庞大时就更能够显示出它的好处了。
⑦ linux中定义的几个网络报文的结构体
public struct MyStruct{ public int _number; public string _text; } 在C#中 建议你使用string而不是char数组存储字符串 还有 请在每一个字段前加入public 否则你会访问不到,C#相比C是有访问修饰的
⑧ linux中什么是文件结构体
linux虚拟文件系统核心数主要有以下几个数据结构: * 超级块结构(struct super_block {...} ) 该结构保存了一个被安装在linux系统上的文件系统的信息。对于基于磁盘的文件系统,该结构一般和保存在磁盘上的"文件系统控制块"对应。也就是说如果是...
⑨ 浅谈结构体及linux下内存分配原则
浅谈结构体及linux下内存分配原则结构体在程序中的应用是很广泛的,要处理的问题越复杂,数据量越多月杂,就越需要用到结构体。比如网络,内核,驱动等等。熟练使用结构体对每个程序员都是至关重要的。一个好的结构体不仅能使程序体系结构清晰,而且使得操作灵活,可扩展性强。linux网络之所以很强大,这和它里设计合理的数据结构有很大关系。
www.shiwu.com
结构体定义:[cpp]<span
style=font-size:18px;>struct
a{
int
xx:4;
int
yy:4;
};</span>
结构体初始化:方式一:[cpp]<span
style=font-size:18px;>struct
a
aa
={
xx:2,
yy:3
};</span>
www.shiwu.com
方式二:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=6,
.yy=1,
};</span>
方式三:[cpp]<span
style=font-size:18px;>struct
a
dd={4,2};</span>
在定义中,可以限制变量的位的作用域,比如上面的:int
xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning:
overflow
in
implicit
constant
conversion。在这里如果你给xx赋值为15,如:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=15,
.yy=1,
};</span>
www.shiwu.com
然后输出:[cpp]<span
style=font-size:18px;>printf(cc.xx
=
%d/n,cc.xx);</span>
结果会是:-1因为这里定义的xx为int
型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。引出的其他问题这里用sizeof(struct
a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:2;
short
int
yy:2;
}bb;</span>
如上,我定义二个short
int类型值,short
int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct
a)的值为2。不足一字节系统自动补满一字节。[html]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:2;
}bb;</span>
www.shiwu.com
这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:9;
}bb;</span>
这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。作者
linuxblack125125