<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Linux Kernel Developer]]></title><description><![CDATA[I was high-level programmer, then low-level one. One day I'll be machine-language programmer !]]></description><link>https://blog.youkuaiyun.com/u010035971</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u010035971]]></copyright><item><title><![CDATA[C 语言中的元素指针与一维数组指针]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/76165487</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/76165487</guid><author>u010035971</author><pubDate>Wed, 26 Jul 2017 20:58:17 +0800</pubDate><description><![CDATA[在我上大三的时候，有段时间发现自己对指针的理解不够深入，所以就看了《Pointers On C》这本书的指针章节，当时印象很深刻的是接触到了一维数组指针这个概念，最近我在看内核代码时又遇到了这个问题，结果一时间竟然没看懂，搜了资料才想起来这么个概念。举个例子：#include<stdio.h>void main()
{
    int boot_gdt[] = {1,2,3};
    int *a]]></description><category></category></item><item><title><![CDATA[博客迁移说明]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/73825842</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/73825842</guid><author>u010035971</author><pubDate>Wed, 28 Jun 2017 08:45:43 +0800</pubDate><description><![CDATA[本博客于2017年迁移至 haolee.io]]></description><category></category></item><item><title><![CDATA[Linux 内核中逻辑地址/虚拟地址/线性地址三者的区别]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/71156109</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/71156109</guid><author>u010035971</author><pubDate>Wed, 03 May 2017 22:27:15 +0800</pubDate><description><![CDATA[本博文引自我的知乎回答：Linux 线性地址，逻辑地址和虚拟地址的关系？

为了防止歧义，以下术语都用英文。部分术语不做解释了，不然答案就太长了。

以下讲解都是以代码段为例

在 Intel 平台下，逻辑地址(logical address)是 selector:offset 这种形式，selector 是 CS 寄存器的值，offset 是 EIP 寄存器的值。如果用 select]]></description><category></category></item><item><title><![CDATA[如何向 Linux Kernel 提交 Patch]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/69056230</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/69056230</guid><author>u010035971</author><pubDate>Tue, 04 Apr 2017 11:54:19 +0800</pubDate><description><![CDATA[昨晚终于向内核上游提交了人生中第一个 Patch，今天早上起床迫不及待的看手机，发现维护者 Andrew Morton 在6点31分回复我了：The
 patch has been added to the -mm tree. 顿时感到异常兴奋。虽然这个 Patch 没什么技术含量，但是至少这是我在看代码过程中自己发现的，终于体会到了进步的感觉。下面我把 Patch 提交的步骤记录一下，也供别人]]></description><category></category></item><item><title><![CDATA[如何向 Linux 内核上游提交 Patch ？]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/53957205</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/53957205</guid><author>u010035971</author><pubDate>Sat, 31 Dec 2016 17:22:56 +0800</pubDate><description><![CDATA[在GitHub上有本内核电子书叫《Linux Inside》，虽然完成度不高但还是很火的，它还有了自己的中文版翻译项目，我也参与了该项目的翻译工作，以下内容即为该书第 13.3 节的翻译版，主要讲解了怎么修改内核、生成 Patch 并提交给上游。]]></description><category></category></item><item><title><![CDATA[内核菜鸟的成长之路]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/53957042</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/53957042</guid><author>u010035971</author><pubDate>Sat, 31 Dec 2016 17:06:50 +0800</pubDate><description><![CDATA[好几个月没更新博客了，因为我这一段时间一直在潜心研究 Linux 2.6.24 内核源代码，重点学习内存管理子系统，内核这东西太过庞大，一时半会儿研究不出什么成果，所以更新博客的速度就慢了。市面上的内核书籍虽然都是好书，但是总有一些地方一本书讲不明白，要好几本书交叉着看才行。期间遇到难题是常有的事儿，尤其是涉及到复杂数据结构的地方。]]></description><category></category></item><item><title><![CDATA[使用bochs和gdb联合调试Linux内核]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50898353</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50898353</guid><author>u010035971</author><pubDate>Tue, 15 Mar 2016 17:37:34 +0800</pubDate><description><![CDATA[bochs这个软件准确来说应该叫做“模拟器”，而不是虚拟机，因为VMware等虚拟机是将Guest系统所有的指令都放到真实硬件上执行，而bochs模拟器则是直接用软件模拟硬件的执行，举个例子，在bochs里你可以自定义CPU指令并在汇编里使用，这一条足以说明bochs是多么强大，实在是操作系统开发者首选的利器。
bochs安装

上一篇博文讲了DDD的安装，这一篇博文先将讲bochs的安装，]]></description><category></category></item><item><title><![CDATA[宇宙最强调试器DDD（Data Display Debugger）]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50883824</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50883824</guid><author>u010035971</author><pubDate>Mon, 14 Mar 2016 09:38:14 +0800</pubDate><description><![CDATA[Linux主流调试器是gdb，但它是纯命令行界面的，调试起来不方便，我需要更强大的力量。在试用了各种工具之后，我相信我找到了，是的没错，就是它——宇宙最强调试器——DDD。

DDD介绍

DDD全称Data Display Debugger，当我第一次见到它时，它的界面着实让我吃了一惊，如此的简陋，如此的怪异，我甚至想立刻删了它，但是当我见识到它强大的功能时，我被深深的震撼了，如此的飘逸]]></description><category></category></item><item><title><![CDATA[使用bochs运行Linux Kernel-2.4.0]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50864331</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50864331</guid><author>u010035971</author><pubDate>Sat, 12 Mar 2016 10:52:09 +0800</pubDate><description><![CDATA[上一篇博文讲了如何制作bochs硬盘镜像并且将grub装进去，这样我们可以在启动bochs后进入到grub界面。
这篇博文我们将2.4内核写入硬盘镜像，这就可以使用bochs直接启动内核了。
我的实验系统是这么布置的：CentOS 6.4 VMware虚拟机上修改代码和配置文件，用git做版本管理，同时还开着另一台虚拟机RedHat Linux 7.3，专门用来编译内核代码，毕竟2.4内核很老]]></description><category></category></item><item><title><![CDATA[使用bochs和grub建立可引导硬盘镜像]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50855114</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50855114</guid><author>u010035971</author><pubDate>Fri, 11 Mar 2016 12:45:16 +0800</pubDate><description><![CDATA[bochs，发音同box，是我非常喜欢的虚拟机，灵活易用方便配置，功能极强，用来调试Linux内核是非常合适的。这篇博文主要讲解如何建立硬盘镜像，并且将grub安装上去，最后的结果就是bochs启动后能进入到grub引导界面。下一篇博客再讲解如何在镜像上安装Linux内核。

硬盘基础知识

硬盘的专业术语中有：柱面，磁头，扇区，每磁道扇区数这几个概念。

每个盘片有两个磁头，分别位于]]></description><category></category></item><item><title><![CDATA[Kernel 2.4.0 之 head.S 为何用两次 jmp 刷新 EIP 寄存器]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50821770</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50821770</guid><author>u010035971</author><pubDate>Mon, 07 Mar 2016 19:36:43 +0800</pubDate><description><![CDATA[movl %eax,%cr0 /* ..and set paging (PG) bit */ jmp 1f /* flush the prefetch-queue */1: movl $1f,%eax jmp *%eax /* make sure eip is relocated */1:在head.S中，这里为什么要连续 jmp 两次？ 下面就是我的分析过程。]]></description><category></category></item><item><title><![CDATA[华为荣耀3C彻底root的方法]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50595688</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50595688</guid><author>u010035971</author><pubDate>Wed, 27 Jan 2016 17:26:10 +0800</pubDate><description><![CDATA[首先你要用任意一款一键root软件将手机root掉，现在的root工具都很容易在一分钟之内搞定。

但是这样的root都不彻底，你无法修改很多系统文件，比如/system/build.prop，想修改机型信息的话你必须修改这个文件，但是你会发现即使你root了手机，这个文件改了还是会自动变回去，这就是因为你的root不彻底。

下面就是彻底root的方法。
1，首先用百度一键root或者]]></description><category></category></item><item><title><![CDATA[Linux 2.6、4.3内核编译过程的感受与总结]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50576282</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50576282</guid><author>u010035971</author><pubDate>Mon, 25 Jan 2016 00:05:51 +0800</pubDate><description><![CDATA[之前编译过2.4.10的内核，很好编译，中间曾经漏下了SCSI low-level drivers下的BusLogic SCSI support选项导致没法启动系统，后来打开该选项后就行了，随手关闭一些没用的选项后编译速度非常快，30秒之内完成编译。当初以为内核编译也不过如此，直到这四天开始编译更新的内核才让我吃了大亏。

我起初的想法是编译一个极其简洁的内核，去掉网络、USB、光驱、等等所有]]></description><category></category></item><item><title><![CDATA[Ghost 博客系统终极安装教程，装不上来打我！]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/50488891</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/50488891</guid><author>u010035971</author><pubDate>Sat, 09 Jan 2016 18:05:37 +0800</pubDate><description><![CDATA[Ghost这个博客系统可真是难装，第一次装放弃了，转而用的JustWriting，但是这个系统也太精简了。。。第二次找到了一篇Ghost安装参考教程，结合官网文档略加修改成功安装。

官方文档建议使用nginx转发80端口请求，为什么不直接让ghost使用80端口呢，因为ghost需要运行在root权限上，为了避免风险，就用nginx转发一下。但是这存在一个问题，我的服务器上本来就有Apach]]></description><category></category></item><item><title><![CDATA[Linux 0.12内核与现代内核在内存管理上的区别]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/49276285</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/49276285</guid><author>u010035971</author><pubDate>Tue, 20 Oct 2015 13:40:48 +0800</pubDate><description><![CDATA[0.12内核的内存管理比较简单粗暴，内核只用了一个页目录，只能映射4G的线性空间，所以每个进程的虚拟空间（逻辑空间）只能给到64M，最多64个进程；每个进程都有对应的任务号nr，当一个进程需要分配进程空间时，只需要nr乘以64M就可以得出该进程空间的线性起始地址。然后该进程的代码段、数据段描述符里面的基址字段会被设定为（nr x 64M），同时可以为进程分配页目录项和页目录表用以承载映射关系。
]]></description><category></category></item><item><title><![CDATA[Linux下C语言图形化调试工具RedHat Insight，极致调试体验！]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/48339703</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/48339703</guid><author>u010035971</author><pubDate>Thu, 10 Sep 2015 10:34:09 +0800</pubDate><description><![CDATA[很多人不习惯GDB命令行的调试方式，尤其是使用过Eclipse、VS2010、CodeBlocks那种鼠标悬浮显示变量值的功能之后，感觉真是太方便了。再一对比GDB要用命令才能显示变量值，想看源码还要用list命令，对于那种调了半天还是不见BUG在哪的情况，简直是日了狗了。


我曾尝试过各种图形化调试工具，gdb -tui不好用，除了加了个显示代码的框之外没有什么新功能。DDD这玩意儿还可]]></description><category></category></item><item><title><![CDATA[学生组建开源社区的困境与危机]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/47445199</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/47445199</guid><author>u010035971</author><pubDate>Wed, 12 Aug 2015 15:19:24 +0800</pubDate><description><![CDATA[很多大学都有一批喜欢技术的学生，很多人聚起来想组建开源社区，这是好事，但是事情的发展远没有那么顺利。


开源社区听起来似乎很好组建，只要召集一票人马，大家加个QQ群，这就算初步组建成功了。以后再建个论坛网站什么的，心血来潮再去Github上传几个个人开发的小项目，这就算是正式成立了。

但是创业容易守业难，开源社区是以贡献作为话语权的标准，学生社区在这点上很难做到，或者说很容易走偏。基]]></description><category></category></item><item><title><![CDATA[Java调用 新浪微博API 接口发微博，逐条讲解，绝对清晰]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/46236609</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/46236609</guid><author>u010035971</author><pubDate>Fri, 29 May 2015 15:34:39 +0800</pubDate><description><![CDATA[最近要做个课程设计，使用微博控制树莓派，树莓派再控制发光二极管的亮和灭，主要设计分两层，上层是用Java调用新浪微博API来实现对微博旳监听，当我的微博被回复时能够自动读取评论内容，并根据评论的指令内容来决定树莓派的控制动作。下层是用C语言调用操作系统底层接口来实现用树莓派GPIO接口控制发光二极管的闪烁、亮灭。
由于网上教程都很老了，最近微博接口发生了很多变化，所以我决定全新写一篇详细的博文，]]></description><category></category></item><item><title><![CDATA[C语言extern引用AT&T汇编中的变量，任意转换类型]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/45116881</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/45116881</guid><author>u010035971</author><pubDate>Sat, 18 Apr 2015 21:49:03 +0800</pubDate><description><![CDATA[今天研究出了一个小问题，在C语言里引用汇编的变量，会是什么结果，汇编中的变量没有像C语言中int类型那样的类型约束，可以把数据当作任何类型处理，那么传到C语言中我们应该当作什么类型处理呢。

换句话说，在汇编里定义变量var，在C语言里引用，我们肯定要用extern声明var外部变量，那么extern后面接什么类型？难道是extern int var么？还是 extern short var]]></description><category></category></item><item><title><![CDATA[Linux tty字符终端下VIM显示混乱的解决方法]]></title><link>https://blog.youkuaiyun.com/u010035971/article/details/44778487</link><guid>https://blog.youkuaiyun.com/u010035971/article/details/44778487</guid><author>u010035971</author><pubDate>Tue, 31 Mar 2015 13:42:49 +0800</pubDate><description><![CDATA[前几天自己配好了vim作为C语言开发环境，加了几个插件，语法高亮、字体大小都改了改，在gvim下用着很舒服，在图形界面的终端窗口下使用vim也是很舒服，但是偶然发现到了tty虚拟终端下就挂了。比如我写个代码：




这个看着很爽，代码自动提示什么的都有。然后我保存这个文件，拿到字符终端打开：








就这样了，敲几下键盘全是混乱的字符。

后来经过排查发现]]></description><category></category></item></channel></rss>