当前位置: 首页 > Linux

札记,Linux内核设计与实现,2

时间:2023-04-06 06:40:29 Linux

从内核开始,本以为这一章可以快速跳过,但还是发现了很多新的有趣的地方。获取源代码https://www.kernel.org压缩源代码或增量补丁bz2tarxvjflinux-x-y-z.tar.bz2gztarxvzflinux-x-y-x.tar.gzhttps://github.com/torvalds/l。..InstallSourcecode/usr/src/linux请勿使用此源码树进行开发,因为编译后的C库使用的内核版本链接至此树。正确:创建您自己的主目录,然后仅使用root进行安装。关于补丁:patch-p1<../patch-x.y.z内核源码树目录描述archspecificarchitecturesourceblockdeviceiolayercryptoconfidentialAPIDocumentskernelsourcedocumentationdriversdevicedriverfirmwaredevicefirmwarerequiredtousecertaindriversfsVFSandvariousfilesystemsincludekernelsamefileinitkernelbootingandinitializationipcinter-processcommunicationkernelcoresubsystemlibgeneralkernelfunctionmmmemorymanagementsubsystemandVMnetnetworksubsystemsamplesexamplescripts用于编译内核的脚本开发工具virt虚拟化系统编译编译Linux前需要配置:CONFIG_XXXX:yes|no|module;决定哪些文件可以编译进内核;module表示选择配置选项,但是在编译时,这部分功能的实现代码以模块的形式生成(动态安装的独立代码块)。通过预处理命令处理代码;配置选项可以是字符串和证书,以预处理宏的形式指定内核源代码可以访问的值;例如指定静态分配数组的大小。配置命令:通过makeconfig图形界面工具makemenuconfiggtk+图形工具makegconfig默认配置makedefconfig将配置选项放在根目录下。放在/proc/config.gz下,可以从/proc复制配置文件,用它来编译新的内核:zcat/proc/config.gz>.configmakeoldconfig配置完成后:make>/dev/nullimproveMake高效的多核,比如16核:make-j32>/dev/null;安装参考引导工具的说明,将内核镜像复制到/boot目录下,按照启动要求进行安装。内核模块的安装是自动的,makemodules_install,安装到/lib/modules下。编译的时候会在内核代码树的根目录下创建一个System.map文件,一个符号对照表,内核符号和它们的起始地址对应,需要将内存地址翻译成通俗易懂的函数名和变量名。内核开发编译内核时不能访问c库文件(libc)和标准c头文件lib/string.c=>。内核开发的头文件基本上都在源代码的include目录下。.h>系统相关的头文件arch/x86/include/asm未实现的printf()->prink将格式化后的字符串复制到日志缓冲区,syslog程序可以通过读取这个缓冲区来获取内核信息。您可以指定优先级标志,类似于宏定义prink(KERN_ERR"thisisanerror.\n")。使用GNUCgcc工具包含多种GNU编译器,可以编译内核。内核C语言包括ISOC99标准和GNUC扩展功能。与标准C语言的大部分差异是GNUC的扩展。内联函数inline:函数在调用位置展开,消除函数调用和返回的开销,代码变长,占用更多内存空间或指令缓存;函数较大,重复调用,没有时间要求。static不建议结合使用staticinlinevoidwolf(unsignedlongtail_size)在使用前定义,建议在头文件中定义,最好是inline函数而不是宏内联汇编只能如果架构已知,接近底层或对执行时间有严格要求,则使用asm()unsignedintlow,hightasmvolatile("rdtsc":"=a"(low),"=d"(high));branch语句gcc优化分支,经常出现likely,unlikelyif(unlikely(error))一定要搞清楚真的有偏见吗?它对性能有很大的影响。没有内存保护机制。用户程序非法访问内存。内核会发现发送了SIGSEGV信号来结束进程。内核内存访问错误,导致oops非法内存访问引用空指针。使用一个字节,少一个物理内存。不要轻易使用浮点数在用户空间操作浮点数。内核需要从整数模式切换到内核模式。具体实现与系统相关。在内核中使用浮点数时,需要手动保存和恢复浮点数点寄存器等复杂的工作。内核只有一个小而固定的堆栈。用户空间可以动态分配大容量栈。内核不工作。内核堆栈的大小因系统而异。对于x86,在编译时就确定了,4KB或者8KB;两页大小,32位8KB,64位16KB注意同步和并发的原因:Linux是抢占式多任务操作系统,内核在调度过程中必须与任务同步,以支持对称多处理器系统SMP;两个或多个处理器在互联网上执行的内核代码可能同时访问同一个共享资源。中断异步到达。它可能在访问资源时到达。中断程序可能处理相同的资源。Linux内核可以抢占它,内核中正在执行的代码可能被同一段代码抢占。导致多段代码同时访问同一个资源。方法:自旋锁信号量可移植性很重要