2015-12-23 16:09:02 jin13277480598 阅读数 4909
  • C语言嵌入式Linux编程第7期:Linux内核常用的数据结构...

    学习嵌入式一段时间了,开始学习Linux内核、驱动了,发现看不懂?看内核代码还是感觉很吃力,云里雾里? 本期课程主要侧重于数据结构基本功的学习和Linux内核中的面向对象思想。掌握了这两项技能,再去分析Linux内核中复杂的子系统和驱动代码,相信你会跟以前有不一样的体验和收获。

    547 人正在学习 去看看 王利涛

      在内核学习过程中,我们经常要查找相关函数的定义、参数、头文件等,在VI下查找效率太低。本文为方便Linux内核学习能快速方便地查找到相应的函数及函数定义、文件等。

 

1.下载linux内核源代码,内核下载网站https://www.kernel.org/,这里我下载的是linux -2.6.32.69

2.解压 文件  

  由于是tax.xz的文件,之前用windos下的RAR解压,速度非常慢并且解压不完全。可以将压缩文件放到U盘上面,在Linux下解压tar -zvf linux-2.6.32.69.tar.xz,解压之前最好能给权限chmod 777 linux-2.6.32.69.tar.xz。但这里极力推荐一个比较简单的方法在windows下面用7ZIP解压,它能显示解压的进度并且解压的速度非常快。7ZIP可以在360软件管家下载或者网上查询下载,这里推荐360软件管理,安全方便。解压过程分为两步进行,首先提前出linux-2.6.32.69.tar,之后在对tar文件解压。

 

 

 

3.下载Source Insight3.5工具 

   这个工具特别小,安装简单,网上都有这里就不详细叙述。官网http://www.sourceinsight.com/,试用期为30天,也可以从其他网站下载安装。

 

4.将linux内核代码导入到Source Insight3.5

 4.1 由于Source Insight默认支持文件中只有.c ,.h ,而Linux内核虽然其主要是编写但其同时包含其他语言,如启动文件中的汇编语言。我们可以通过菜单中“Options”->"Document Options"调出Document Options设置窗口,在File filter中增加: *.S;*.lds;Kconfig;*defconfig;*.in;Makefile 。从而避免之后在点击Add Tree添加目录树时候,一些文件不能默认加入工程中。

4.2  之后便是将源码加入到工程里面。新建Project,在工程设置中的配置选项,尽量将第一个复选框选中,这样其拥有与源代码大致相同的数据库,能加快查找速度。选择源代码所在位置,点击OK。在之后出现的对话框中选择add tree

4.3  安装完成的界面如下,现在就可以非常方便的查找了,这里我们以查看内核中重要的List.h为例显示效果。

 

 

 

2019-12-27 11:48:55 yangyang031213 阅读数 35
  • C语言嵌入式Linux编程第7期:Linux内核常用的数据结构...

    学习嵌入式一段时间了,开始学习Linux内核、驱动了,发现看不懂?看内核代码还是感觉很吃力,云里雾里? 本期课程主要侧重于数据结构基本功的学习和Linux内核中的面向对象思想。掌握了这两项技能,再去分析Linux内核中复杂的子系统和驱动代码,相信你会跟以前有不一样的体验和收获。

    547 人正在学习 去看看 王利涛

在windows下使用source insight写linux代码,使用

#include <linux/interrupt.h>

这样的头文件包含的方式始终无法跳转到头文件,出现Symbol not find.,如下:
在这里插入图片描述
应该如何设置呢?在source insight的BASE工程中添加linux内核include目录无效,最终找到的办法是建立一个Common project包含进来,如下:
1、在菜单栏Options / Preferences菜单中:点击Create Common project按钮。
在这里插入图片描述
2、选择C/C++头文件包含,点击浏览选择linux内核include文件夹,点击continue进入创建工程
在这里插入图片描述
3、新建工程
在这里插入图片描述
4、默认设置
在这里插入图片描述
5、选择路径然后Add Tree,Close关闭窗口
在这里插入图片描述
6、再进到Options / Preferences / Symbol Lookups,已经添加进来了,这时候

#include <linux/interrupt.h>

