推荐一些好的Linux内核参考书?
  a.《Linux Device Drivers, Second Edition》,有中文译本
  b.《Understanding the Linux Kernel, 2nd Edition》
  c.《Linux内核源代码情景分析》,分上下两册
  d.《边干边学-Linux内核指导》

如何得到某一版本的Linux内核源代码?
  a. http://www.kernel.org或ftp://ftp.kernel.org,这是Linux内核版本的发布网站。
  b. 很多镜像或本地网站也提供部分Linux内核版本的下载,多用ftp搜索引擎。
  c. 一般的Linux发行版如Redhat之类会随盘提供相应的内核源代码,不过这个源代码往往是改动过的,与同版本的标准Linux内核可能有些差异。

推荐一些源代码查看工具?
  a. Windows系统可以用Source Insight,Linux系统可以用Source Navigator。
  b. vim或emacs编辑器,配合cscope、ctags、etags等交叉索引工具。
  c. vim或emacs编辑器,配合grep、egrep等文本搜索工具,不过最好要对源代码目录结构有所熟悉
  d. LXR,以网页的形式通过浏览器浏览,安装复杂,可从http://lxr.linux.no/下载该工具也可以直接访问http://lxr.linux.no/source/在线阅读Linux内核源代码。

xx结构的定义在哪个内核源文件中?
  a. 请使用源码查看工具,见问题2.2。
  b. 如果用grep等文本搜索工具,主要在include/linux和include/asm两个目录下搜索。

volatile和__volatile__是什么意思?
  a. volatile是C语言定义的关键字,gcc为了需要又定义了__volatile__,它和volatile表达的是同一意思。
  b. volatile的本意是"易变的",由于访问寄存器的速度快于访存,所以编译器一般都会作优化以减少访存。如果变量加上volatile修饰,则编译器就不会对此变量的读写操作进行优化,即不通过寄存器缓冲而直接访存。
  c. __asm__ __volatile__一起指示编译器不要改动优化后面的汇编语句。

do{ ... } while(0)是什么意思?
  a. 主要是为了避免宏在不同情况展开可能会出现的一些错误。
  b. 在http://www.kernelnewbies.org/faq/上有详细介绍。

list_entry的定义是怎么回事?
  a. list_entry的定义在内核源文件include/linux/list.h中:
  #define list_entry(ptr, type, member) \
  ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
  b. 其功能是根据list_head型指针ptr换算成其宿主结构的起始地址,该宿主结构是type型的,而ptr在其宿主结构中定义为member成员。如下图:

  req>|type型对象起始地址
  |
  |... ...
  ptr>|ptr指针所指的member成员地址
  |
  |... ...

  ptr指向图中所示的位置,通过(unsigned long)(&((type*)0)->member)得到ptr和req之间的差值,ptr减去这个差值就得到了type型宿主结构的指针req,返回类型为(type*)。

模块编程需要注意什么?
  a. 在gcc编译选项中增加-c
  b. 在gcc编译选项中定义两个宏:-DMODULE -D__KERENL__
  或直接在源文件中定义这两个宏:
  #define MODULE
  #define __KERNEL__
  c. 在源文件中包括module.h文件:
  #include
  d. 如果要用inline功能,需要在gcc编译选项中增加-O2

为什么insmod一个模块时显示版本不匹配?
  假定你现在运行的内核的源码目录绝对路径是MyKernelSrcPath,在gcc编译时增加选项:
  -I $MyKernelSrcPath/include

为什么出现Unresolved Symbol?
  a. 首先查看文件/proc/ksyms,看内核有没有输出这个符号,不同的内核版本如2.2和2.4输出的符号会有些变化。
  b. 如果内核输出的符号带有版本控制信息如符号printk_R12345678,则性质同问题3.2。

为什么出现no license错误?
  在源文件加入下面一行:
  MODULE_LICENSE("GPL");

为什么看不到用printk打印的信息?
  a. 打印消息受级别的限制,消息级别可以通过printk设置,如:
  printk("something"); /* 其中0<=n<=7 */
  假设控制台的消息级别为m, 当n 这样一方面可以提高要打印消息本身的级别(数字越小级别越高),另一方面可以改变控制台的消息级别(可从1到8),如改为8可用以下命令:
  # echo "8" > /proc/sys/kernel/printk
  b. 用dmesg命令看。
  c. 当系统运行klogd和syslogd时,内核消息就会由klogd分发到syslogd,syslogd会根据配置文件/etc/syslog.conf作相应处理,具体可以查看syslogd和syslog.conf的man页。

怎么制作、使用patch文件?
  patch文件是由diff命令生成的,使用patch文件用patch命令,具体可查看diff和patch的man页和info。

在内核中可以使用系统调用吗?
  a. 可以。内核源代码中就有使用系统调用的例子,如open()、execve()等。
  b. 在内核中使用系统调用必须要在源文件中包括以下两行:
  #define __KERNEL_SYSCALLS__
  #include
  c. 内核中使用系统调用的相关定义可查看文件include/asm/unistd.h。
  如果要用的系统调用该文件中没有定义,可以按照其格式自行添加。

