linux命令的源码 linux命令源码分析

Linux内核源码解析-list.h 开头就说明了这里的 list.h 文件来自 Linux Kernel ( */include/linux/list.h ),只是去除了列表项的硬件预加载部分 。
进行宏替换后就是
Note: 没搞懂这里为什么加个 osn 前缀,原本是 list_add ,现在是 osn_list_add。
可以看到就是个简单的链表节点删除过程,同时把删除节点的前后指针设为无法访问 。
删除节点后初始化 , 前后指针都指向自己
从A链表删除后头插法插入B链表
从A链表删除后尾插法插入B链表
先对 list 判空,非空就把 list 链表除头节点外裁剪到 head 头节点在的链表中 。函数不安全,list 节点可以继续访问其他节点 。
多了一步 list 重新初始化的过程 。
(unsigned long)(((type *)0)-member))) 将0x0地址强制转换为 type * 类型,然后取 type 中的成员 member 地址 , 因为起始地址为0,得到的 member 的地址就直接是该成员相对于 type 对象的偏移地址了 。
所以该语句的功能是:得到 type 类型对象中 member 成员的地址偏移量 。
先将 ptr 强制转换为 char * 类型(因为 char * 类型进行加减的话,加减量为 sizeof(char)*offset ,char 占一个字节空间,这样指针加减的步长就是1个字节,实现加一减一 。)
整句话的意思就是:得到指向 type 的指针,已知成员的地址,然后减去这个成员相对于整个结构对象的地址偏移量,得到这个数据对象的地址 。
就是从前往后 , 从后往前的区别
Note: 从head节点开始(不包括head节点?。┍槔拿恳桓鼋诘悖∷胣先将下一个要遍历的节点保存起来 , 防止删除本节点后,无法找到下一个节点,而出现错误!
已知指向某个结构体的指针pos,以及指向它中member成员的指针head , 从下一个结构体开始向后遍历这个结构体链
Note: 同理,先保存下一个要遍历的节点!从head下一个节点向后遍历链表 。
list.h使用说明
linux内核list.h分析(一)
linux内核list.h分析(二)
【Linux内核数据结构】最为经典的链表list
如何查看linux命令的源代码1. 以搜索ls命令源码为例,先搜索命令所在包,命令如下:
lpj@lpj-linux:~$ which ls
/bin/ls
2. 用命令搜索该软件所在包,代码如下:
lpj@lpj-linux:~$ dpkg -S /bin/ls
coreutils: /bin/ls
3. 从上一步中可以知道ls命令的实现在包coreutils中,用apt安装(说安装有些歧义,主要是区分apt-get -d)该包的源代码然后解压,代码如下:
sudo apt-get source coreutils
cd /usr/src/coreutils-XXX #XXX表示版本号
sudo tar zxvf coreutils-XXX.tar.gz
或者只下载源码,然后手动打补丁再解压,代码如下:
sudo apt-get -d source coreutils
cd /usr/src
tar zxvf coreutils-XXX.tar.gz
gzip -d coreutils-XXX.diff.gz #这一步会生成coreutils-XXX.diff文件
patch -p0coreutils-XXX.diff
cd coreutils-XXX
tar zxvf coreutils-XXX.tar.gz
OK,这几步执行完后 , 就可以进入/usr/src/coreutils-XXX/coreutils-XXX/src中查看各命令对应的源代码了
如何查看linux命令源代码用linux一段时间了linux命令的源码,有时候想看看ls、cat、more等命令的源代码linux命令的源码 , 在下载的内核源码中用cscope没能找到,在网上搜索了一下,将方 法总结如下:以搜索ls命令源码为例,先搜索命令所在包,命令如下:
lpj@lpj-linux:~$ which ls /bin/ls用命令搜索该软件所在包,代码如下:
lpj@lpj-linux:~$ dpkg -S /bin/ls coreutils: /bin/ls从上一步中可以知道ls命令的实现在包coreutils中,用apt安装(说安装有些歧义 , 主要是区分apt-get -d)该包的源代码然后解压,代码如下:
sudo apt-get source coreutils cd /usr/src/coreutils-XXX #XXX表示版本号 sudo tar zxvf coreutils-XXX.tar.gz 或者只下载源码,然后手动打补丁再解压,代码如下:
sudo apt-get -d source coreutils cd /usr/src tar zxvf coreutils-XXX.tar.gz gzip -d coreutils-XXX.diff.gz #这一步会生成coreutils-XXX.diff文件 patch -p0coreutils-XXX.diff cd coreutils-XXX tar zxvf coreutils-XXX.tar.gzOK,这几步执行完后,就可以进入/usr/src/coreutils-XXX/coreutils-XXX/src中查看各命令对应的源代码了 。
关于更多Linux的学习,请查阅书籍《linux就该这么学》 。
linux命令的源代码怎么获取1)在使用dpkg时,若出现错误,可以使用sudo命令使其以root权限执行 。
2)使用apt-get source下载的源代码保存到当前目录下 。。此外,当我们知道了命令所属的包后,也可以到相应的官方网站下载 。
2、CentOS中系统命令源代码的获取方法
以32位CentOS6.6下,获取ls命令的源代码为例,可以使用如下的方法下载源代码:
1)配置源代码的源
在CentOS中,源的配置文件为:/etc/yum.repos.d/CentOS-Base.repo,修改该文件需要root权限 。
linux内核源码在哪一般在Linux系统中的/usr/src/linux*.*.*(*.*.*代表的是内核版本,如2.4.23)目录下就是内核源代码(如果没有类似目录,是因为还没安装内核代码) 。另外还可从互连网上免费下载 。注意,不要总到去下载,最好使用它的镜像站点下载 。请在里找一个合适的下载点,再到pub/linux/kernel/v2.6/目录下去下载2.4.23内核 。
代码目录结构
在阅读源码之前,还应知道Linux内核源码的整体分布情况 。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成 。Linux内核源码的各个目录大致与此相对应,其组成如下(假设相对于Linux-2.4.23目录):
1.arch目录包括了所有和体系结构相关的核心代码 。它下面的每一个子目录都代表一种Linux支持的体系结构 , 例如i386就是Intel CPU及与之相兼容体系结构的子目录 。PC机一般都基于此目录 。
2.include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下 。
3.init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件 。这是研究核心如何工作的好起点 。
4.mm目录包含了所有的内存管理代码 。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下 。
5.drivers目录中是系统中所有的设备驱动程序 。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound 。
6.ipc目录包含了核心进程间的通信代码 。
7.modules目录存放了已建好的、可动态加载的模块 。
8.fs目录存放Linux支持的文件系统代码 。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录 。
Kernel内核管理的核心代码放在这里 。同时与处理器结构相关代码都放在arch/*/kernel目录下 。
9.net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面 。
10.lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下 。
11.scripts目录包含用于配置核心的脚本文件 。
12.documentation目录下是一些文档,是对每个目录作用的具体说明 。
一般在每个目录下都有一个.depend文件和一个Makefile文件 。这两个文件都是编译时使用的辅助文件 。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助 。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解 。
在阅读方法或顺序上,有纵向与横向之分 。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行 。它们经常结合在一起进行 。对于Linux启动的代码可顺着Linux的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析 。实际上这是一个反复的过程 , 不可能读一遍就理解 。
【linux命令的源码 linux命令源码分析】关于linux命令的源码和linux命令源码分析的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读