说说 linux 小技巧

Linux技巧
原贴:

说说 linux 小技巧

好久都没说过技巧类的东西了,放一放

mount:
装载一个硬盘备份,第1个分区
sudo mount win98.img /mnt/test1 -o loop,offset=32256 -t vfat
nrg装载
sudo mount -o loop,offset=307200 image.nrg /mnt
转换nrg-iso
dd bs=1k if=image.nrg of=image.iso skip=300
# ISO
mount -t iso9660 -o loop,user file.iso /path/mount_directory

# MDF
mount imagen.mdf /path/mount_directory -o loop=/dev/loop0
#fcicq注:mdf的文件格式是udf

如果失败,一共2步.
# bin2iso alcohol.cue -c alcohol.mdf
# bin2iso alcohol.cue
(这样得到的mdf就是真正可以mount的)

也可使用mdf2iso.

# NRG
mount -o loop,offset=307200 imagen.nrg /path/mount_directory

转换使用nrg2iso和mdf2iso.

32256是怎么算出来的?63*512
63是怎么看出来的?fdisk -l xxxx.img

wget的众多参数,利用好后比什么file_get_contents,stream,fsockopen都好使
至少你应该记住wget是认识http header的.

wine>kqemu>qemu,玩wine的时候不开fcitx

小心你的USE,尽量少用 -

gentoo觉悟表现:不用~x86
尽量少用emerge world,看见哪个包该升就升吧.

多用sudo,少用su

lftp,ftp都要装,前者负责批量上传,后者负责少量文件

不要小看busybox,能省不少事:甚至监测rootkit都可用(ls,lsmod不可信)
nc等东西也在里面找,免得再编译(nc据称有传文件的功效,甚至可用tar)

核心编译模块尽量多记住些模块名,然后 sudo modprobe xxx(usb-storage等)

跨平台编译不要忘了crossdev

PORTDIR=/var/portage
/var 单独分区有利于加速(注意修正/etc/make.profile链接!)

Tags: howto
Bookmark on del.icio.us

友情提示: 评论在文章中所占比例虽然不大, 但它们是文章重要的组成部分.
今天如果你不收藏,明天文章就可能找不到了.

订阅 (By feedsky) (By feedburner)

3 Comments »

  1. charlee said,

    December 3, 2006 @ 00:34:21

    nrg转iso的那个太绝了。没想到原来nrg的格式是这样的……

  2. foxcamel said,

    December 4, 2006 @ 09:44:11

    基本…….不懂

    那个 新模版不错,icon也不错,偶也考虑修改一下用简洁的模版,偶模版需要改动的地方太多了

  3. guoshuang said,

    September 17, 2007 @ 11:46:09

    很多不太懂,但很有趣

· TrackBack URI

Leave a Comment

欢迎评论,拒绝潜水.如果你非要潜水的话偶也没办法,
本来评论就不多,你再不说话,偶日后也就变哑巴了 :) ... 回首页