在内核中怎么打开并操作一个文件?
  a. 直接用open()、read()等系统调用,见问题4.2。
  b. 用filp_open()函数打开文件,得到struct file *的指针fp。
  使用指针fp进行相应操作,如读文件可以用fp->f_ops->read。
  最后用filp_close()函数关闭文件。
  filp_open()、filp_close()函数在fs/open.c定义,在include/linux/fs.h中声明。
  c. 自己写包装函数,可参照文件fs/exec.c中的open_exec()和kernel_read()函数。
  在http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=363455&page=&view=&sb=&o=&vc=1上有些代码可以参照。

在内核中读写文件时为什么会出现EFAULT错误?
  a. 内核文件系统提供的read()和write()之类的函数,期望是对用户态程序服务的,所以它会验证读写缓冲区不超过用户空间的上限即0xC000 0000。但现在内核中要读写文件,缓冲区在内核中即地址会超过0xC000 0000。
  b. 在读写文件前先得到当前fs:mm_segment_t old_fs=get_fs();
  并设置当前fs为内核fs:set_fs(KERNEL_DS);
  在读写文件后再恢复原先fs: set_fs(old_fs);
  set_fs()、get_fs()等相关宏在文件include/asm/uaccess.h中定义。

请问xx命令、xx库的源码是哪个文件?
  a. 一个系统除了内核以外,还需要有shell、gcc等一系列工具和命令以及C库等一系列库,这些作为应用程序其源代码都不在内核中,需要另外下载相应的源代码。
  b. 对于Redhat系统,可以用rqm -qf命令来查找某一命令所在的软件包,然后再找相应的源代码包安装。

Linux内核常见FAQ相关推荐

  1. Linux内核常见分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  2. Linux内核中常见内存分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  3. 如何成为一个Linux内核开发者

    你想成知道如何成为一个Linux内核开发者么?或者你的老板告诉你,"去为这个设备写一个Linux驱动."这篇文档的目的,就是通过描述你需要经历的过程和提示你如何和社区一起工作,来教 ...

  4. linux read函数_浅谈Linux内核IO体系之磁盘IO

    前言 Linux I/O体系是Linux内核的重要组成部分,主要包含网络IO.磁盘IO等.基本所有的技术栈都需要与IO打交道,分布式存储系统更是如此.本文主要简单分析一下磁盘IO,看看一个IO请求从发 ...

  5. linux 内核配置简介

    Gentoo Linux Gentoo内核(gentoo-sources)特有的选项 Gentoo Linux support CONFIG_GENTOO_LINUX 选"Y"后, ...

  6. 【转载】linux内核学习书籍

    [转载]linux内核学习书籍 1, 关于操作系统理论的最初级的知识.不需要通读并理解<操作系统概念><现代操作系统>等巨著,但总要知道分时(time-shared)和实时(r ...

  7. 编译安装linux内核步骤

    编译安装linux内核步骤: 一.获取内核源码 源码网址:www.kernel.org 二.解压内核源码 首先以root帐号登录,然后进入/usr/src子目录.如果用户在安装Linux时,安装了内核 ...

  8. Linux内核网络栈1.2.13-socket.c函数概述

    参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数概述 根据socket提供的常用的库函数,socket,read,write等函数, 执行的过程 in ...

  9. linux内核页高速缓存,《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写(示例代码)...

    主要内容: 缓存简介 页高速缓存 页回写 1. 缓存简介 在编程中,缓存是很常见也很有效的一种提高程序性能的机制. linux内核也不例外,为了提高I/O性能,也引入了缓存机制,即将一部分磁盘上的数据 ...

最新文章

  1. C++用substr()函数消除前后空格
  2. C++知识点23——使用C++标准库(顺序容器list的其他操作)
  3. python绘制多个条形图_python – 在Matplotlib中绘制多个直方图 – 颜色或并排条形图...
  4. python多线程处理图片_Python斗图网多线程爬取图片
  5. 华为微型计算机b515,华为MateStation B515台式机曝光:五种配置
  6. 如何避免_如何避免变频器受负载冲击
  7. h3c trunk口改access_H3C交换机二层应用及三层交换基本配置
  8. python 时间模块 time datetime calendar
  9. android 最新功能介绍,Android Studio 常用功能介绍
  10. ACCESS的十种数据类型分别对应的添加语句
  11. 如何用计算机画磁滞回线,[画图的问题]怎么画类似于磁滞回线的图像?一个x值对应两个y值的...
  12. 蓝桥杯2015年第六届javaB组省赛第一题-三角形面积
  13. centos8 默认nginx路径_centos8自定义目录安装nginx(教程详解)
  14. MultipartFile多文件上传
  15. Java面试题(三)TCPIP协议
  16. multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
  17. Java 求向量夹角,坐标旋转
  18. 加速区块链改革促进区域经济转型升级 ——中国·平泉负氧离子产业园正式落成
  19. mac如何看html5视频播放器,适用于Mac的HTML5视频播放器
  20. 000webhost提供 1500M免费空间 可绑顶级域名

热门文章

  1. SQL优化—— 大批量插入数据
  2. 热部署Devtools的简单使用
  3. Python+selenium 自动化 - 实现自动导入、上传外部文件实例演示
  4. Geany 权限问题:Error opening file ... : permission denied.,原因及解决办法。
  5. 学习《FreeRTOS源码详解与应用开发》笔记
  6. MRCTF2020]你传你码呢
  7. sdut-1117 C语言实验——求绝对值(选择结构)
  8. 5.4 matllab数据插值案例(机动车刹车距离问题、)
  9. Longest Common Prefix
  10. mysql的索引本质是一颗_一文揭开Mysql索引本质