LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: seskissinger

这两行代码什么意思啊(新手)

[复制链接]
发表于 2007-4-22 21:34:55 | 显示全部楼层
指针在定义的时候并不是分配空间啊,我说的对吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-23 11:41:28 | 显示全部楼层
Post by crook
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);
实际上就是
msg=kmalloc(sizeof(struct msg_queue),GFP_KERNEL);
目的是动态分配内存。

这么说,那指针在定义的时候没分配内存了?所有指针都是吗?
回复 支持 反对

使用道具 举报

发表于 2007-9-25 23:36:52 | 显示全部楼层
以楼主现在的功力,建议还是先学好应用程序的编程,现在看内核恐怕不行。
建议学好一下课程:
(1)数字电路
(2)计算机原理
(3)编译原理

这里的意思是:
/*
  * 定义一个指针变量 msg,实际上对于CPU来说它只是个整数,
  * 指针类型等等概念,只是编译器的概念而已,对 CPU 来说,根本就没这回事。
  * 如果你的 CPU 是 32 位的,那么它就是一个 32 位的二进制数而已,
  * 这 32 个 bit 物理上将是总线每根电线的电平和时序控制信号。
  * 譬如,CPU 是访问 SDRAM 那么这 32 bit 就是控制内存芯片的片选,使能,
  * 行闸门,列闸门等按时序开启,以及每个存储单元刷新补电等等的信号。
  */
struct msg_queue *msg;

/*
* 在内核空间分配一片内存,并赋值 msg 令其指向该内存片,
* 此时 msg 实际指向该内存片的首字节的地址。              
*/
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);

最好理解这个问题的方法是:
(1)买个 FPGA 开发板;
(2)在 FPGA 上自己做个 CPU,并搭建一片内存;
(3)将你搭建的那片内存中的某个地址的值读入 CPU 的某个寄存器中。
这样你就打通奇经八脉了,呵呵。
回复 支持 反对

使用道具 举报

发表于 2007-9-27 00:02:33 | 显示全部楼层
用内核学指针的应用 有拔苗助长的 后果
回复 支持 反对

使用道具 举报

发表于 2007-10-6 10:11:00 | 显示全部楼层
to scutan

有点误导的嫌疑......

其实这段代码就是C语言的基础.
struct msg_queue *msg;//这里的确分配了一个变量,但只是一个指针变量,只有4个字节(所有的IA32指针都是4个字节),而且这个变量是在编译期就生成的,并不是在运行的时候才开始出现.至于为什么会出现一个struct msg_queue,这只是为了说明指针到底是只指向哪种类型的变量.你完全可以随便的转换其他类型而不会有任何数据的丢失.


msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);//这里才是真正的分配内存,在运行期间,通过调用标准库函数,在内存开辟一个空间,然后使msg这个指针变量指向内存空间的开头.
回复 支持 反对

使用道具 举报

发表于 2007-10-8 11:10:43 | 显示全部楼层
楼上说的调用标准库函数,这个说法有点不妥。只是调用内核自己的一个函数而已,不能称作库函数。
楼主要先好好理解指针的概念。
struct msg_queue *msg; 这里只是分配一个指针的空间。在32位机器上为4BYTE
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL); 这里从slab的general_cachep中分配 sizeof(struct msg_queue)空间,然后msg中存储这快内存空间的地址。
回复 支持 反对

使用道具 举报

发表于 2007-10-11 06:55:07 | 显示全部楼层

真是强悍!

Post by robinswan
以楼主现在的功力,建议还是先学好应用程序的编程,现在看内核恐怕不行。
建议学好一下课程:
(1)数字电路
(2)计算机原理
(3)编译原理

这里的意思是:
/*
  * 定义一个指针变量 msg,实际上对于CPU来说它只是个整数,
  * 指针类型等等概念,只是编译器的概念而已,对 CPU 来说,根本就没这回事。
  * 如果你的 CPU 是 32 位的,那么它就是一个 32 位的二进制数而已,
  * 这 32 个 bit 物理上将是总线每根电线的电平和时序控制信号。
  * 譬如,CPU 是访问 SDRAM 那么这 32 bit 就是控制内存芯片的片选,使能,
  * 行闸门,列闸门等按时序开启,以及每个存储单元刷新补电等等的信号。
  */
struct msg_queue *msg;

/*
* 在内核空间分配一片内存,并赋值 msg 令其指向该内存片,
* 此时 msg 实际指向该内存片的首字节的地址。              
*/
msg=(struct msg_queue *) kmalloc(sizeof(*msq),GFP_KERNEL);

最好理解这个问题的方法是:
(1)买个 FPGA 开发板;
(2)在 FPGA 上自己做个 CPU,并搭建一片内存;
(3)将你搭建的那片内存中的某个地址的值读入 CPU 的某个寄存器中。
这样你就打通奇经八脉了,呵呵。


买个 FPGA 开发板,在 FPGA 上自己做个 CPU, 需要学习多长时间? 我是做软件的。
对硬件很感兴趣。

btw,至于楼主的问题就用不着搞FPGA 了吧,呵呵。
回复 支持 反对

使用道具 举报

发表于 2007-10-16 01:35:14 | 显示全部楼层
Post by todaygood
买个 FPGA 开发板,在 FPGA 上自己做个 CPU, 需要学习多长时间? 我是做软件的。
对硬件很感兴趣。

btw,至于楼主的问题就用不着搞FPGA 了吧,呵呵。

我之所以这样说只是介绍我自己的经验而已了,
任何人都可以有自己的学习和理解问题的方法。
对于我来说,SoPC (System on Programmable Chip)就是最好的方法。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表