评论请保持与文章的相关性, 内容支持基本 HTML 语法, 不支持 UBB.
贴代码的同学请把 < > 分别替换为 &lt; &gt; 以增强可读性.

 
<think>嗯,用户之前已经问过如何学习Linux内核,现在他们又发了一个“请详细说说”。我需要先理解他们到底想要什么更详细的内容。可能用户觉得之前的回答虽然系统,但某些部分不够深入,或者他们想针对某个具体方向展开。 首先,回顾之前的回答,已经涵盖了学习路径、工具、资源、实践建议等方面。用户现在可能希望更详细的指导,例如某个子系统的深入分析,或者具体的学习方法步骤。也有可能用户对某个提到的工具或技术感兴趣,比如ftrace、QEMU调试,或者内核源码阅读的具体技巧。 接下来,我需要考虑用户可能的背景。他们可能刚开始接触内核,或者有一定基础想深入。由于之前的回答是入门到进阶的路径,现在用户可能需要更进阶的内容,或者具体实例。比如如何实际调试一个内核模块,或者如何参与社区贡献。 还要注意用户可能没有明确说明具体方向,所以需要给出一个结构化的详细扩展,覆盖各个主要方面,同时保持条理清晰。可能需要分模块详细讲解,例如深入某个子系统,或者详细说明调试工具的使用步骤。 另外,用户可能希望更多的实际操作示例,比如代码片段、具体命令的使用案例,或者如何分析内核日志。这样可以帮助他们动手实践,加深理解。 最后,需要确保回答保持专业性,同时易于理解。避免过于晦涩的技术术语,但也要准确。可能需要补充一些学习资源,如推荐的具体在线课程、实验室项目,或者社区资源,帮助用户找到进一步学习的途径。</think>以下是针对 Linux 内核学习的深度扩展指南,将从源码结构到实战调试进行系统性拆解: --- ### 一、内核源码架构解析(以 Linux 6.6 为例) ```bash linux/ ├── arch/ # 体系结构相关代码 │ └── x86/ # 重点学习x86实现 ├── drivers/ # 设备驱动(占代码量60%) ├── fs/ # 文件系统 │ ├── ext4/ # 典型文件系统实现 │ └── proc/ # 虚拟文件系统案例 ├── include/ # 头文件(核心API定义) ├── init/ # 启动初始化流程 ├── kernel/ # 核心子系统 │ ├── sched/ # 进程调度器 │ └── irq/ # 中断处理 ├── mm/ # 内存管理 │ ├── slab.c # 内存分配器核心 │ └── page_alloc.c └── net/ # 网络协议栈 ``` ### 二、关键机制深度剖析 #### 1. 进程调度(CFS 完全公平调度器) ```c // kernel/sched/fair.c struct sched_entity { struct load_weight load; // 进程权重 u64 exec_start; // 开始执行时间 u64 sum_exec_runtime; // 累计运行时间 /* 虚拟时间计算:vruntime = delta_exec * NICE_0_LOAD / weight */ }; ``` - **核心算法**:通过`vruntime`实现时间片动态分配,使用红黑树管理可运行进程 - 实验:`echo FIFO > /sys/kernel/debug/tracing/current_tracer` 观察实时进程调度 #### 2. 内存管理(Buddy + Slab 分配器) ```c // mm/page_alloc.c struct zone { unsigned long free_area[MAX_ORDER]; // 伙伴系统空闲列表 struct per_cpu_pages __percpu *pageset; // per-CPU页缓存 }; // mm/slab.c struct kmem_cache { unsigned int size; // 对象实际大小 unsigned int align; // 对齐要求 void (*ctor)(void *); // 构造函数 }; ``` - **实战调试**:通过`/proc/buddyinfo`查看内存碎片情况,使用`slabtop`监控内核对象分配 #### 3. 中断处理流程 ```c // arch/x86/kernel/irq.c irqreturn_t handle_irq_event_percpu(struct irq_desc *desc) { struct irqaction *action = desc->action; while (action) { res = action->handler(irq, action->dev_id); // 调用注册的中断处理函数 action = action->next; } } ``` - **调试技巧**:`cat /proc/interrupts`查看中断分布,使用`request_irq()`编写中断处理模块 ### 三、进阶调试方法论 #### 1. 内核Oops分析(以页错误为例) ``` [ 1234.567890] BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 [ 1234.567893] IP: [<ffffffff81234567>] my_module_func+0x12/0x30 [faulty] ``` 分析步骤: 1. 使用`objdump -dS faulty.ko`反汇编模块 2. 计算崩溃地址:`0xffffffff81234567 - _stext(通过System.map获取)` 3. 结合`addr2line`定位源码位置 #### 2. Livepatch热补丁开发 ```c // 使用klp框架 static struct klp_func funcs[] = { { .old_name = "orig_func", .new_func = patched_func, }, { } }; static struct klp_object objs[] = { { .funcs = funcs, .name = "target_module", }, { } }; ``` - 应用场景:无需重启修复CVE漏洞 ### 四、性能优化实战 #### 1. 锁竞争分析 ```bash # 检测自旋锁争用 $ perf lock record -g -- <command> $ perf lock report # 输出示例: Name acquired contended avg wait (ns) &rq->lock 1256789 34567 1200 &fs->lock 893456 2345 800 ``` 优化策略:采用RCU机制替换读写锁,使用per-CPU变量减少竞争 #### 2. 内存泄漏检测 ```bash # 启用kmemleak $ echo scan > /sys/kernel/debug/kmemleak $ cat /sys/kernel/debug/kmemleak # 典型输出: unreferenced object 0xffff88807f234500 (size 1024): comm "test_prog", pid 1234, jiffies 4294901234 backtrace: [<ffffffff81234567>] kmem_cache_alloc+0x117/0x200 [<ffffffffa0123456>] leak_func+0x45/0x60 [faulty_module] ``` ### 五、推荐学习路线图 ```mermaid graph TD A[基础能力] --> B[环境搭建] A --> C[C语言强化] A --> D[计算机体系结构] B --> E[内核编译] C --> F[指针/内存操作] D --> G[x86保护模式] E --> H[模块开发] F --> H G --> H H --> I[子系统研究] I --> J[进程调度] I --> K[内存管理] I --> L[文件系统] J --> M[CFS调度器] K --> N[页表/交换] L --> O[VFS抽象] M --> P[性能调优] N --> P O --> P P --> Q[内核贡献] ``` ### 六、实验室级实践项目 1. **实现自定义调度类** - 继承`struct sched_class` - 实现`enqueue_task`/`dequeue_task`等方法 - 通过`SCHED_DEBUG`验证调度行为 2. **构建最小化内核** ```bash # 使用BusyBox制作initramfs $ mkdir -pv rootfs/{bin,sbin,etc,proc,sys} $ cp /path/to/busybox rootfs/bin/ $ ln -s bin/busybox rootfs/init $ find . | cpio -o -H newc | gzip > ../initramfs.gz ``` - 启动参数:`qemu-system-x86_64 -kernel bzImage -initrd initramfs.gz -append "console=ttyS0"` 3. **安全攻防实验** - 利用ROP劫持内核执行流 - 实践KASLR/SMEP/SMAP防护机制 - 编写LKM实现hook系统调用 ### 七、社区协作指南 1. **代码提交流程** ```bash # 典型补丁生成方式 $ git format-patch -v2 -s --cover-letter -o outgoing/ origin/master # 使用checkpatch.pl检查规范 $ ./scripts/checkpatch.pl 0001-my-patch.patch ``` 2. **邮件列表礼仪** - 使用纯文本格式,避免HTML - 邮件标题前缀:[PATCH v3] subsystem: brief description - 使用`--in-reply-to`保持讨论线程 ### 八、辅助学习工具链 1. **源码可视化工具** - Eclipse + CDT + LTTng插件 - Understand(商业软件)的调用关系图 2. **自动化测试框架** ```bash # KUnit测试示例 #include <kunit/test.h> static void test_case(struct kunit *test) { KUNIT_EXPECT_EQ(test, 1+1, 2); } static struct kunit_case cases[] = { KUNIT_CASE(test_case), {} }; static struct kunit_suite suite = { .name = "demo_test", .test_cases = cases, }; kunit_test_suite(suite); ``` 建议每天投入至少2小时进行: - 30分钟阅读Documentation/目录文档 - 45分钟分析特定子系统代码 - 30分钟实践调试工具 - 15分钟跟踪LKML最新动态 通过`git blame`研究关键代码的演进历史,例如查看`torvalds/linux`仓库中`mm/page_alloc.c`的修改记录,理解内存分配算法的优化历程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值