这样的代码就可以跳转了,其他的头文件应该类似。
在这里插入图片描述

2011-10-09 10:02:46 zhuxiaoyang 阅读数 2667
  • C语言嵌入式Linux编程第7期:Linux内核常用的数据结构...

    学习嵌入式一段时间了,开始学习Linux内核、驱动了,发现看不懂?看内核代码还是感觉很吃力,云里雾里? 本期课程主要侧重于数据结构基本功的学习和Linux内核中的面向对象思想。掌握了这两项技能,再去分析Linux内核中复杂的子系统和驱动代码,相信你会跟以前有不一样的体验和收获。

    547 人正在学习 去看看 王利涛

 前言:在Win7下安装了VMware+Ubuntu,现在想阅读Linux内核代码。首先想到的是使用Source Insight,它是一款非常优秀的代码阅读工具。但Source Insight是运行在Window下的。除了将Linux内核代码copy到window下外,还有其他方法吗? 请教过度娘后,总结如下。

 

准备工作:

1)  下载内核代码

Linux内核代码一般放在/usr/src/目录下,安装Ubuntu后,该目录下一般有两个文件夹。由于我安装的是Ubuntu10.04发布版本,其对应内核版本是2.6.32,所以/usr/src/目录下默认两个文件夹是linux-headers-2.6.32-33和linux-headers-2.6.32-33-generic。

从文件名夹名可知这里只是一些header,并不是完整的内核源代码。完整内核源代码请从www.kernel.org上下载,或者使用apt-get install linux-source下载与当前版本匹配的内核代码。

这里提醒下,可能有些童鞋机器上无法使用apt-get命令进行某些程序的安装,这是由于源中没有对应安装程序,可以system->Administration->Update Manager->check,触发源的更新,然后再尝试apt-get命令。

2)  下载个source insight安装包

这里提供个source insight 3.5的key:SI3US-032434-64929

Window下SI的下载安装没什么说的,安装完成后,在第一次启动SI时输入上面的key,就可以了。

 

一、方法1  copy内核代码到Window下,然后建立SI工程

我安装的VMware的version是7.1.4 build-385536,其支持宿主机和虚拟机上文件夹的互拷贝,不需要其他设置。

这是提醒下,如果你的内核已经编译过,直接copy内核代码目录会失败,并提示你You have attempted to copy one or more symbolic links to a host OS that does not support symbolic links. Aborting the copy operation.

这是因为内核编译后在arch/i386/boot目录生成的bzImage无法拷贝,如果只是要阅读源代码,这个文件无需拷贝,你也可以将源代码根目录压缩后再拷贝。

 

将代码放到Window下指定目录,下面使用Source Insight加载Linux内核代码

步骤如下:

1)  project->new project

                   输入工程名称和SI工程存储的路径

                  

                   输入linux内核代码所在路径,其他设置默认。

然后在add and remove project files配置页面中点击Add all->勾选Recursively add lower sub-directories。这里也可以将arch下和体系结构相关代码从project中去除(例如我的机器是i386体系结构,其他体系结构代码我并不关心),选中对应文件夹,然后remove tree即可。

2)   默认情况下Linux中makefile,汇编(*.S)文件没有添加到Project中。这是因为SI默认无法识别这些文件的后缀,可以在Options->Document Options中进行设置,以让SI认识这些文件。

在Document Type中选择Make File,并将File filter设置为*makefile,表示所有以makefile结尾的文件名都识别为Make File文件。

类似的,在Document Type中选择C Source file,File filter中添加*.S,即修改为*.c;*.h;*.S。

如果有其他后缀文件要识别的话,也可以类似添加,然后在project->add and remove project files中重新Add all所有文件一次。

另外在上述配置页中还可以设置字体大小等,在此不赘述。

3)  至此,工程文件已经建立完成,但为方便符号之间的关联,请执行search->browse project symbols…,执行时间会比较长。此后对某个symbol按ctrl和+键就可以转到对应定义处。

 

二、 方法2  映射网络驱动器

可以将Ubuntu中共享文件夹设置为Window下一个网络驱动器,然后SI从网络驱动器中添加内核源代码。

