设计静态库源码 mylib1.c和 mylib2.c

静态库源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
huzhifeng@ubuntu1404srv:~$ mkdir -p mylib
huzhifeng@ubuntu1404srv:~$ cd mylib/
huzhifeng@ubuntu1404srv:~/mylib$ touch mylib1.c
huzhifeng@ubuntu1404srv:~/mylib$ touch mylib2.c
huzhifeng@ubuntu1404srv:~/mylib$ cat mylib1.c
void myprint1()
{
printf("huzhifeng test %s,%s,%d\n", __FILE__, __FUNCTION__, __LINE__);
}
huzhifeng@ubuntu1404srv:~/mylib$ cat mylib2.c
void myprint2()
{
printf("huzhifeng test %s,%s,%d\n", __FILE__, __FUNCTION__, __LINE__);
}
huzhifeng@ubuntu1404srv:~/mylib$

编译静态库

把静态库源码编译成.o文件

1
2
3
4
5
6
7
8
9
10
11
12
huzhifeng@ubuntu1404srv:~/mylib$ gcc -c mylib1.c mylib2.c
mylib1.c: In function ‘myprint1’:
mylib1.c:3:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
printf("huzhifeng test %s,%s,%d\n", __FILE__, __FUNCTION__, __LINE__);
^
mylib2.c: In function ‘myprint2’:
mylib2.c:3:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
printf("huzhifeng test %s,%s,%d\n", __FILE__, __FUNCTION__, __LINE__);
^
huzhifeng@ubuntu1404srv:~/mylib$ ls
main.c mylib1.c mylib1.o mylib2.c mylib2.o
huzhifeng@ubuntu1404srv:~/mylib$

阅读全文 »

Oops概述

什么是Oops?从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说”Oops”,翻译成中国话就叫做“哎呦”。“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”。看,Oops就是这个意思。
在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux。当某些比较致命的问题时(比如访问非法地址)打印出来的信息被称为 Oops 信息。我们的Linux内核也会抱歉的对我们说:“哎呦(Oops),对不起,我把事情搞砸了”。Linux内核在发生kernel panic时会打印出Oops信息,把目前的寄存器状态、堆栈内容、以及完整的Call trace都show给我们看,这样就可以帮助我们定位错误。

Oops格式

