Linux中console初始化流程

本文详细解析了Linux系统中console初始化的过程,从start_kernel函数到console_init函数,再到具体初始化代码的执行路径。通过分析源码,揭示了如何通过构建特定节来调用初始化函数。

Linux中console初始化流程

init/main.c文件

asmlinkage void __init start_kernel(void)

函数中调用

console_init()函数 (该函数位于driver/char/tty_io.c文件中)

 

/*

 * Initialize the console device. This is called *early*, so

 * we can't necessarily depend on lots of kernel help here.

 * Just do some early initializations, and do the complex setup

 * later.

 */

void __init console_init(void)

{

    initcall_t *call;

   

       /* Setup the default TTY line discipline. */

    tty_ldisc_begin();

 

    /*

     * set up the console device so that later boot sequences can

     * inform about problems etc..

     */

    call = __con_initcall_start;

    while (call < __con_initcall_end) {

        (*call)();

        call++;

    }

}

从上面的源码可以看出,这个函数设置默认的TTY线性规划,调用console的初始化代码。下面着重分析是如何调用console初始化代码的。

 

在arch/arm/kernel/vmlinux.lds文件中有

__con_initcall_start = .;

 *(.con_initcall.init)

__con_initcall_end = .;


源码是将虚拟地址 __con_initcall_start 赋值给指针call,然后去执行*(.con_initcall.init)

 

我的串口驱动里有这样的代码:

static int __init duart_console_init(void)

{

       register_console(&duart_console);

       return 0;

}

console_initcall(duart_console_init);

 

发现console_initcall是一个宏,定义在include/linux/init.h文件中

#define console_initcall(fn) \

    static initcall_t __initcall_##fn \

    __used __section(.con_initcall.init) = fn

 

将console_initcall(duart_console_init)宏展开得到

static initcall_t __initcall_duart_console_init \

__attribute_used __attribute__((__section__(.con_initcall.init))) = duart_console_init

 

这样就构建了一个.con_initcall.init节的指向初始化函数的指针,执行duart_console_init函数最终初始化console。

 

(若理解有误还请大侠指出)

 

 

 

 

 

 

 

 

 

 

 

 

<think>好的,用户问的是Linux初始化Gerrit配置流程。首先,我需要回忆一下Gerrit的基本安装和配置步骤。Gerrit通常需要Java环境,所以第一步应该是安装JDK。然后下载Gerrit的jar包,这一步可能需要用到wget或者curl。 接下来是初始化配置,用户可能不太清楚init命令的具体参数,需要详细说明。比如,指定git仓的位置,可能还要选择数据类型,比如H2或者MySQL。如果是生产环境,可能需要MySQL,所以可能需要指导用户如何配置数据连接。 然后是配置文件,用户可能需要知道如何修改gerrit.config和database.config,比如设置监听地址、认证方式等。这里需要注意权限问题,可能需要修改文件的权限或者属主。 启动Gerrit的时候,用户可能遇到问题,比如端口冲突或者权限不足,需要提醒检查日志文件。另外,用户可能想用反向代理,比如Nginx,这时候需要配置代理设置。 还有用户权限管理,创建管理员账号,这可能涉及到使用特定的命令或者通过Web界面操作。用户可能不太清楚如何创建第一个管理员,需要详细说明使用htpasswd或者LDAP的步骤。 可能还需要提到备份和恢复,虽然用户没直接问,但初始化流程中提到备份策略也是有用的。另外,用户可能想知道如何验证配置是否成功,比如通过访问Web界面或者使用git命令测试。 用户可能的背景是系统管理员或者开发人员,希望搭建代码审查平台。他们可能对Gerrit不太熟悉,所以步骤要详细,避免术语过多。深层需求可能是快速搭建一个可用的Gerrit环境,并确保安全性和可维护性。 相关问题方面,用户可能想知道如何配置数据、处理常见错误、设置反向代理、用户权限管理以及备份方法。这些都是初始化过程中可能遇到的问题,提前给出相关问题能帮助用户全面了解流程。</think>初始化Gerrit配置的完整流程如下: 1. **安装依赖环境** ```bash # 安装Java(推荐JDK 11+) sudo apt install openjdk-11-jdk -y # 安装Git sudo apt install git -y ``` 2. **下载并初始化Gerrit** ```bash # 下载最新版本 wget https://gerrit-releases.storage.googleapis.com/gerrit-3.6.0.war -O gerrit.war # 初始化配置(会创建git仓目录和配置文件) java -jar gerrit.war init -d review_site ``` 3. **配置数据连接**(生产环境建议使用MySQL/PostgreSQL) ```bash # 修改数据配置文件 nano review_site/etc/database.config ``` ```ini [database] type = mysql hostname = localhost database = gerritdb username = gerrit password = securepassword ``` 4. **配置Gerrit核心参数** ```bash nano review_site/etc/gerrit.config ``` ```ini [gerrit] basePath = git canonicalWebUrl = http://your-domain:8080/ [access "refs/heads/*"] read = group Administrators push = group Administrators ``` 5. **配置SSH密钥** ```bash # 生成SSH密钥对 ssh-keygen -t rsa -b 4096 -f review_site/etc/ssh_host_rsa_key ``` 6. **启动Gerrit服务** ```bash # 前台启动(测试用) java -jar gerrit.war daemon -d review_site --console-log # 或后台运行 nohup java -jar gerrit.war daemon -d review_site > gerrit.log 2>&1 & ``` 7. **初始化管理员账号** ```bash # 使用特定命令创建管理员账号(需SSH访问) ssh -p 29418 admin@localhost "gerrit create-account admin --full-name 'Admin User' --email admin@example.com" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值