1)要映射网络驱动器,首先开启Linux下Samba服务

安装samba:sudo apt-get install samba samba-client samba-common

启动samba:sudo service smbd stop

                     sudo service smbd start

       2)设置共享文件夹

         例如内核代码在/usr/src/linux-2.6.26中,右键该文件夹,选择sharing options,然后将Share this folder, Allow others to create and delete files in this folder,Guest access都勾选。

       3) 查看虚拟机Ubuntu的ip地址:查询命令是ifconfig,例如我机器ip是192.168.217.133

然后在Windows下进行驱动器的映射

我这里被映射的文件夹是\\192.168.217.133\linux-2.6.26,可见文件夹路径是虚拟机ip地址加上Ubuntu中被共享的文件夹名,成功后可以在“计算机”下看到Z盘,双击打开可以进行任何操作。

4)  参照方法1,在SI中建立project,只不过这次将project设置在z盘下,然后linux内核代码也从z盘添加。

这样,我们建立了window和ubuntu之间的交叉环境,两边可以对同一份源文件进行查看和修改。

 

三、 方法3:Wine+SI

Wine是一款优秀的Linux系统平台下的模拟器软件,用来将Windows系统下的软件在Linux系统下稳定运行。

Ubuntu下安装Wine:sudo apt-get install wine 

Wine比较大,大约200多M。

如果apt-get执行失败,请参照前面介绍的更新源的方法后再尝试。

安装成功后在Applications下能看到Wine。

1)  Wine中安装Source Insight

将在Windows下下载的source insight安装程序copy到ubuntu的桌面上,例如该安装程序名为“Si3563Setup.exe”。然后右键该文件,选择Open with Wine Windows Program Loader

接下来就像在windows下安装SI一样。

 

SI会被安装到Wine虚拟出来的的c:\program files\Source Insight 3下。通过如下方法找到:

Applications->Wine->Browse C:Drive,然后program files\Source Insight 3\ Insight3.exe

创建Insight3.exe的一个Link,并放置到Ubuntu桌面上,以后右键该Link并选择Open with Wine Windows Program Loader就可以启动SI了。

2)  类似方法1,建立内核代码工程

 

至此,介绍完了三种方法来搭建内核代码阅读环境,个人认为方法2:网络驱动器映射最为方便。Wine+SI方法在Ubuntu下不是十分稳定,经常出现无法响应等奇怪问题,重启SI后一般可以解决,而且该方式运行速度有些慢。

2016-12-06 20:09:35 CoderJYF 阅读数 1746
  • C语言嵌入式Linux编程第7期:Linux内核常用的数据结构...

    学习嵌入式一段时间了,开始学习Linux内核、驱动了,发现看不懂?看内核代码还是感觉很吃力,云里雾里? 本期课程主要侧重于数据结构基本功的学习和Linux内核中的面向对象思想。掌握了这两项技能,再去分析Linux内核中复杂的子系统和驱动代码,相信你会跟以前有不一样的体验和收获。

    547 人正在学习 去看看 王利涛

Linux内核源代码获取教程

  • 什么叫Linux
  • 什么叫Linux内核
  • Linux内核源代码的获取


什么叫Linux?

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIXUNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位64位硬件。Linux继承了Unix网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。(当然这是最初),现在单靠一个人去维护那显然远远不够,Linux源代码有最初的3000多行已经强大到3000多万行(当初听老师讲的)。

什么叫Linux内核

Linux的“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载

Linux内核源代码的获取

Linux内核源码的获取大概分为以下步骤

1.访问Linux内核官方网站:https://www.kernel.org/


2.进入内核管理--点击Linux

3.点击Kernel(内核)

4.可以看到v1.0……好多版本,选择你想要获得的版本,进入


5.笔者选择3.x  往下拖拉直到看到源代码的压缩文件可以下载






获取内核源代码教程就到此结束了!



2011-04-25 21:02:00 z2007b 阅读数 18786
  • C语言嵌入式Linux编程第7期:Linux内核常用的数据结构...

    学习嵌入式一段时间了,开始学习Linux内核、驱动了,发现看不懂?看内核代码还是感觉很吃力,云里雾里? 本期课程主要侧重于数据结构基本功的学习和Linux内核中的面向对象思想。掌握了这两项技能,再去分析Linux内核中复杂的子系统和驱动代码,相信你会跟以前有不一样的体验和收获。

    547 人正在学习 去看看 王利涛