Oops 信息包含以下几部分内容。

  1. 一段文本描述信息。
    比如类似Unable to handle kernel NULL pointer dereference at virtual address 00000000
    的信息,它说明了发生的是哪类错误。
  2. Oops 信息的序号。
    比如是第 1 次、第 2 次等。这些信息与下面类似,中括号内的数据表示序号。
    Internal error: Oops: 805 [#1]
  3. 内核中加载的模块名称,也可能没有,以下面字样开头。
    Modules linked in:
  4. 发生错误的 CPU 的序号,对于单处理器的系统,序号为 0,比如:
    CPU: 0
    Not tainted (2.6.22.6 #36)
  5. 发生错误时 CPU 的各个寄存器值。
  6. 当前进程的名字及进程 ID,比如:
    Process swapper (pid: 1, stack limit = 0xc0480258)
    这并不是说发生错误的是这个进程,而是表示发生错误时,当前进程是它。错误可能发生在内核代码、驱动程序,也可能就是这个进程的错误。
  7. 栈信息。
  8. 栈回溯信息,可以从中看出函数调用关系,形式如下:
    Backtrace: [<c001a6f4>] (s3c2410fb_probe+0x0/0x560) from [<c01bf4e8>] (platform_drv_ probe+0x20/0x24)
  9. 出错指令附近的指令的机器码,比如(出错指令在小括号里)
    Code: e24cb004 e24dd010 e59f34e0 e3a07000 (e5873000)
  10. 可以通过以下几个寄存器来判断:
    epc 挂在哪个函数里
    ra 函数的返回地址,
    Cause 通过这个寄存器可以分析是什么类型的异常.
阅读全文 »

开发环境

Ubuntu 12.04.5 x86
内核版本3.13.0

1
2
3
huzhifeng@Ubuntu12:~$ uname -a
Linux Ubuntu12 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:50:54 UTC 2014 i686 i686 i386 GNU/Linux
huzhifeng@Ubuntu12:~$

实现细节

下载源码

1
2
3
4
huzhifeng@Ubuntu12:~$ mkdir -p genl
huzhifeng@Ubuntu12:~$ cd genl/
huzhifeng@Ubuntu12:~/genl$ wget http://people.ee.ethz.ch/~arkeller/linux/code/gnUser.c
huzhifeng@Ubuntu12:~/genl$ wget http://people.ee.ethz.ch/~arkeller/linux/code/gnKernel_anurag_chugh.c

添加Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
huzhifeng@Ubuntu12:~/genl$ touch Makefile
huzhifeng@Ubuntu12:~/genl$ cat Makefile
obj-m += gnKernel_anurag_chugh.o
KDIR := /lib/modules/$(shell uname -r)/build
all: kernel user
kernel:
make -C $(KDIR) M=$(shell pwd) modules
user:
gcc -Wall -o gnUser gnUser.c
clean:
make -C $(KDIR) M=$(shell pwd) clean
rm -f *odule* gnUser a.out
huzhifeng@Ubuntu12:~/genl$
阅读全文 »

详细步骤

一、下载

打开网页Index of /barrier_breaker/14.07/x86/generic/

下载openwrt-x86-generic-combined-ext4.img.gz

二、解压(Attitude Adjustment 12.09版本可选)

在OpenWrt Attitude Adjustment 12.09版本中,已经提供了vdivmdk 文件,如下图:

但是OpenWrt Barrier-Breaker 14.07版本没有提供,需要执行如下命令将压缩文件解压得到以.img结尾的文件

1
gunzip -d openwrt-x86-generic-combined-ext4.img.gz

我的Windows 7下没有gunzip命令,所以我是把openwrt-x86-generic-combined-ext4.img.gz拷贝到Ubuntu 14.04.1里执行gunzip命令的,
然后把生成的openwrt-x86-generic-combined-ext4.img文件再拷贝回Windows 7系统。

阅读全文 »

查看现有的例子

系统中已经有很多现成的例子位于目录package/kernel

1
2
3
4
5
6
7
8
9
10
11
12
huzhifeng@Ubuntu1404:~$ cd ~/git/openwrt/
huzhifeng@Ubuntu1404:~/git/openwrt$
huzhifeng@Ubuntu1404:~/git/openwrt$ ls package/
base-files boot devel feeds firmware kernel libs Makefile network system utils
huzhifeng@Ubuntu1404:~/git/openwrt$
huzhifeng@Ubuntu1404:~/git/openwrt$ cd package/kernel/
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$ ls
acx-mac80211 brcm2708-gpu-fw ep80579-drivers hostap-driver linux om-watchdog spi-gpio-custom w1-gpio-custom
ar7-atm broadcom-wl gpio-button-hotplug i2c-gpio-custom mac80211 rotary-gpio-custom spi-ks8995 wrt55agv2-spidevs
avila-wdt button-hotplug hello-kmod lantiq mmc_over_gpio rtc-rv5c386a trelay
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$

最简单的如avila-wdt

1
2
3
4
5
6
7
8
9
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$ tree avila-wdt/
avila-wdt/
├── Makefile
└── src
├── avila-wdt.c
└── Makefile
1 directory, 3 files
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$

完整点的如button-hotplug

1
2
3
4
5
6
7
8
9
10
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$ tree button-hotplug/
button-hotplug/
├── Makefile
└── src
├── button-hotplug.c
├── Kconfig
└── Makefile
1 directory, 4 files
huzhifeng@Ubuntu1404:~/git/openwrt/package/kernel$

阅读全文 »

youtube-dl介绍

官网
youtube-dl
源代码
youtube-dl@Github
youtube-dl是一个使用python编写的脚本,可以下载热门视频网站的视频。
在Linux系统下可以一键下载Youtube、Youku、Tudou等热门网站的视频,甚至是一些XXX网站的视频下载,如YouPorn、XVideos等。

youtube-dl@Linux

安装

1
2
3
4
5
6
7
8
9
10
11
[root@huzhifeng ~]# curl https://yt-dl.org/latest/youtube-dl -o /usr/local/bin/youtube-dl
[root@huzhifeng ~]# curl -x http://127.0.0.1:1080 https://yt-dl.org/latest/youtube-dl -o /usr/local/bin/youtube-dl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 738k 100 738k 0 0 153k 0 0:00:04 0:00:04 --:--:-- 277k
[root@huzhifeng ~]#
[root@huzhifeng ~]# chmod +x /usr/local/bin/youtube-dl
[root@huzhifeng ~]# youtube-dl --version
2016.12.20
[root@huzhifeng ~]# alias yd="youtube-dl --proxy http://127.0.0.1:1080"
[root@huzhifeng ~]# echo 'alias yd="youtube-dl --proxy http://127.0.0.1:1080"' >> /home/huzhifeng/.bashrc

单个下载

1
2
3
4
5
6
7
8
9
[root@huzhifeng ~]# youtube-dl https://www.youtube.com/watch?v=4XpnKHJAok8
[youtube] 4XpnKHJAok8: Downloading webpage
[youtube] 4XpnKHJAok8: Extracting video information
[youtube] 4XpnKHJAok8: Downloading DASH manifest
[download] Destination: Tech Talk - Linus Torvalds on git-4XpnKHJAok8.mp4
[download] 100% of 169.24MiB in 00:05
[root@huzhifeng ~]# ls -l "Tech Talk - Linus Torvalds on git-4XpnKHJAok8.mp4"
-rw-r--r-- 1 root root 177462108 Mar 8 2014 Tech Talk - Linus Torvalds on git-4XpnKHJAok8.mp4
[root@huzhifeng ~]#
阅读全文 »

引子

2013年四月初第一次在Godaddy注册了个人域名huzhifeng.com, 用支付宝缴了两年费用,现在临近到期,发现续费太贵了,年费上100了,续费优惠码也找不到能用的。所以考虑转移,刚好看到Namecheap有在搞活动,只需要$3.98美元[需要使用优惠码NC15MYDD],而且还免费送隐私保护。
MoveYourDomainDay
MOVE YOUR DOMAIN DAY

第零步: 注册Namecheap帐号

此处省略

阅读全文 »

需求描述

TP-Link路由器
当前硬件版本: TL-R478+ v5.0
当前软件版本: 5.1.1 Build 20130109 Rel.69995s

现在想要把路由器的所有页面都保存下来,其实已经能够串口或者SSH登录到路由器下拷贝所有静态资源,但涉及到cgi程序,大部分页面都无法正常打开。而浏览器一个一个打开再保存又嫌繁琐,所以想有没有傻瓜化一点的。

解决方案

能想到的方案有如下三种:
一、 浏览器一个一个打开再保存,缺点有:TP-LINK的网页使用Frame结构,而且CSS/JS等资源保存不便
二、 Fiddler Script自动保存
三、 Scrapy自动爬虫
暂时先实现第二种方案,第三种后续考虑

实现细节

Fiddler安装

Fiddler 4
主安装程序:
fiddler4setup.exe
Fiddler 4依赖的.Net Frame 4,需要安装才能启动Fiddler
dotNetFx40_Full_x86_x64.exe
Fiddler Script安装程序,安装后会在目录C:\Users\huzhifeng\Documents\Fiddler2\Scripts\下创建CustomRules.js
其实就是从安装目录C:\Program Files (x86)\Fiddler2\Scripts\SampleRules.js拷贝一份到C:\Users\huzhifeng\Documents\Fiddler2\Scripts\CustomRules.js
fiddlersyntaxsetup.exe

阅读全文 »

本文档只是阅读笔记
强烈推荐阅读官网Init Scripts

Example 脚本

在目录/etc/init.d/下创建测试脚本example,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@OpenWrt:/# vi /etc/init.d/example
root@OpenWrt:/# cat /etc/init.d/example
#!/bin/sh /etc/rc.common
# Example script
# Copyright (C) 2007 OpenWrt.org
START=10
STOP=15
start() {
echo "Example script start"
# commands to launch application
}
stop() {
echo "Example script stop"
# commands to kill application
}
root@OpenWrt:/#

START=10指定该脚本在系统启动的执行顺序
STOP=15指定该脚本在系统关闭时的执行顺序
如果多个脚本有相同的值,则按字典顺序来决定执行顺序

注意:第一行用的了一个特殊的脚本/etc/rc.common,该文件包含了一些通用的变量函数,目录/etc/init.d/下的每个脚本第一行都包含此文件。

阅读全文 »