谢谢,搞定~
cnblogs/csdn上的工程blog真的基本都是胡言乱语
就算是OIer blog还是有一堆不符合工程规范的垃圾代码发在blog上
毕竟竞赛快餐代码写多了其实有些工程问题是不会去考虑的(
orz收藏了等下有空再看(
但是它们在oi意义上还是有价值的呀(
啊对… 最权威的东西一定是官方的文档, 标准之类的. 至少在入门阶段这么相信就好…
(因为有些屑东西是真的是同人比官方还好的屑, 不过都非常小众就是了((((((
比如这些就蛮有用的(并不一定官方, 但这些是真的同人逼死官方了):
- MDN: https://developer.mozilla.org web开发的文档这里都有了
- open-std: https://open-std.org c++标准/草案, 不过建议搜索而非直接访问(
- cppreference: https://en.cppreference.com 大概算是比较好和全的c/c++文档
-
man 一个*NIX命令, 所有程序如果自带文档的话都可以man到了(
(恐男的话… info也可以, 不过似乎没有那么全… - stackoverflow (懒得打网址) 官方文档里不会有的"智障"问题都可以在这里找到()
但是也不要抱太高期望(((
alias man="info"
alias woman="info"
alias lgbt="info"
alias lgbtq="info"
alias lgbtqi="info"
alias lgbtqia="info"
alias lgbtqiap="info"
alias lgbtqiapk="info"
man的优点是好打((((
alias qwq=man
((((((
看起来还不错?
alias qaq="man"
alias这么用真的不会炸吗x
(反正zsh会x(((((((
试试这样
$ echo 'nya~' > girl
$ cat girl
nya~
我几乎每台 Linux 设备里都有这么个 girl
文件
alias wtf=man (
nyanya~
真·猫娘?(
唔… 改内核让/dev/girl
包含无限的"nya~"?((((((((((
什么嘛怎么又20%了((((((
锦心酱明显比senioria bb得多得多嘛… (小声((((((((((
草,这个可以有
怎么改
不知道, 源代码里没grep到/dev/zero的实现><
找到了找到了!(虽然不知道对不对(((
枯燥的翻代码过程...
drivers/char/mem.c
里:
938行(似乎几乎是最后了)有关于特殊设备的定义(senioria删了所有条件编译):
static const struct memdev {
// 省略
} devlist[] = {
[3] = { "null", 0666, &null_fops, 0 },
[5] = { "zero", 0666, &zero_fops, 0 },
[7] = { "full", 0666, &full_fops, 0 },
[8] = { "random", 0666, &random_fops, 0 },
[9] = { "urandom", 0666, &urandom_fops, 0 },
};
再往上一点, 920行, 就是对/dev/zero
的fops的定义:
static const struct file_operations zero_fops = {
.llseek = zero_lseek,
.write = write_zero,
.read_iter = read_iter_zero,
.write_iter = write_iter_zero,
.mmap = mmap_zero,
.get_unmapped_area = get_unmapped_area_zero,
#ifndef CONFIG_MMU
.mmap_capabilities = zero_mmap_capabilities,
#endif
};
write, seek之类的操作可以直接抄zero的(), 然后mmap的话, 涉及到一个shmem_zero_setup
函数, 它的定义在mm/shmem.c:4251
:(删了注释)
int shmem_zero_setup(struct vm_area_struct *vma)
{
struct file *file;
loff_t size = vma->vm_end - vma->vm_start;
file = shmem_kernel_file_setup("dev/zero", size, vma->vm_flags);
if (IS_ERR(file))
return PTR_ERR(file);
if (vma->vm_file)
fput(vma->vm_file);
vma->vm_file = file;
vma->vm_ops = &shmem_vm_ops;
if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
((vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK) <
(vma->vm_end & HPAGE_PMD_MASK)) {
khugepaged_enter(vma, vma->vm_flags);
}
return 0;
}
这里直接改一下名字就好, 大概(
diff了一下两个mmap的实现, 差别确实有点大… 但是既然我们这个文件是仿着/dev/zero
实现的(虽然其实大概更像/dev/random
(((), 照抄似乎也没问题(
然后重点是read, 709行有read的定义:
static ssize_t read_iter_zero(struct kiocb *iocb, struct iov_iter *iter)
{
size_t written = 0;
while (iov_iter_count(iter)) {
size_t chunk = iov_iter_count(iter), n;
if (chunk > PAGE_SIZE)
chunk = PAGE_SIZE; /* Just for latency reasons */
n = iov_iter_zero(chunk, iter);
if (!n && iov_iter_count(iter))
return written ? written : -EFAULT;
written += n;
if (signal_pending(current))
return written ? written : -ERESTARTSYS;
cond_resched();
}
return written;
}
比较重要的是那个iov_iter_zero
, 它的定义在lib/iov_iter.c:974
:
size_t iov_iter_zero(size_t bytes, struct iov_iter *i)
{
if (unlikely(iov_iter_is_pipe(i)))
return pipe_zero(bytes, i);
iterate_and_advance(i, bytes, v,
clear_user(v.iov_base, v.iov_len),
memzero_page(v.bv_page, v.bv_offset, v.bv_len),
memset(v.iov_base, 0, v.iov_len)
)
return bytes;
}
EXPORT_SYMBOL(iov_iter_zero);
然后发现用到了一个叫memzero_page
的函数, 它的定义是这样的:
static void memzero_page(struct page *page, size_t offset, size_t len)
{
char *addr = kmap_atomic(page);
memset(addr + offset, 0, len);
kunmap_atomic(addr);
}
总结一下就是, 感觉照着senioria这一串改一下就好, 然后最后的memgirl_page
大概可以这么实现:
static void memzero_page(struct page *page, size_t offset, size_t len)
{
char *addr = kmap_atomic(page);
static const char girlsay[] = "nya~";
static const int saylen = 4;
// memset在这里会有锅, senioria只会暴力塞><
for (char *pos = girlsay + (offset % saylen); len--; )
{
page[offset++] = *pos;
if (++pos == girlsay + saylen)
pos = girlsay;
}
kunmap_atomic(addr);
}
并没有测试过… ><(
诶91水了91个帖诶(大雾(((
以及最好不要在脱水菜板里水啦
写的挺入门的 语气有点像 Linus
求一个 zsh tutorial(逃
还有,考虑一下用 stdin 代替 标准输入 这样的?
export 好像是保留到当前 session 结束
其他的要改 rc 貌似
《C++ Primer》和《C++ Primer Plus》有哪些区别? - 知乎
可能还是信息提取能力重要吧 相比界外的 so ,
界内 csdn 等虽然零散碎片化其他什么的很多倒也还能看…
有毒归有毒……
直接改源码这太宏内核了