这些技巧都是平时我自已在阅读的时候总结的,想到哪就说到哪了,其实我总结的技巧远不止这些,但是先说这些吧。后面想到了再补充,只有在拿到代码做分析的时候遇到实际的问题时,才能见招拆招,想些办法。
其实linux内核源码还是比较难跟踪的,我刚开始阅读内核源码的时候,感觉很多东西经常找着找着就失去头绪了,很郁闷。
通过一些阅读后发现内核也就那么几招用的比较多,摸清楚其脾气后,剩下的就是耐心了。
1.我曾经用过一阵VI,装了一堆插件后折腾了一阵,发现还是无法感受其推崇者所说的那一堆好处,还是喜欢用sourceinsight。好了,说正题了。首先我们要解决的就是函数或者变量找不到定义地方的问题,表现在sourceinsight上就是那个变量是黑的,到处找不到。
比如我们看们看到:
int bus_register(struct bus_type * bus)
{
 ...
 subsys_set_kset(bus, bus_subsys);
 retval = subsystem_register(&bus->subsys);
 ...
}
其中的bus_subsys。
找了一下bus_subsys找不到定义的地方,肯定是内核和我们躲猫猫,这时候我们可以是否查找一些明显的“定义痕迹”,比如在bus_subsys中的subsys或者说_subsys。果然有新发现。我们找到了这么一个宏。
#define decl_subsys(_name,_type,_uevent_ops) /
struct subsystem _name##_subsys = { /
 .kset = { /
  .kobj = { .name = __stringify(_name) }, /
  .ktype = _type, /
  .uevent_ops =_uevent_ops, /
 } /
}
得,我们回过头在包含有bus_register的源文件及头文件中查找一下,果然找到了static decl_subsys(bus, &ktype_bus, NULL);这么一行代码。
像这种东西我不是很建议一找不到就直接去网上找,关于内核的文章网上虽然很多,但都不会细到所有的细节都有,你总有独立处理问题的时候,为什么我们不提前让自已多锻炼一下呢?
2.顺序问题,内核有很多的顺序,比如初始化的顺序,比如我们有module_init,__initcall等等,一来编译的时候文件夹和文件有顺序,另外不同的宏包含的东西顺序也是有讲究的,所以在分析模块的时候一定要注意这个,这个东西只能说是注意了,如果对一个模块不熟悉的时候,不可能做到全部都了解,像我有时候也会落下一些东西忘记分析,但是随着看内核的时候越久,内核那些惯用的手法见多了后,就发现不外如是,也就那三瓜子两枣。

3.我们要解决内核运行时那一堆指来指去的指针的问题。这个是我自已调试用的土方法,我就用dump_stack在关键的地方打印出顺序就行了。因为我们做的是嵌入式设备,很多时候不能用KGDB这些高级工具在线调,而且这种方法基本不增加其它的性能开销。

4.有多个定义不知道用哪个。这个基本是因为LINUX支持的CPU比较多造成的。
我们可以用GDB静态分析,也可以用objdump和nm等工具来精确定位一些函数和变量,也可以根据宏来一步一步分析,比如是mips的那么我们就进mips看,这样一步一步来。

5.具备一些意识,你现在面对的是操作系统,不仅仅是只有C文件和头文件的应用,MAKEFILE,链接文件,Kconfig都应该是你的朋友。尤其在看一个模块或者一小部分你感兴趣的代码的时候,首先可以用MAKEFILE和KCONFIG来缩小你需要关注的范围。其实关于MAKEFILE和KCONFIG的重要性,fudan_abc在他那个LINUX那些事之我是USB中强调的比较多,但是说实话,fudan_abc那文章看了玩是挺好玩的,可惜感觉好像看了没啥用,就是知道了一堆概念,不能串起来,我不知道是我的理解能力不行,还是任侨伟同志压根没有讲清楚。呵呵。

 

没有更多推荐了,返回首页